web-dev-qa-db-fra.com

Comment exécuter (pas seulement installer) une application Android utilisant un fichier .apk?

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é).

49
Azeem

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
78
Airsource Ltd

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.

12
dljava

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
[...]

6
Imre Deák

Ceci est une solution en script shell:

apk="$apk_path"

1. Installez apk

adb install "$apk"
sleep 1

2. Obtenez le nom du paquet

pkg_info=`aapt dump badging "$apk" | head -1 | awk -F " " '{print $2}'`
eval $pkg_info > /dev/null

3. Démarrer l'application

pkg_name=$name
adb Shell monkey -p "${pkg_name}" -c Android.intent.category.LAUNCHER 1
2
Verdigrass

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é.

1
Jonny

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.

0
Nishant.