我知道在使用Android模拟器时这是一个经常出现的问题,但有没有办法强制模拟器接受对/system
的持续更改?
模拟器基于QEMU,因此理论上应该可以强制system
图像的行为方式与userdata
相同(例如),但我不熟悉QEMU如何处理事情。有什么指针吗?
答案 0 :(得分:15)
更新:-nand
选项显然已从最新版本的QEMU中移除,因此以下内容可能无法使用。
更新:查看当前处理方式的已接受答案。
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
只会做坏事。
答案 1 :(得分:8)
这实际上是一个非常好的问题。我遇到了同样的麻烦。以下是我的发现。实际上,我使用Ubuntu,我将描述Ubuntu的步骤。如果您使用Windows,则只需更改路径。
example.avd
android-sdk-linux/platforms/android-10/images
复制system.img
到~/.android/avd/example.avd
emulator -avd example
mount -o rw,remount -t
yaffs2 /dev/block/mtd0 /system
将系统重新安装为rw(以发现分区使用情况
命令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 :(得分: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上,你可以在这里找到它们:
~/Library/Android/sdk/system-images/android-19/default/
~/.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.img
到C:\Users\Neil Agarwal\.android\avd\Android_TV_1080p_API_22.avd\
并且将其重命名为system-qemu.img 就可以了。
请在此之后重启你的avd。