我知道在使用Android模拟器时这是一个常见的问题,但是否有一种方法可以强制模拟器接受对/system
的持久更改?
由于模拟器基于QEMU,因此理论上应该可以强制系统
镜像表现出与userdata
相同的方式,但我不熟悉QEMU如何处理。有什么建议吗?
目前(使用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上的数据,将此文件放回目录中,然后重新启动,最初所做的系统更改仍将被保留。(警告:至少目前为止,因为谷歌一直在改变事情)
.img
文件中:https://android.stackexchange.com/questions/110927/how-to-mount-system-rewritable-or-read-only-rw-ro/207200#207200 - Ciro Santilli OurBigBook.com更新:最近的QEMU版本中似乎已经删除了-nand
选项,因此以下内容可能不再适用。
更新:请查看被接受的答案以获取当前的操作方式。
Yury的回答很普遍,但如果您想在最终进行脚本编写(这正是我所需要的),您需要能够在/tmp
目录中找到模拟器映像。
我发现您可以覆盖QEMU的行为。这有点hackish,但它有效,所以我最终做了以下事情:
system.img
从平台目录复制到AVD目录中。0x1f400000
。以读写模式运行模拟器:
emulator -avd Galaxy_Nexus -qemu -nand system,size=0x1f400000,file=/home/fx/.android/avd/Galaxy_Nexus/system.img
(如果你将模拟器设置为详细模式,你会注意到它默认使用initfile=
而不是只用file=
)
做出你的更改,它们会立即保存到本地的system.img
中
emulator -avd Galaxy_Nexus
来启动模拟器,它将使用你的更改更新: 如果使用脚本,QEMU不会立即将更改同步到映像中。因此,如果你在更改后立即重启,很可能会丢失数据。我正在寻找一种方法来解决这个问题...
下一个更新: 使用adb -e emu kill
停止模拟器。使用reboot
会导致不良后果。
sbt-android
插件中使用它,在一个简单的步骤中非常有效地设置了模拟器!) - F.X.system,size=0x1f400000
我尝试使用 https://developer.android.com/studio/run/emulator-commandline#startup-options 中的 -partition-size
命令来更改系统分区大小,但它不再起作用了(而且他们没有更新网站上的信息)... - user25这其实是一个非常好的问题,我也曾经遇到过同样的麻烦。以下是我的发现。我使用Ubuntu,并将描述Ubuntu的步骤。如果您使用Windows,则应更改路径。
example.avd
android-sdk-linux/platforms/android-10/images
复制system.img
到~/.android/avd/example.avd
system.img
设置为可写和可读(可以在属性中或直接使用终端)emulator -avd example
运行您的AVDmount -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
并将复制的临时模拟器重命名为system.img
~/.android/avd/example.avd
中删除cache.img
、userdata.img
和userdata-qemu.img
祝好运!
方案#2令人惊叹。
如果您使用的是MS Win作为主机,请注意以下提示: AVD目录位于下面,但应使用“短”路径名作为file=path参数。由于某种原因,带引号的路径变体无法工作。
Win XP: C:\Documents and Settings\ (用户名) \ .android\avd\ ... 短路径:C:\DOCUME~1\ (用户名) \ANDROI~1\avd\ ...
Win 7: C:\Users\ (用户名) \ .android\avd\ ...
您可以按照以下示例创建自己的批处理文件,例如“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编辑器、Hooking DDMS文件浏览器(您需要点击左侧的模拟器行才能在右侧窗口中看到文件树)等等。
我在寻找F.X.提到的system.img文件和AVD目录时遇到了麻烦。在Mac上,您可以在以下位置找到它们:
~/Library/Android/sdk/system-images/android-19/default/
~/.android/avd/Nexus.avd/
由于我的声望不够高,无法将其添加为评论,因此只能以这种方式发布。抱歉。
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
adbd不能在生产构建中以root权限运行。
- e-info128F.X.的答案在我使用的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可以正常工作。
system
,size
)?文档在哪里? - user25做到这一点的最佳方法是使用以下命令:
<path-to-emulator-executable> -avd <AVD> -partition-size 512
./emulator
或者 emulator-x86
。基本上,将 emulator
替换为你的模拟器可执行文件的路径。 - user6754053如https://justus.berlin/2015/02/make-persistent-changes-to-system-in-android-emulator/所述, 将system.img复制到avd文件夹中即可生效。
C:\Android\sdk\system-images\android-22\android-tv\armeabi-v7a\system.img
复制到 C:\Users\Neil Agarwal\.android\avd\Android_TV_1080p_API_22.avd\
并将其重命名为 system-qemu.img就可以了。
adb remount
来更改/system
,但如果您重新启动模拟器,更改将不会保存,这正是我所需要的。 - F.X.