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

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

模拟器是基于QEMU的,所以理论上应该可以强制system映像像用户数据一样运行,但是我不熟悉QEMU如何处理事情。 任何指针?

Solutions Collecting From Web of "强制Android模拟器将更改存储到/ system"

目前(使用Build Tools第26版,如果Google不会像以前那样频繁地更改内容)如果在-writable-system启动模拟器的同时使用-writable-system指令,它将允许持久化到/system分区通过重新启动。 那就是你可以写入到/system分区,如果你重新启动,所做的更改仍然会保留。

emulator -avd <AVD_NAME> -writable-system

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

你甚至可以复制这个system.img.qcow2文件,使用-wipe-data指令从AVD -wipe-data ,将这个文件放回目录,重新启动,你最初做的系统改变仍然会被保留。 (注意:至less现在,因为Google不断变化的东西)

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

更新:请参阅当前接受的回答方式。


Yury的答案是常见的,但是如果你想能够编写脚本(最终我想要的),你需要能够在/tmp目录下find模拟器映像。

我发现你可以覆盖QEMU的行为。 这有点骇人,但它的工作,所以我最终这样做:

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

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

    (如果你把模拟器放在详细的模式下,你会注意到它会默认使用initfile=而不是file=

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

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

更新:如果是脚本编写,QEMU不会立即将更改同步到映像,所以如果您在更改某个内容后立即重新启动,则很可能会丢失数据。 我正在寻找一种解决方法…

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

这实际上是一个很好的问题。 我也有同样的麻烦。 这是我的发现。 实际上,我使用Ubuntu,我将描述Ubuntu的步骤。 如果你使用Windows,你应该改变path。

  1. 创build新的AVD,例如example.avd
  2. android-sdk-linux/platforms/android-10/images复制system.img到~/.android/avd/example.avd
  3. 使system.img可写和可读(在属性中或者简单地使用terminal)
  4. 运行您的AVD使用命令emulator -avd example
  5. 使用adb shell mount -o rw,remount -t yaffs2 /dev/block/mtd0 /system (发现分区使用命令cat /proc/mtd
  6. 进行更改…
  7. 现在在模拟器运行期间,在/tmp/android-<your_computer_name>findtmp模拟器,名字如下: emulator-PQ7LgE并将其复制到~/.android/avd/example.avd
  8. 删除system.img并将复制的tmp模拟器重命名为system.img
  9. closures模拟器
  10. ~/.android/avd/example.avd删除cache.imguserdata.imguserdata-qemu.img
  11. 再次运行您的模拟器

祝你好运!

解决scheme#2是惊人的。

这里有一些提示,如果您使用MS Win作为主机AVD目录如下所示,但是“short”path名应该用作file = path参数。 引用的path变体由于某种原因不起作用。

Win XP:C:\ Documents and Settings \(用户名)\ .android \ avd \ …短C:\ DOCUME〜1 \(用户名)\ ANDROI〜1 \ avd \ …

赢7 C:\用户\(用户名)\ .android \ AVD \ …

您可以创build一个自己的bat文件,按照以下示例说“startrw.bat”:

 @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 

这样你可以加载一个点击。 一旦完成修改,只需closures当前的命令窗口来杀死模拟器。

加载大部分东西需要很长时间,比如模拟器,ADT编辑器,挂钩DDMS文件浏览器(您需要点击左侧的模拟器行来查看右侧窗口中的文件树)等等。

我很难findFX发布的system.img文件和AVD目录。 在Mac上,你可以在这里find它们:

  • system.img: ~/Library/Android/sdk/system-images/android-19/default/
  • AVD目录: ~/.android/avd/Nexus.avd/

我没有足够的声望来添加它作为评论,所以我不得不这样发布它。 抱歉。

FX的答案对我来说不适用于Windows上的Android API 19和21。 用给定的参数

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

系统无法安装图像。 通过查看内核输出,我发现它使用可疑页面大小(2048)和两个非零参数值:额外大小和“擦除”。 这些参数没有logging在任何地方,但你可以在qemu的源代码中看到它们。 最后为我工作的是

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

通过指定这些参数,“擦除”也被设置为0。

我也惊讶地发现,使用这些参数,系统无法启动到graphics环境,但adb工作。

最好的办法是使用下面的命令:

 emulator -avd <AVD> -partition-size 512 

新年新的解决scheme。

只需将system.img复制到您的avd文件夹,然后将system.img重命名为system-qemu.img

对我来说,将C:\Android\sdk\system-images\android-22\android-tv\armeabi-v7a\system.imgC:\Users\Neil Agarwal\.android\avd\Android_TV_1080p_API_22.avd\ 它到系统qemu.img做的伎俩。

请在这之后重新启动你的avd。