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

时间:2013-03-14 18:16:05

标签: android emulation

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

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

10 个答案:

答案 0 :(得分: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
    

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

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

  5. 现在您可以使用emulator -avd Galaxy_Nexus启动模拟器,它将使用您的更改
  6. 更新:如果是脚本,QEMU不会立即将更改同步到图像,因此如果您在更改内容后立即重新启动,则可能会丢失数据。我正在寻找解决这个问题的方法......

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:8)

目前(使用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上的数据,将此文件放回目录中,重启并且您最初进行的系统更改仍将保留。 (警告:至少现在,因为谷歌不断改变事情)

答案 3 :(得分:2)

解决方案#2太棒了。

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

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

赢得7 C:\ Users \(用户名)\ .android \ avd \ ...

您可以创建一个自己的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

这样您只需点击一下即可加载。 完成修改后,只需关闭当前命令窗口即可终止仿真器。

像Emulator,ADT编辑器,Hooking DDMS文件浏览器(需要点击模拟器行左侧以查看右侧窗口中的文件树)等大部分内容加载需要很长时间,等等。

答案 4 :(得分:2)

我找不到F.X.的system.img文件和AVD目录。贴出来的。在Mac上,你可以在这里找到它们:

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

我没有足够的声誉将其添加为评论,因此我必须像这样发布。遗憾。

答案 5 :(得分:0)

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

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

系统无法安装映像。通过查看内核输出,我发现它使用了可疑页面大小(2048)和两个非零参数值:额外大小和&#34;擦除&#34;。这些参数未在任何地方记录,但您可以在qemu's source code中看到它们。最终为我工作的是

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

指定这些参数后,&#34;擦除&#34;也被设置为0。

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

答案 6 :(得分:0)

执行此操作的最佳方法是使用以下命令:

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

答案 7 :(得分:0)

在终端中使用此命令

cd /Users/NAME_USER/Library/Android/sdk/emulator # Move to emulator folder
sudo ./emulator -writable-system -avd NAME_AVD -partition-size 280 # Run avd by writable system 
sudo adb root # Change to root
sudo adb remount # remount again
sudo adb shell 
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 

更改NAME_USER和NAME_AVD

答案 8 :(得分:0)

https://justus.berlin/2015/02/make-persistent-changes-to-system-in-android-emulator/ 所述 将 system.img 复制到 avd 文件夹即可。

答案 9 :(得分:-1)

  

新年新解决方案。

只需将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\ 并且将其重命名为system-qemu.img 就可以了。

请在此之后重启你的avd。