运行 Xposed inside Google Android 带有自定义图像的模拟器

Running Xposed inside Google Android Emulator with custom image

问题描述:

我需要让 droidmon 处理具有预定义参数的特定 android 图像。 Xposed 框架在安装时显示错误,它需要 root 访问权限。

环境:

Google Android Emulator 运行ning 自定义 root Android 4.4.2 x86 映像,内核版本为 3.4.67+(但我有同样的问题3.10+) 使用的参数(+与android itslef无关的额外参数):

SDK-工具-版本:25.2.2

SDK-平台-工具:24.0.3

Android 配置为允许 apks 的未知来源

已经尝试过:

  1. 正在重新挂载 /system RW
  2. 禁用-selinux(xposed 但是需要-selinux 许可)
  3. 使用 su
  4. 从 xposed 和 运行 脚本中提取更新二进制文件

当前状态:

如果我尝试安装 Xposed,我会从模拟器中收到以下日志消息:

[  355.372965] type=1400 audit(1477138733.355:23): avc:  denied  { execute } for  pid=2796 comm="posed.installer" name="app_process" dev="mtdblock1" ino=7847 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=1
[  355.372984] type=1400 audit(1477138733.355:24): avc:  denied  { execute_no_trans } for  pid=2796 comm="posed.installer" path="/data/data/de.robv.android.xposed.installer/cache/app_process" dev="mtdblock1" ino=7847 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=1
[  355.440354] type=1400 audit(1477138733.415:25): avc:  denied  { read } for  pid=2769 comm="posed.installer" name="app_process" dev="mtdblock0" ino=96 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:zygote_exec:s0 tclass=file permissive=1
[  355.440410] type=1400 audit(1477138733.415:26): avc:  denied  { open } for  pid=2769 comm="posed.installer" name="app_process" dev="mtdblock0" ino=96 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:zygote_exec:s0 tclass=file permissive=1
[  355.440450] type=1400 audit(1477138733.415:27): avc:  denied  { getattr } for  pid=2769 comm="posed.installer" path="/system/bin/app_process" dev="mtdblock0" ino=96 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:zygote_exec:s0 tclass=file permissive=1
[  365.476143] type=1400 audit(1477138743.455:28): avc:  denied  { execute } for  pid=2805 comm="Thread-110" name="su" dev="mtdblock0" ino=972 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:su_exec:s0 tclass=file permissive=1
[  365.476280] type=1400 audit(1477138743.455:29): avc:  denied  { read open } for  pid=2805 comm="Thread-110" name="su" dev="mtdblock0" ino=972 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:su_exec:s0 tclass=file permissive=1
[  365.476371] type=1400 audit(1477138743.455:30): avc:  denied  { execute_no_trans } for  pid=2805 comm="Thread-110" path="/system/xbin/su" dev="mtdblock0" ino=972 scontext=u:r:untrusted_app:s0 tcontext=u:object_r:su_exec:s0 tclass=file permissive=1

状态更新:

据我所知,图像没有正确植根。我使用 SuperSU-2.78 中打包的 su 二进制文件重新生成了图像。我通过将 system.img 安装到我的 linux 机器上的一个文件夹来操纵 system.img,并将 su 和 daemonsu(基本上是 su 复制并重命名)添加到 /system/xbin/ 并将这两个文件的权限更改为 6755。此外,现在我在 /etc/init.goldfish.sh

的末尾添加了 2 行
#remount /system rw
mount -o rw,remount /system

#start daemonsu as auto-daemon
/system/xbin/daemonsu --auto-daemon

从 SuperSU 安装 Superuser.apk 和合适的 Xposed 版本后,Xposed 最初安装但在重新启动后导致 libdvm.so

中的段错误

终于设法让它工作(需要旧的 sdk 版本(2016 年 11 月之前)

如上述问题所述,仍然需要 SuperSU

低于 3.10 版的内核镜像(kernel-qemu 或 engine classic)

  1. 以详细模式启动模拟器
  2. 注意用于在 qemu 中挂载 /system 的临时文件
  3. 安装 Xposed 但取消重启
  4. 从 /tmp/android-{username}/emulator-{random chars} 复制临时 system.img 到你的主目录
  5. 关闭模拟器
  6. 用您的主目录
  7. 覆盖现有system.img
  8. 再次启动模拟器
  9. Xposed 现在应该可以运行了

内核版本 3.10+(kernel-ranchu 或真正的沙盒模拟器)

不幸的是,目前还没有从 ranchu-emulator 中修改 system.img 的已知方法,ranchu 似乎会阻止每个写操作。 被阻止的操作让系统认为分区已损坏,因此系统以只读方式重新挂载分区作为安全后备。

找到了两个解决方法:

1.) 在启动模拟器时使用参数-engine classic(因此强制使用kernel-qemu)您可以使用上述步骤进行更改

2.) 使用内核映像较低版本 3.10 以避免模拟器乱码。您可以使用上述步骤,并在应用更改后再次使用之前的内核映像