web-dev-qa-db-fra.com

Forcer l'émulateur Android à stocker les modifications apportées au/système

Je sais que cette question est récurrente lorsque vous utilisez l'émulateur Android, mais existe-t-il un moyen de forcer l'émulateur à accepter les modifications persistantes apportées à /system?

L'émulateur étant basé sur QEMU, il devrait donc être possible, en théorie, de forcer l'image system à se comporter de la même manière que userdata (par exemple), mais je ne connais pas bien la façon dont QEMU gère les choses. Des pointeurs?

20
F.X.

Pour le moment (avec Build Tools v26, si Google ne modifie pas les choses aussi souvent), si vous utilisez la directive -writable-system lors du démarrage de l'émulateur à partir de la ligne de commande, la persistance sur la partition /system sera restaurée par le biais d'un redémarrage. C’est-à-dire que vous pourrez écrire sur la partition /system et si vous redémarrez, les modifications seront toujours conservées.

emulator -avd <AVD_NAME> -writable-system

Cela persistera également vos modifications dans un fichier image qcow2 généralement dans .Android/avd/<AVD_NAME>.avd/system.img.qcow2

Vous pouvez même copier ce fichier system.img.qcow2, effacer les données de l'AVD à l'aide de la directive -wipe-data, replacer ce fichier dans le répertoire, redémarrer et les modifications système que vous avez apportées initialement seront toujours conservées. (Mise en garde: au moins pour l'instant, car Google continue à changer des choses)

7
Irvin H.

Mise à jour: L'option -nand a apparemment été supprimée des versions les plus récentes de QEMU. Il est donc possible que les éléments suivants ne fonctionnent plus.

Mise à jour: Voir la réponse acceptée pour la façon actuelle de faire les choses.


La réponse de Yury est la réponse habituelle, mais si vous voulez pouvoir scripter des choses (ce que je veux au final), vous devez pouvoir trouver l'image de l'émulateur dans le répertoire /tmp.

J'ai découvert que vous pouvez remplacer le comportement de QEMU. C'est un peu bidon, mais ça marche, alors j'ai fini par faire ceci:

  1. Copiez system.img à partir du répertoire de la plate-forme dans votre répertoire AVD.
  2. Convertissez la quantité d’espace dont vous avez besoin. Par exemple, si vous avez besoin de 500M, il s'agit de 0x1f400000.
  3. Exécutez l'émulateur en mode lecture-écriture:

    emulator -avd Galaxy_Nexus -qemu -nand system,size=0x1f400000,file=/home/fx/.Android/avd/Galaxy_Nexus/system.img
    

    (Si vous mettez l'émulateur en mode commenté, vous remarquerez qu'il utilisera, par défaut, initfile= au lieu de file=)

  4. Effectuez vos modifications, elles sont immédiatement enregistrées dans le system.img local

  5. Maintenant, vous pouvez juste démarrer l'émulateur avec emulator -avd Galaxy_Nexus, et il utilisera vos modifications

Mise à jour: Si un script est utilisé, QEMU ne synchronise pas immédiatement les modifications apportées à l'image. Par conséquent, si vous redémarrez immédiatement après avoir modifié quelque chose, vous risquez de perdre des données. Je cherche un moyen de contourner ça ...

Prochaine mise à jour: Utilisez adb -e emu kill pour arrêter l'émulateur. reboot fera juste de mauvaises choses.

15
F.X.

C'est en fait une très bonne question. J'ai eu les mêmes problèmes. Voici mes conclusions. En fait, j'utilise Ubuntu et je décrirai les étapes à suivre pour Ubuntu. Si vous utilisez Windows, vous devez simplement changer les chemins.

  1. Créer un nouveau fichier AVD, par exemple example.avd
  2. Copiez system.img de Android-sdk-linux/platforms/Android-10/images Dans ~/.Android/avd/example.avd
  3. Rendre system.img comme accessible en écriture et en lecture (soit dans les propriétés , Soit simplement en utilisant terminal)
  4. Exécutez votre AVD en utilisant la commande emulator -avd example
  5. Remontez votre système en tant que rw en utilisant adb Shell mount -o rw,remount -t yaffs2 /dev/block/mtd0 /system (pour découvrir la partition, utilisez la commande cat /proc/mtd).
  6. Faites vos changements ...
  7. Maintenant, lors de l'exécution de l'émulateur, recherchez l'émulateur tmp dans /tmp/Android-<your_computer_name> avec un nom étrange tel que: emulator-PQ7LgE et copiez-le dans ~/.Android/avd/example.avd.
  8. Supprimez system.img et renommez l'émulateur tmp copié en system.img
  9. Fermer l'émulateur
  10. Supprimer cache.img, userdata.img et userdata-qemu.img de ~/.Android/avd/example.avd
  11. Relancez votre émulateur

Bonne chance!

8
Yury

J'ai eu du mal à trouver le fichier system.img et le répertoire AVD que F.X. posté à propos. Sur Mac, vous pouvez les trouver ici:

  • system.img: ~/Library/Android/sdk/system-images/Android-19/default/
  • Répertoire AVD: ~/.Android/avd/Nexus.avd/

Je n'ai pas assez de réputation pour l'ajouter en tant que commentaire, j'ai donc dû le poster comme ceci. Pardon.

2
stefansundin

La solution n ° 2 est incroyable.

Voici quelques astuces si vous utilisez MS Win en tant qu'hôte Les répertoires AVD sont situés comme ci-dessous, mais les noms de chemins "courts" doivent être utilisés En tant que paramètre file = path. La variante de chemin citée ne fonctionne pas pour une raison quelconque.

Win XP: C:\Documents and Settings\(nom d'utilisateur)\.Android\avd\... Courte C:\DOCUME ~ 1\(nom d'utilisateur)\ANDROI ~ 1\avd\...

Win 7 C:\Utilisateurs\(nom d'utilisateur)\.Android\avd\...

Vous pouvez créer votre propre fichier bat, dites "startrw.bat" comme dans l'exemple suivant:

@echo off
C:\<ADTFOLDER>\sdk\tools\emulator -avd <AVDNAME> -qemu -nand system,size=0x1f400000,file=C:\DOCUME~1\<USERNAME>\ANDROI~1\avd\<AVDNAME>.AVD\system.img
cd C:\<ADTFOLDER>\sdk\platform-tools
echo .
echo Wait ... 
echo .
echo When emulator is FULLY loaded press any key to connect adb Shell to it
echo To make /system writeable type in adb Shell:
echo .
echo -----------------------------
echo mount -o rw,remount /system 
echo -----------------------------
echo .
echo You can use the Eclipse ADT DDMS File Browser to browse or Push-pull files now.
echo .
echo Closing this window closes the emulator ! 
echo .
echo Wait emulator to load Android. When done
pause
C:\<ADTFOLDER>\sdk\platform-tools\adb Shell

De cette façon, vous pouvez charger en un clic. Une fois les modifications terminées, il suffit de fermer la fenêtre de commande actuelle pour tuer l’émulateur.

Le chargement de la plupart des choses, comme Emulator, l'éditeur ADT, le navigateur de fichiers Hooking DDMS (il faut cliquer sur la ligne de l'émulateur à gauche pour voir l'arborescence des fichiers dans la fenêtre de droite), etc., prend beaucoup de temps.

2
user2343527

La réponse de F.X. Ne fonctionne pas pour moi avec les API Android 19 et 21 sous Windows telles quelles. Avec les paramètres donnés

emulator -avd <AVD> -qemu -nand system,size=0x<SIZE IN HEX>,file=<PATH/TO/system.img>

le système ne parvient pas à monter l'image. En regardant la sortie du noyau, j'ai découvert qu'il utilise une taille de page suspecte (2048) et deux valeurs de paramètre différentes de zéro: extra size et "erase". Ces paramètres ne sont documentés nulle part, mais vous pouvez les voir dans le code source de qemu . Ce qui a fini par travailler pour moi était

emulator -avd <AVD> -qemu -nand system,size=0x<SIZE IN HEX>,file=<PATH/TO/system.img>,pagesize=512,extrasize=0

Avec ces paramètres spécifiés, "erase" est également mis à 0.

J'ai également été surpris de découvrir qu'avec ces paramètres, le système ne peut pas démarrer dans l'environnement graphique, mais adb fonctionne.

0
kirillkh

La meilleure façon de faire est d'utiliser la commande suivante:

<path-to-emulator-executable> -avd <AVD> -partition-size 512
0
Mark Yisri