Pouvez-vous déployer sur un appareil via Gradle à partir de la ligne de commande

89

Ce que dit vraiment la question - pouvez-vous émettre des commandes directement à gradlew via la ligne de commande pour créer, empaqueter et déployer sur un appareil?

Matt Whetton
la source
1
gradle tasksest utile pour voir les tâches prêtes à l'emploi - qui comprend l'installation (mais pas le démarrage comme indiqué ci-dessous)
Dori
La ligne de commande n'est pas spécifique à l'IDE, .ie de cette façon fonctionnerait à partir d'Android Studio ou de l'IDE basé sur Eclipse
Paul Verest
gradlew installdebug dans cmd - le dossier racine doit être le chemin
c49

Réponses:

97
$ gradle installDebug

Cela poussera l'apk de compilation de débogage vers l'appareil, mais vous devez démarrer manuellement l'application.

Rafaello
la source
2
Comme ci-dessous, il a été renommé "gradle installDefaultFlavorDebug"
durka42
2
@ durka42 Ce n'est le cas que si vous utilisez des saveurs
Mathijs Segers
3
Je dirais ./gradlew iD au lieu de gradle iD
irudyak
1
Est-ce possible d'exécuter cette commande dans le plugin Gradle installé sur Eclipse? J'obtiens cette erreur: la tâche «installDebug» ne se trouve pas dans le projet racine «blahblah».
Dr.jacky
75

Puisque vous utilisez Gradle, vous pouvez simplement ajouter votre propre tâche dans build.gradle

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'      
}

puis appelez-le dans la racine de votre projet

$ gradle appStart

Mettre à jour:

Si vous utilisez applicationIdSuffix ".debug", ajoutez .debugà la appId ne mais laisser l'activité intacte:

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

Roman K
la source
1
De plus, le dernier paramètre doit être 'com.your.packagename/.path.relative.to.your.packagename.MyActivity'au lieu de 'com.example/.MyActivity'si votre activité n'est pas à la racine de votre package.
Light
66

1. Construisez le projet, installez l'apk généré sur l'appareil

# at the root dir of project
$ gradle installDebug

2. Ouvrez l'application sur l'appareil

$ adb shell am start -n yourpackagename/.activityname
rps_deepan
la source
6
alias arun = "gradle installDebug; adb shell am start -n com.example.app/.activity.MainActivity"
Dominic Bartl
Je ne peux pas sélectionner installDebug dans gradle. Il n'y a pas de tâche appropriée. At-il été renommé?
Jonas Gröger
1
@ JonasGröger, il semble avoir été renommé en
installDefaultFlavorDebug
@rps_deepan Pourriez-vous renommer la tâche parce qu'elle a été renommée?
Jonas Gröger
6
alias arun="./gradlew installDebug && adb shell am start -n com.example.package/.LauncherActivity"#Runs step2 Seulement lorsque l'étape 1 est réussie
Thamme Gowda
7

Phrase d'une ligne:

Construire le projet et installer l'apk généré et ouvrir l'application sur l'appareil

$ ./gradlew installDebug && adb shell am start -n com.example/.activities.MainActivity
João Machete
la source
7

Il existe trois commandes pour accomplir cela:

  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 device, où $ PACKAGE est le package de développement et $ ACTIVITY est l'activité à lancer (l'activité du lanceur).

J'ai écrit un script bash pour ce faire , avec quelques autres fonctionnalités.

ms2r
la source
4

Une façon plus flexible de le faire consiste à utiliser monkey:

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

Quelques avantages de cette méthode:

  • getAdbExe ne nécessite pas que adb soit sur le chemin et utilise la version adb du sdk pointé dans local.properties .
  • L' monkeyoutil vous permet d'envoyer une intention de lanceur, vous n'êtes donc pas obligé de connaître le nom de votre activité.
0xcaff
la source
Vous pourriez à la place exécuteradb shell am start your.package.name.debugsuffix\.Activity
Vikram Bodicherla
Mais que faire si vous ne connaissez pas le nom de votre activité?
0xcaff
1
Alors vous ne devriez pas écrire le fichier de construction.
kevr
3
Je pense que c'est une très mauvaise idée pour que le fichier de construction sache explicitement quelle activité exécuter ... semble être quelque chose qui va à l'encontre de la séparation des préoccupations. Une raison simple: si vous renommez / déplacez votre fichier d'activité, cela nécessite maintenant une modification du fichier de construction. De plus, les intentions semblent être une meilleure api à exécuter qu'un fichier - je pourrais écrire une extension gradle qui ajoute des intentions par défaut et des moyens de les exécuter, la version, et ne jamais avoir besoin de connaître les noms de classe de qui que ce soit. Le codage en dur n'est jamais la bonne réponse.
smaudet
1
Cette réponse manque également d'un moyen de trouver le paquet racine - j'aimerais aussi me débarrasser du nom du paquet - par exemple, découvrez-le à partir du manifeste à la place.
smaudet
3

Construire -> désinstaller l'ancienne version -> installer une nouvelle version -> exécuter l'application.

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]

Ou si vous souhaitez installer et exécuter l'application en type de débogage.

./gradlew installDebug && adb shell am start -n [application package]/.[application name]
Goffity
la source
Merci. @ alexander-polomodov
Goffity
2
task appStart(type: Exec, dependsOn: 'installDebug') {
    commandLine android.adbExe, 'shell', 'am', 'start', '-n', 'com.example/.MyActivity'
}
huée
la source
Meilleure solution de course
Orgatres
1

J'ai écrit cette tâche pour pouvoir installer et également ouvrir l'application sur l'appareil. Comme j'avais plusieurs identifiants d'application buildTypeset flavorsavec différents, il n'était pas possible de coder en dur le nom du package. Alors je l'ai écrit comme ça à la place:

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(" ")
            }
        }
    }
}

Cela vous donnerait open{variant}pour chaque install{variant}tâche que vous avez déjà.

maclir
la source