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.