Existe-t-il une commande sur cmd.exe
qui me permettrait de démarrer l'activité principale d'une application Android particulière à l'aide du fichier .apk
de cette application? Veuillez noter que je connais cette commande qui installe uniquement une application Android:
adb install myapp.apk
Cette commande installera uniquement myapp
sur l'émulateur et je dois exécuter manuellement cette application à partir de l'émulateur (en effectuant un simple clic sur son icône).
Ce que je veux, c’est utiliser une commande qui non seulement installe l’application mais commence également son activité principale (veuillez noter que je n’ai que son fichier .apk
, donc je ne sais pas quel est le nom du paquet ou de l’activité).
Vous ne pouvez pas installer et exécuter en une fois, mais vous pouvez certainement utiliser adb pour démarrer votre application déjà installée. Utilisez adb Shell am start pour déclencher une intention. Vous devrez cependant utiliser l'intention correcte pour votre application. Quelques exemples:
adb Shell am start -a Android.intent.action.MAIN -n com.Android.settings/.Settings
va lancer les paramètres, et
adb Shell am start -a Android.intent.action.MAIN -n com.Android.browser/.BrowserActivity
va lancer le navigateur. Si vous souhaitez diriger le navigateur vers une page particulière, procédez comme suit:
adb Shell am start -a Android.intent.action.VIEW -n com.Android.browser/.BrowserActivity http://www.google.co.uk
Si vous ne connaissez pas le nom des activités dans l'APK, faites ceci
aapt d xmltree <path to apk> AndroidManifest.xml
le contenu de la sortie comprendra une section comme celle-ci:
E: activity (line=32)
A: Android:theme(0x01010000)=@0x7f080000
A: Android:label(0x01010001)=@0x7f070000
A: Android:name(0x01010003)="com.anonymous.MainWindow"
A: Android:launchMode(0x0101001d)=(type 0x10)0x3
A: Android:screenOrientation(0x0101001e)=(type 0x10)0x1
A: Android:configChanges(0x0101001f)=(type 0x11)0x80
E: intent-filter (line=33)
E: action (line=34)
A: Android:name(0x01010003)="Android.intent.action.MAIN"
XE: (line=34)
Cela vous indique le nom de l'activité principale (MainWindow), et vous pouvez maintenant lancer
adb Shell am start -a Android.intent.action.MAIN -n com.anonymous/.MainWindow
si vous recherchez l'équivalent de "adb run myapp.apk"
vous pouvez utiliser le script montré dans cette answer
(linux et mac seulement - peut-être avec cygwin sous windows)
les utilisateurs de linux/mac peuvent également créer un script pour exécuter un apk avec les éléments suivants:
créez un fichier nommé "adb-run.sh" avec ces 3 lignes:
pkg=$(aapt dump badging $1|awk -F" " '/package/ {print $2}'|awk -F"'" '/name=/ {print $2}')
act=$(aapt dump badging $1|awk -F" " '/launchable-activity/ {print $2}'|awk -F"'" '/name=/ {print $2}')
adb Shell am start -n $pkg/$act
puis "chmod + x adb-run.sh" pour le rendre exécutable.
maintenant vous pouvez simplement:
adb-run.sh myapp.apk
L'avantage ici est que vous n'avez pas besoin de connaître le nom du package ou le nom de l'activité pouvant être lancée. De même, vous pouvez créer "adb-uninstall.sh myapp.apk"
Note: Cela nécessite que vous ayez aapt dans votre chemin. Vous pouvez le trouver sous le nouveau dossier des outils de construction dans le SDK.
Lorsque vous démarrez l'application depuis l'interface graphique, adb logcat
peut vous montrer l'action/la catégorie/le composant correspondant:
$ adb logcat
[...]
I/ActivityManager (1607): START {act = Android.intent.action.MAIN cat = [Android.intent.category.LAUNCHER] flg = 0x10200000 cmp = com.Android.browser/.BrowserActivity} du pid 1792
[...]
Ceci est une solution en script shell:
apk="$apk_path"
adb install "$apk"
sleep 1
pkg_info=`aapt dump badging "$apk" | head -1 | awk -F " " '{print $2}'`
eval $pkg_info > /dev/null
pkg_name=$name
adb Shell monkey -p "${pkg_name}" -c Android.intent.category.LAUNCHER 1
Je mets ceci dans mon makefile, juste à la ligne suivante après adb install ...
adb Shell monkey -p `cat .identifier` -c Android.intent.category.LAUNCHER 1
Pour que cela fonctionne, il doit y avoir un fichier .identifier avec l'identifiant de bundle de l'application, comme com.company.ourfirstapp
Pas besoin de chasser le nom de l'activité.
J'ai créé des alias de terminaux pour installer et exécuter un apk à l'aide d'une seule commande.
// I use ZSH, here is what I added to my .zshrc file (config file)
// at ~/.zshrc
// If you use bash Shell, append it to ~/.bashrc
# Have the adb accessible, by including it in the PATH
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:path/to/Android_sdk/platform-tools/"
# Setup your Android SDK path in Android_HOME variable
export Android_HOME=~/sdks/Android_sdk
# Setup aapt tool so it accessible using a single command
alias aapt="$Android_HOME/build-tools/27.0.3/aapt"
# Install APK to device
# Use as: apkinstall app-debug.apk
alias apkinstall="adb devices | tail -n +2 | cut -sf 1 | xargs -I X adb -s X install -r $1"
# As an alternative to apkinstall, you can also do just ./gradlew installDebug
# Alias for building and installing the apk to connected device
# Run at the root of your project
# $ buildAndInstallApk
alias buildAndInstallApk='./gradlew assembleDebug && apkinstall ./app/build/outputs/apk/debug/app-debug.apk'
# Launch your debug apk on your connected device
# Execute at the root of your Android project
# Usage: launchDebugApk
alias launchDebugApk="adb Shell monkey -p `aapt dump badging ./app/build/outputs/apk/debug/app-debug.apk | grep -e 'package: name' | cut -d \' -f 2` 1"
# ------------- Single command to build+install+launch apk------------#
# Execute at the root of your Android project
# Use as: buildInstallLaunchDebugApk
alias buildInstallLaunchDebugApk="buildAndInstallApk && launchDebugApk"
Note: Ici, je construis, installe et lance l'apk de débogage qui est généralement dans le chemin:
./app/build/outputs/apk/debug/app-debug.apk
, lorsque cette commande est exécutée à partir de la racine du projet.Si vous souhaitez installer et exécuter un autre apk, il vous suffit de remplacer le chemin d'accès à debug apk par le chemin de votre propre apk.
Voici le Gist pour les mêmes .J'ai créé cela parce que j'avais des difficultés à travailler avec la version d'Android Studio pendant 28 minutes environ, alors je suis passé aux versions de terminaux d'environ 3 minutes. Vous pouvez en lire plus à ce sujet ici
Explication:
Le seul alias qui, à mon avis, mérite une explication est le launchDebugApk
alias . Voici comment il est décomposé:
La partie aapt dump badging ./app/build/outputs/apk/debug/app-debug.apk | grep -e 'package: name
utilise essentiellement l'outil aapt
pour extraire le nom du package de l'apk.
Vient ensuite la commande: adb Shell monkey -p com.package.name 1
, qui utilise essentiellement l'outil monkey
pour ouvrir l'activité de lancement par défaut de l'application installée sur le périphérique connecté. La partie de com.package.name
est remplacée par notre commande précédente qui se charge d'obtenir le nom du paquet depuis l'apk.