Skip to content

Instantly share code, notes, and snippets.

@dkw72n
Created August 23, 2018 06:22
Show Gist options
  • Save dkw72n/2603df1723560b5389b26e55262ec35c to your computer and use it in GitHub Desktop.
Save dkw72n/2603df1723560b5389b26e55262ec35c to your computer and use it in GitHub Desktop.
Genymotion Android 7.1 x86 启用 libhoudini

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
}

TL;DR

WTF? 折腾几天, 原来本身就支持的啦? ro.dalvik.vm.native.bridge 原来可以在这里改的呀?!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment