强制Android模拟器将更改存储到/ system

F.X*_*.X. 22 android emulation

我知道在使用Android模拟器时这是一个经常出现的问题,但有没有办法强制模拟器接受持久性更改/system

仿真器基于QEMU,因此理论上应该可以强制system图像以相同的方式运行userdata(例如),但我不熟悉QEMU如何处理事情.有什么指针吗?

F.X*_*.X. 15

更新:-nand选项显然已从最新版本的QEMU中删除,因此以下内容可能不再适用.

更新:查看当前做事方式的已接受答案.


Yury的答案是常见的,但是如果你想能够编写脚本(这最终是我想要的),你需要能够在/tmp目录中找到模拟器图像.

我发现你可以覆盖QEMU的行为.这有点hackish,但它确实有效,所以我最终做到了这一点:

  1. system.img从平台目录复制到AVD目录.
  2. 将所需的空间量转换为十六进制.例如,如果你需要500M,那就是0x1f400000.
  3. 以读写模式运行模拟器:

    emulator -avd Galaxy_Nexus -qemu -nand system,size=0x1f400000,file=/home/fx/.android/avd/Galaxy_Nexus/system.img
    
    Run Code Online (Sandbox Code Playgroud)

    (如果您将模拟器置于详细模式,您会注意到默认情况下它将使用initfile=而不是仅使用file=)

  4. 进行更改后,它们会立即保存到本地 system.img

  5. 现在您可以启动模拟器emulator -avd Galaxy_Nexus,它将使用您的更改

更新:如果是脚本,QEMU不会立即将更改同步到映像,因此如果您在更改内容后立即重新启动,则可能会丢失数据.我正在寻找解决这个问题的方法......

下次更新:使用adb -e emu kill停止模拟器.reboot会做坏事.


Irv*_* H. 11

目前(使用Build Tools v26,如果Google不像他们那样经常更改内容)如果-writable-system在从命令行启动模拟器时使用该指令,它将允许/system通过重新启动对分区的持久性.也就是说,您将能够写入/system分区,如果重新启动,仍将保留更改.

emulator -avd <AVD_NAME> -writable-system

这也会将您的更改qcow2通常保留在图像文件中.android/avd/<AVD_NAME>.avd/system.img.qcow2

您甚至可以复制此system.img.qcow2文件,使用该-wipe-data指令擦除AVD上的数据,将此文件放回目录中,重新启动,您最初进行的系统更改仍将保留.(警告:至少现在,因为谷歌不断变化的事情)

  • 重要提示:您需要*继续使用`-writable-system`*来查看之前的持久更改。省略 `-writable-system` 将使用默认系统映像,无需进行更改。 (2认同)

Yur*_*ury 8

这实际上是一个非常好的问题.我遇到了同样的麻烦.以下是我的发现.实际上,我使用Ubuntu,我将描述Ubuntu的步骤.如果您使用Windows,则只需更改路径即可.

  1. 例如,创建新的AVD example.avd
  2. 将system.img复制android-sdk-linux/platforms/android-10/images~/.android/avd/example.avd
  3. 使system.img可写和可读(在属性中或仅使用终端)
  4. 使用命令运行AVD emulator -avd example
  5. 使用adb shell将系统重新安装为rw mount -o rw,remount -t yaffs2 /dev/block/mtd0 /system(以发现分区使用命令cat /proc/mtd)
  6. 做出改变......
  7. 现在,在模拟器运行期间,/tmp/android-<your_computer_name>使用奇怪的名称 查找tmp模拟器 emulator-PQ7LgE,并将其复制到~/.android/avd/example.avd
  8. 删除system.img并重命名复制的tmp模拟器到system.img
  9. 关闭模拟器
  10. 删除cache.img,userdata.imguserdata-qemu.img~/.android/avd/example.avd
  11. 再次运行您的模拟器

祝好运!