8
votes

Android: Comment strace une application utilisant ADB Shell am Démarrer

J'ai besoin d'aide sur les applications Android dans l'émulateur SDK.

Voici ma configuration:

J'ai un émulateur d'Android SDK exécutant l'API Android 4.03 ADB Shell connecté à l'émulateur.

Je suis capable d'installer un APK en utilisant le nom de fichier d'installation adb.apk

Je suis capable d'exécuter l'application à l'aide de la coquille adb am démarrage -a android.inent.action.main -n com.akproduction.notepad / com.akproduction.notepad.noteliste

J'essaie de dormir en utilisant (adb shell) strace am démarrage -a android.inent.action.main -n com.akproduction.notepad / com.akproduction.notepad.noteliste mais je n'ai rien !

Comment retrouvez-vous le comportement d'exécution des applications Android et de leur installation?

(P.s. L'application de test est située ici .


0 commentaires

7 Réponses :


10
votes

La commande "AM START" n'exécute pas directement votre application; Il dit simplement Android de faire tout ce qui est nécessaire, dans votre exemple, de commencer une activité spécifique.

La commande strace est normalement utilisée comme dans la commande Strace CommandName CommandName Commande Args et il lance CommandName - facile, mais dans ce cas d'utilisation Android , inutile. Cependant, la strace a une option -p qui vous est utile: strace -p vous permettra de commencer à traduire le processus avec l'ID spécifié.

Si vous tapez PS sur votre système Android, vous pouvez localiser le processus avec le nom com.akproduction.notepad (probablement; par défaut les processus sont nommés pour leur paquet Android. , mais il est possible de changer cela dans le manifeste). Ensuite, vous pouvez commencer à le contrôler, où que ce soit.

Si vous besoin pour attraper des choses tôt dans le processus, vous devez modifier le code pour le faire retarder jusqu'à ce que vous soyez prêt à le retrouver, ou au moins besoin d'obtenir le processus en cours d'exécution avant de commencer l'activité. La deuxième option est souvent aussi simple que de démarrer l'activité, puis utilisez le bouton arrière, puis de préparer votre trace, puis de démarrer l'activité à nouveau - mais ceci est toujours spécifique au code à l'application.


0 commentaires

4
votes

Ceci est un piratage laids One-Liner, j'ai utilisé aujourd'hui pour résoudre ce problème. En supposant que le programme ait un nom connu, essayez simplement de joindre au processus dès qu'il apparaît. Dans cet exemple, je suis intéressé par tous les appels à ouvrir. XXX


0 commentaires

4
votes

Voici un one-liner que attrape l'ID de processus et tue-le à la rythme juste après am lance l'application. Vous n'obtiendrez pas les premières instructions exécutées, mais cela frappe assez tôt pour mes besoins.

am démarrage -n com.packagename.here \activitéName && ensemble `ps | grep com.packagename.here` && strace -p $ 2


0 commentaires

9
votes

Les applications Android sont effectivement démarrées par le processus zygote, de sorte que vous pouvez tracer l'initialisation de l'application en traçant le processus zygote et en suivant les processus enfants ('-f'): xxx


2 commentaires

Face au même problème mentionné par Aaron. Est-ce que quelqu'un sait comment gérer / résoudre ce problème?


Je ne vois aucun problème à utiliser Benno.id.au/android/strace pour tracer zygote sur Android 5.1. Quelle version de Strace / Android rencontrez-vous des problèmes? Une trace de pile ou toute autre information utile est-elle indiquée par ADB Logcat lorsque Zygote se bloque? Notez que Zygote peut lancer et attraper SIGSEGV en interne pour gérer les pointeurs NULL ou certaines fonctionnalités de collecte des ordures, et la strace détectera et imprime cela, mais cela n'indique pas nécessairement que Zygote se bloque. Vous voyez-vous simplement SIGSEGV dans la sortie de la strace et en supposant que Zygote s'écrase ou êtes-vous sûr que Zygote se bloque en réalité?



2
votes

Je recommanderais avant de commencer votre application Start Strace sur le processus Zygote et suivez les fourches. Zygote Process est le processus principal à partir duquel chaque nouveau processus Forks in Android, y compris votre application. Ensuite, vous voudrez peut-être filtrer le journal en fonction des PID qui vous intéressent. Exemple:

ps Zygote

Obtenez le zygote pid, puis

strace -f -p


0 commentaires

1
votes

J'ai trouvé un moyen délicat de le faire et de garantir que tous les systèmes SysCalls vont être attrapés. Il peut être fait même si l'application n'est pas débordée:

  • Définissez le gestionnaire d'activités ( am code>) pour mettre l'application en mode de débogage avec une option -w code> qui arrête son exécution jusqu'à ce qu'elle soit attachée à un débogueur li>
  • Démarrez la demande manuellement (vous pouvez simplement cliquer sur l'écran de son icône ou l'appeler avec am Démarrer CODE> LI>
  • avec l'application arrêtée, obtenez son PID LI>
  • avec son PID obtenu, appelez la strace pour tracer ce processus li>
  • Enfin, joignez le débogueur afin que l'exécution commence. li> ul>

    Voici les étapes suivantes: P>

    adb shell # shell into the device
    am set-debug-app -w com.package.name # put app to debug mode
    am start com.package.name/com.path.to.MainActivity # start the app
    ps -A | grep com.package.name # this will show you the PID
    strace -p <PID> > appoutput.txt 2> appstrace.txt 
    # strace the program and record its output and strace in txt files
    


0 commentaires

0
votes

Si vous avez un accès root ou que l'appareil est en cours d'exécution sans Selinux activé, vous pouvez suivre le site Android:

Configurez l'appareil afin que vous puissiez courir de la ronde. Vous devez être root, désactiver SELINUX et redémarrer le temps d'exécution pour supprimer le filtre SECCOMP qui autrement empêcher la course à la randonnée: racine adb adb shell setenforce 0 ADB Shell Stop ADB Shell Début

Configurez un répertoire mondial inscriptible pour les journaux de la strace, car Strace fonctionnera sous l'UID de l'application: ADB Shell MKDIR -M 777 / Data / Local / TMP / Strace

Choisissez le processus de trace et de la lancer: adb shell setprop wrap.com.android.calendar '"LOWWRAPPER strace -f -o /data/local/tmp/strace/strace.com.android.calendar.txt"'

Lancez le processus normalement.

https://source.android.com/devices/tech / Débogou / Strace # App-Strace


0 commentaires