Können Sie über Gradle über die Befehlszeile auf einem Gerät bereitstellen?


89

Was die Frage wirklich sagt - können Sie Befehle direkt über die Befehlszeile an gradlew senden, um sie auf einem Gerät zu erstellen, zu verpacken und bereitzustellen?


1
gradle tasksist hilfreich, um die sofort einsatzbereiten Aufgaben zu sehen - einschließlich der Installation (aber nicht wie unten angegeben)
Dori

Befehlszeile ist nicht IDE-spezifisch, .ie würde auf diese Weise von Android Studio oder Eclipse-basierte IDE
funktionieren

gradlew installdebug in cmd - root Ordner sollte der Pfad sein
c49

Antworten:


97
$ gradle installDebug

Dadurch wird das Debug-Build-Apk auf das Gerät übertragen, Sie müssen die Anwendung jedoch manuell starten.


2
Wie unten wurde es in "gradle installDefaultFlavorDebug" umbenannt
durka42

2
@ durka42 Dies ist nur der Fall, wenn Sie Aromen verwenden
Mathijs Segers

3
Ich würde sagen ./gradlew iD anstelle von gradle iD
irudyak

1
Ist es möglich, diesen Befehl im installierten Gradle Plugin auf Eclipse auszuführen? Ich erhalte die folgende Fehlermeldung: Task 'installDebug' wurde im Root-Projekt 'blahblah' nicht gefunden.
Dr.jacky

75

Da Sie Gradle verwenden, können Sie einfach Ihre eigene Aufgabe in build.gradle hinzufügen

task appStart(type: Exec, dependsOn: 'installDebug') {
    // linux 
    commandLine 'adb', 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'

    // windows
    // commandLine 'cmd', '/c', 'adb', 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'      
}

Rufen Sie es dann in Ihrem Projektstamm auf

$ gradle appStart

Aktualisieren:

Wenn Sie verwenden applicationIdSuffix ".debug", fügen Sie nur.debug zur AppId hinzu , lassen Sie die Aktivität jedoch unberührt:

'com.example.debug/com.example.MyActivity'


1
Außerdem sollte der letzte Parameter 'com.your.packagename/.path.relative.to.your.packagename.MyActivity'anstelle von sein, 'com.example/.MyActivity'wenn sich Ihre Aktivität nicht im Stammverzeichnis Ihres Pakets befindet.
Licht

66

1. Projekt erstellen, generierte apk auf Gerät installieren

# at the root dir of project
$ gradle installDebug

2. Öffnen Sie die App auf dem Gerät

$ adb shell am start -n yourpackagename/.activityname

6
alias arun = "gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"
Dominic Bartl

Ich kann installDebug nicht in gradle auswählen. Es gibt keine geeignete Aufgabe. Wurde es umbenannt?
Jonas Gröger

1
@ JonasGröger es scheint umbenannt worden zu sein, umDefaultFlavorDebug
durka42

@rps_deepan Könnten Sie die Aufgabe umbenennen, weil sie umbenannt wurde?
Jonas Gröger

6
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity"#Läuft Schritt 2 Nur wenn Schritt 1 erfolgreich ist
Thamme Gowda

7

Einzeiliger Satz:

Projekt erstellen & generierte apk installieren & App auf Gerät öffnen

$ ./gradlew installDebug && adb shell am start -n com.example/.activities.MainActivity

7

Es gibt drei Befehle, um dies zu erreichen:

  1. ./gradlew assembleDebug #To build the project

  2. adb install -r ./app/build/outputs/apk/app-debug.apk #To install it to the device

  3. adb shell am start -n $PACKAGE/$PACKAGE.$ACTIVITY #To launch the application in the deviceDabei ist $ PACKAGE das Entwicklungspaket und $ ACTIVITY die zu startende Aktivität (die Launcher-Aktivität).

Ich habe ein Bash-Skript geschrieben, um dies zu tun , mit anderen wenigen Funktionen.


4

Eine flexiblere Möglichkeit ist die Verwendung von Affen:

task runDebug (type: Exec, dependsOn: 'installDebug') {
    commandLine android.getAdbExe().toString(), "shell",
        "monkey",
        "-p", "your.package.name.debugsuffix",
        "-c", "android.intent.category.LAUNCHER", "1"
}

Einige Vorteile dieser Methode:

  • getAdbExeerfordert nicht, dass adb auf dem Pfad ist und verwendet die adb-Version von dem SDK, auf das in verwiesen wird local.properties.
  • Mit dem monkeyTool können Sie eine Startabsicht senden, sodass Sie den Namen Ihrer Aktivität nicht kennen müssen.

Sie könnten stattdessen ausführenadb shell am start your.package.name.debugsuffix\.Activity
Vikram Bodicherla

Aber was ist, wenn Sie den Namen Ihrer Aktivität nicht kennen?
0xcaff

1
Dann sollten Sie die Build-Datei nicht schreiben.
Kevr

3
Ich denke, es ist eine wirklich schlechte Idee, wenn die Build-Datei explizit weiß, welche Aktivität ausgeführt werden soll. Es scheint, als würde etwas gegen die Trennung von Bedenken verstoßen. Ein einfacher Grund: Wenn Sie Ihre Aktivitätsdatei umbenennen / verschieben, ist jetzt eine Änderung der Build-Datei erforderlich. Außerdem scheinen Absichten eine bessere API zu sein, als eine Datei - ich könnte eine Gradle-Erweiterung schreiben, die Standardabsichten und -methoden hinzufügt, sie versioniert und niemals die Klassennamen anderer kennen muss. Harte Codierung ist niemals die richtige Antwort.
smaudet

1
Dieser Antwort fehlt auch eine Möglichkeit, das Root-Paket zu finden - ich möchte auch den Paketnamen entfernen - z. B. ihn stattdessen aus dem Manifest herausfinden.
Smaudet

3

Erstellen -> alte Version deinstallieren -> neue Version installieren -> Anwendung ausführen.

echo "Build application" && ./gradlew clean build && 
echo "Uninstall application" && adb uninstall [application package] && 
echo "Install application" && adb -d install app/build/outputs/apk/<build type>/[apk name].apk echo "Run application" && 
adb shell am start -n [application package]/.[application name]

Oder wenn Sie eine Anwendung im Debug-Typ installieren und ausführen möchten.

./gradlew installDebug && adb shell am start -n [application package]/.[application name]

Vielen Dank. @ Alexander-Polomodov
Goffity

2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}

Beste Lösung des Laufs
Orgatres

1

Ich habe diese Aufgabe geschrieben, um die Anwendung auf dem Gerät installieren und auch öffnen zu können. Da ich mehrere buildTypesund flavorsmit unterschiedlichen Anwendungs-IDs hatte, war es nicht möglich, den Paketnamen fest zu codieren. Also habe ich es stattdessen so geschrieben:

android.applicationVariants.all { variant ->
    task "open${variant.name.capitalize()}" {
        dependsOn "install${variant.name.capitalize()}"

        doLast {
            exec {
                commandLine "adb shell monkey -p ${variant.applicationId} -c android.intent.category.LAUNCHER 1".split(" ")
            }
        }
    }
}

Dies würde Ihnen open{variant}für jede install{variant}Aufgabe geben, die Sie bereits haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.