26

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

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

4

10 回答 10

15

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

更新:查看当前处理方式的公认答案。


Yury 的回答是常见的,但是如果你希望能够编写脚本(这就是我最终想要的),你需要能够在/tmp目录中找到模拟器图像。

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

  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=而不是 just file=

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

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

更新:如果编写脚本,QEMU 不会立即将更改同步到映像,因此如果您在更改某些内容后立即重新启动,您很可能会丢失数据。我正在寻找解决这个问题的方法...

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

于 2013-03-15T07:40:47.007 回答
15

目前(使用 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 中的数据,将此文件放回目录中,重新启动,您最初所做的系统更改仍将保留。(警告:至少现在,因为谷歌一直在改变)

于 2017-04-12T17:22:16.760 回答
8

这实际上是一个非常好的问题。我有同样的麻烦。这是我的发现。实际上,我使用的是 Ubuntu,我将描述 Ubuntu 的步骤。如果您使用 Windows,您应该只更改路径。

  1. 例如,创建新的 AVDexample.avd
  2. 将 system.img 从复制android-sdk-linux/platforms/android-10/images~/.android/avd/example.avd
  3. 使 system.img 可写和可读(在属性中或仅使用终端)
  4. 使用命令运行您的 AVDemulator -avd example
  5. 使用 adb shell 将系统重新挂载为 rw mount -o rw,remount -t yaffs2 /dev/block/mtd0 /system(以发现分区使用命令cat /proc/mtd
  6. 进行更改...
  7. 现在在模拟器运行过程中找到 tmp 模拟器, /tmp/android-<your_computer_name>名称很奇怪,例如: emulator-PQ7LgE并将其复制到~/.android/avd/example.avd
  8. 删除system.img并将复制的 tmp 模拟器重命名为system.img
  9. 关闭模拟器
  10. 删除cache.imguserdata.imguserdata-qemu.img~/.android/avd/example.avd
  11. 再次运行你的模拟器

祝你好运!

于 2013-03-14T20:06:45.450 回答
2

解决方案#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 文件浏览器(您需要单击模拟器行左侧才能看到右侧窗口中的文件树)等等。

于 2013-05-02T14:30:04.943 回答
2

我很难找到 FX 发布的 system.img 文件和 AVD 目录。在 Mac 上,您可以在这里找到它们:

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

我没有足够的声誉将其添加为评论,所以我不得不像这样发布它。对不起。

于 2015-06-26T22:35:10.427 回答
0

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 可以工作。

于 2015-07-24T21:52:43.427 回答
0

最好的方法是使用以下命令:

<path-to-emulator-executable> -avd <AVD> -partition-size 512
于 2016-12-01T19:04:02.157 回答
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

于 2019-11-19T13:22:20.763 回答
0

正如这里所说的https://justus.berlin/2015/02/make-persistent-changes-to-system-in-android-emulator/ 将 system.img 复制到 avd 文件夹中将起作用。

于 2021-01-12T10:05:29.330 回答
-1

新年新解决方案。

只需将 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。

于 2017-04-26T20:50:44.747 回答