Genymotion Android 7.1 x86 启用 libhoudini
vbox86p:/ # mount -o rw,remount /system
F:\DAMIMI\androidx86>adb push houdini7x.iso /system/etc/
vbox86p:/ # busybox mount /system/etc/houdini7x.iso /system/lib/arm
F:\DAMIMI\androidx86>adb pull /system/build.prop build.prop.gm
[Edit build.prop.gm]
F:\DAMIMI\androidx86>adb push build.prop.gm /system/build.prop
vbox86p:/ # touch /system/lib/libhoudini.so
vbox86p:/ # busybox mount --bind /system/lib/arm/libhoudini.so /system/lib/libhoudini.so
vbox86p:/ # mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
vbox86p:/ # cd /proc/sys/fs/binfmt_misc
vbox86p:/ # echo ':arm_exe:M::\\x7f\\x45\\x4c\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\\x00\\x28::'"/system/lib/arm/houdini:P" > register
vbox86p:/ # echo ':arm_dyn:M::\\x7f\\x45\\x4c\\x46\\x01\\x01\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\\x00\\x28::'"/system/lib/arm/houdini:P" > register
至此, 已经可以运行 arm_exe 了
要让 libnb.so 取代 libnativebridge.so, 看 android_x86 里的配置, 在 /default.prop 中
vbox86p:/ # dd if=/dev/block/sdb2 of=/data/local/tmp/boot.img
F:\DAMIMI\androidx86>adb pull /data/local/tmp/boot.img
这个 boot.img 不是手机里的 android boot image, 好像就是一块普通的 ext2 分区
385 cat /dev/sdb3 sdb3_backup.img
386 cat /dev/sdb3 > sdb3_backup.img
387 cp sdb3_backup.img sdb3_playground.img
388 mount sdb3_playground.img boot
root@debian:/home/damimi/ramdisk# zcat ../boot/ramdisk | cpio -idmv
root@debian:/home/damimi/ramdisk# cat default.prop | grep nb
ro.dalvik.vm.native.bridge=libnb.so
root@debian:/home/damimi/ramdisk# find . | cpio -o -c | gzip -9 > ../boot/ramdisk
8093 blocks
ramdisk 打包命令是: https://access.redhat.com/solutions/24029 抄的.
启动不了, 似乎需要刷新一下 grub
内核启动日志输出到文件: console=ttyS0 ignore_loglevel
No filesystem could mount root, tried: ext3 ext4 ext2 vfat msdos iso9660 fuseblk
和 grub 没关, 启动日志说initrd分区挂不上, 怀疑是上面的打包操作不对, 换这个试试
root@debian:/home/damimi/ramdisk# cpio -i -F ../ramdisk_a
[edit here]
root@debian:/home/damimi/ramdisk# cpio -i -t -F ../ramdisk_a > ../ramdisk_a.lst
8095 blocks
root@debian:/home/damimi/ramdisk# cpio -o -H newc -O ../ramdisk_n < ../ramdisk_a.lst
8095 blocks
root@debian:/home/damimi/ramdisk# cd ..
root@debian:/home/damimi# gzip ramdisk_n
由于各种神操作, 之前system 分区的数据没了, 再弄一遍
533 mount /dev/sdb6 system/
534 cp libnb.so system/lib/
535 cp houdini7x.iso system/etc/
536 cp enable_houdini.sh system/etc/
537 chmod +x system/etc/enable_houdini.sh
538 mkdir system/lib/arm
539 touch system/lib/libhoudini.so
540 umount system
541 history | tail
试下
vbox86p:/ # ps | grep zy
root 252 1 1079212 125216 poll_sched eca7bbb9 S zygote
vbox86p:/ # cat /proc/252/maps|grep nb
daca3000-dacc7000 r--s 00000000 08:06 1854 /system/usr/hyphen-data/hyph-nb.hyb
ddb84000-ddb95000 r-xp 00000000 08:06 1310 /system/lib/libstagefright_amrnb_common.so
ddb95000-ddb96000 r--p 00010000 08:06 1310 /system/lib/libstagefright_amrnb_common.so
ddb96000-ddb97000 rw-p 00011000 08:06 1310 /system/lib/libstagefright_amrnb_common.so
eb3a0000-eb3aa000 r-xp 00000000 08:06 1259 /system/lib/libnbaio.so
eb3aa000-eb3ab000 r--p 00009000 08:06 1259 /system/lib/libnbaio.so
eb3ab000-eb3ac000 rw-p 0000a000 08:06 1259 /system/lib/libnbaio.so
ec93a000-ec93b000 r-xp 00000000 08:06 2206 /system/lib/libnb.so
ec93b000-ec93c000 r--p 00000000 08:06 2206 /system/lib/libnb.so
ec93c000-ec93d000 rw-p 00001000 08:06 2206 /system/lib/libnb.so
好了, 完成一部分了
把 /system/build.prop 也加进去
然后
setprop persist.sys.nativebridge 1
游戏就正常跑起来了.
剩下是持久化, 进去 /system/etc 逛逛, 赫然发现 /system/etc/init.genymotion.sh 中:
armabi() {
_abilist=x86
is_genymotion_god_product && _abilist=x86_64,x86
# ARM applications
if [ -f /system/lib/libhoudini.so ]; then
# Allow installation of ARM apps
setprop ro.product.cpu.abi2 armeabi-v7a
setprop ro.product.cpu.abilist $_abilist,armeabi-v7a,armeabi
setprop ro.product.cpu.abilist32 x86,armeabi-v7a,armeabi
# Enable native bridge for ARM apps
setprop ro.dalvik.vm.isa.arm x86
setprop ro.dalvik.vm.native.bridge libhoudini.so
else
setprop ro.dalvik.vm.native.bridge 0
setprop ro.product.cpu.abilist $_abilist
setprop ro.product.cpu.abilist32 x86
fi
# ARM executables
if [ -f /system/bin/houdini ]; then
# Enable execution of ARM executables
setprop ro.enable.native.bridge.exec 1
mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
cp /system/etc/binfmt_misc/arm_exe /proc/sys/fs/binfmt_misc/register
cp /system/etc/binfmt_misc/arm_dyn /proc/sys/fs/binfmt_misc/register
fi
}
WTF? 折腾几天, 原来本身就支持的啦? ro.dalvik.vm.native.bridge 原来可以在这里改的呀?!