安卓模拟器 2.0 以后完全到达可用级别了,各种操作非常流畅。所以想用来做一个虚拟环境跑 App ,但是很多 App (比如微信支付宝等)依赖 ARM 原生代码 library ,不能直接在 x86 的模拟器上跑。
搜了一下,英特尔的方案是:
1. 使用 X86 的 NDK 重新重新打包应用。
2. 在 X86 的安卓系统中装 ARM Binary Translation ,通过 Hook JNI 调用把 ARM 指令转成 X86 指令。
1 没指望,就从 2 入手:
1 )创建一个 AVD : Intel atom x86 image, google api level 23
2 )从 google 发布的 Nexus player (用了 atom cpu )二进制文件中,拷贝安卓 6.0 的 native bridge 驱动。 https://developers.google.com/android/nexus/drivers#fugu
3 )修改 AVD 的 system.img 和 ramdisk.img 使能 Native Bridge 。 参考 Nexus player 的配置,
ro.dalvik.vm.native.bridge=libhoudini.so
ro.dalvik.vm.isa.arm=x86
ro.enable.native.bridge.exec=1 等
启动后,运行 App 。
Native Bridge 成功加载了,但 App 运行还是失败。
02-25 15:04:11.990 1512 1620 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.mm/.ui.LauncherUI (has extras)} from uid 10007 on display 0
02-25 15:04:12.046 2586 2586 D houdini : [2586] Initialize library(version: 6.0.0_y.48180 RELEASE)... successfully.
02-25 15:04:12.048 1512 1524 I ActivityManager: Start proc 2586:com.tencent.mm/u0a55 for activity com.tencent.mm/.ui.LauncherUI
02-25 15:04:13.700 2586 2586 D houdini : [2586] Added shared library /data/app/com.tencent.mm-1/lib/arm/libstlport_shared.so for ClassLoader by Native Bridge.
02-25 15:04:13.703 2586 2586 E ActivityThread: Failed to find provider info for com.tencent.mm.coolassist.debugprovider
02-25 15:04:13.784 2586 2586 F libc : Fatal signal 11 (SIGSEGV), code 128, fault addr 0x0 in tid 2586 (com.tencent.mm)
dmsg
[ 366.571014] traps: com.tencent.mm[2586] general protection ip:b0f13dd1 sp:10011f20 error:30 in libhoudini.so[b0cfa000+3b4000]
另外,也尝试了 android-x86 和 remix os 提供的 libhoudini ,他们的 houdini 版本更旧, 5.多的。也是失败,最成功的一次看到了微信启动画面的地球小人。
使能 Native bridge 后 ARM 版本的 busy box 可以跑,确认基本功能正常。
更多 log :
V2 有人了解这块吗?求教
搜了一下,英特尔的方案是:
1. 使用 X86 的 NDK 重新重新打包应用。
2. 在 X86 的安卓系统中装 ARM Binary Translation ,通过 Hook JNI 调用把 ARM 指令转成 X86 指令。
1 没指望,就从 2 入手:
1 )创建一个 AVD : Intel atom x86 image, google api level 23
2 )从 google 发布的 Nexus player (用了 atom cpu )二进制文件中,拷贝安卓 6.0 的 native bridge 驱动。 https://developers.google.com/android/nexus/drivers#fugu
3 )修改 AVD 的 system.img 和 ramdisk.img 使能 Native Bridge 。 参考 Nexus player 的配置,
ro.dalvik.vm.native.bridge=libhoudini.so
ro.dalvik.vm.isa.arm=x86
ro.enable.native.bridge.exec=1 等
启动后,运行 App 。
Native Bridge 成功加载了,但 App 运行还是失败。
02-25 15:04:11.990 1512 1620 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.mm/.ui.LauncherUI (has extras)} from uid 10007 on display 0
02-25 15:04:12.046 2586 2586 D houdini : [2586] Initialize library(version: 6.0.0_y.48180 RELEASE)... successfully.
02-25 15:04:12.048 1512 1524 I ActivityManager: Start proc 2586:com.tencent.mm/u0a55 for activity com.tencent.mm/.ui.LauncherUI
02-25 15:04:13.700 2586 2586 D houdini : [2586] Added shared library /data/app/com.tencent.mm-1/lib/arm/libstlport_shared.so for ClassLoader by Native Bridge.
02-25 15:04:13.703 2586 2586 E ActivityThread: Failed to find provider info for com.tencent.mm.coolassist.debugprovider
02-25 15:04:13.784 2586 2586 F libc : Fatal signal 11 (SIGSEGV), code 128, fault addr 0x0 in tid 2586 (com.tencent.mm)
dmsg
[ 366.571014] traps: com.tencent.mm[2586] general protection ip:b0f13dd1 sp:10011f20 error:30 in libhoudini.so[b0cfa000+3b4000]
另外,也尝试了 android-x86 和 remix os 提供的 libhoudini ,他们的 houdini 版本更旧, 5.多的。也是失败,最成功的一次看到了微信启动画面的地球小人。
使能 Native bridge 后 ARM 版本的 busy box 可以跑,确认基本功能正常。
更多 log :
V2 有人了解这块吗?求教