我知道在使用 Android 模拟器时这是一个经常出现的问题,但是有没有办法强制模拟器接受对 的持久更改/system
?
模拟器基于 QEMU,因此理论上应该可以强制system
图像以相同的方式userdata
(例如)运行,但我不熟悉 QEMU 如何处理事情。任何指针?
更新:该-nand
选项显然已从 QEMU 的最新版本中删除,因此以下可能不再起作用。
更新:查看当前处理方式的公认答案。
Yury 的回答是常见的,但是如果你希望能够编写脚本(这就是我最终想要的),你需要能够在/tmp
目录中找到模拟器图像。
我发现你可以覆盖 QEMU 的行为。这有点骇人听闻,但它有效,所以我最终这样做了:
system.img
到您的 AVD 目录。0x1f400000
.以读写模式运行模拟器:
emulator -avd Galaxy_Nexus -qemu -nand system,size=0x1f400000,file=/home/fx/.android/avd/Galaxy_Nexus/system.img
(如果您将模拟器置于详细模式,您会注意到默认情况下它会使用initfile=
而不是 just file=
)
进行更改,它们会立即保存到本地system.img
emulator -avd Galaxy_Nexus
,它会使用您的更改更新:如果编写脚本,QEMU 不会立即将更改同步到映像,因此如果您在更改某些内容后立即重新启动,您很可能会丢失数据。我正在寻找解决这个问题的方法...
下次更新:用于adb -e emu kill
停止模拟器。reboot
只会做坏事。
目前(使用 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 中的数据,将此文件放回目录中,重新启动,您最初所做的系统更改仍将保留。(警告:至少现在,因为谷歌一直在改变)
这实际上是一个非常好的问题。我有同样的麻烦。这是我的发现。实际上,我使用的是 Ubuntu,我将描述 Ubuntu 的步骤。如果您使用 Windows,您应该只更改路径。
example.avd
android-sdk-linux/platforms/android-10/images
到~/.android/avd/example.avd
emulator -avd example
mount -o rw,remount -t
yaffs2 /dev/block/mtd0 /system
(以发现分区使用命令cat /proc/mtd
)/tmp/android-<your_computer_name>
名称很奇怪,例如:
emulator-PQ7LgE
并将其复制到~/.android/avd/example.avd
system.img
并将复制的 tmp 模拟器重命名为system.img
cache.img
,userdata.img
并userdata-qemu.img
从
~/.android/avd/example.avd
祝你好运!
解决方案#2 很棒。
如果您使用 MS Win 作为主机 AVD 目录位于以下位置,这里有一些提示,但“短”路径名应用作 file= path 参数。由于某种原因,引用的路径变体不起作用。
Win XP: C:\Documents and Settings\ (username) \ .android\avd\ ... 短 C:\DOCUME~1\ (username) \ANDROI~1\avd\ ...
Win 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
这样您就可以一键加载。完成修改后,只需关闭当前命令窗口即可终止模拟器。
大多数东西加载需要很长时间,例如模拟器、ADT 编辑器、挂钩 DDMS 文件浏览器(您需要单击模拟器行左侧才能看到右侧窗口中的文件树)等等。
我很难找到 FX 发布的 system.img 文件和 AVD 目录。在 Mac 上,您可以在这里找到它们:
~/Library/Android/sdk/system-images/android-19/default/
~/.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)和两个非零参数值:额外大小和“擦除”。这些参数在任何地方都没有记录,但是您可以在qemu 的源代码中看到它们。最终为我工作的是
emulator -avd <AVD> -qemu -nand system,size=0x<SIZE IN HEX>,file=<PATH/TO/system.img>,pagesize=512,extrasize=0
指定这些参数后,“erase”也设置为 0。
我还惊讶地发现,使用这些参数系统无法启动到图形环境,但 adb 可以工作。
最好的方法是使用以下命令:
<path-to-emulator-executable> -avd <AVD> -partition-size 512
在终端中使用此命令
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
正如这里所说的https://justus.berlin/2015/02/make-persistent-changes-to-system-in-android-emulator/ 将 system.img 复制到 avd 文件夹中将起作用。
新年新解决方案。
只需将 system.img 复制到您的 avd 文件夹并将 system.img 重命名为 system-qemu.img
对我来说,复制
并重命名为 system-qemu.imgC:\Android\sdk\system-images\android-22\android-tv\armeabi-v7a\system.img
就可以了。C:\Users\Neil Agarwal\.android\avd\Android_TV_1080p_API_22.avd\
请在此之后重新启动您的 avd。