arm64 on Android Emulator x86_64 (with Android 11)
hatch の ChromeOS に Android 11 が降ってきたらしいので Android Emulator の Android 11 に houdini 入れて動かないかやってみる
これで動いたら Vulkan も動く最強 Android エミュレータになるが…?→ Intel Mac では Vulkan が無効化されていました…
Chrome91のリカバリ: ttps://dl.google.com/dl/edgedl/chromeos/recovery/chromeos_13904.55.0_hatch_recovery_stable-channel_mp-v6.bin.zip
7z e /path/to/recovery.bin ROOT-A.imgでROOT-A.imgをextractする
7z e ROOT-A.img opt/google/vms/android/vendor.raw.img でさらに vendor.raw.img をextract
Android 9 の時との変更点
opt/google/containers/android が opt/google/vms/android になっている
VMになった?それとも名前が変わっただけ?
VMになったとの噂
適当にフォルダを掘って入ったあと
7z x ../vendor.raw.img bin/houdini{,64} lib{,64}/libhoudini.so lib/arm lib64/arm64 etc/binfmt_misc
Android Emulator 側の準備
Android 11 (Google APIs, x86_64) イメージでエミュレータを作る
Google Play イメージは root になれないのでだめ
アプリは実機から吸い出して adb install するとかしてください
emulator コマンドを使ってエミュレータを起動する
この時 -writable-system を付けておくこと!
エミュレータが起動するのを待つ
code:sh
adb root
sleep 3
adb shell avbctl disable-verification # Android Verified Boot 無効化
adb remount # remount できるようにしておく
adb reboot # 再起動
再起動したらもう一回
code:bash
adb root
sleep 3
adb remount
これで adb shell touch /system/hoge とかができるようになっているはず
あとは展開したフォルダ内で
code:bash
adb push . /data/houdini # 先に adb root で root になっておくこと
して adb shell 内で
code:create-symlink.sh
rm -r /system/lib/arm /system/lib64/arm64
ln -s /data/houdini/bin/houdini /system/bin/houdini
ln -s /data/houdini/bin/houdini64 /system/bin/houdini64
rm -f /system/lib{,64}/libhoudini.so
cp /data/houdini/lib/libhoudini.so /system/lib/
cp /data/houdini/lib64/libhoudini.so /system/lib64/
chcon -R u:object_r:system_lib_file:s0 /data/houdini
prop
/vendor/default.prop の ro.dalvik.vm.native.bridge=libndk_translation.so を libhoudini.so にする必要がある
code:sh
sed -i=.sed.bak -e 's/libndk_translation\.so/libhoudini.so/g' /vendor/default.prop
書き換え後は再起動必須
リブート後毎回実行しないといけないやつら どっかいい置き場所ないかな
code:bash
umount /system/lib/arm
umount /system/lib64/arm64
rm -f /system/lib/arm /system/lib64/arm64
mkdir /system/lib/arm /system/lib64/arm64
# symlink だと /data/houdini をアプリがopenできない(当然)ので死ぬ
# なので bind mount してやらないといけない
mount --bind /data/houdini/lib/arm /system/lib/arm
mount --bind /data/houdini/lib64/arm64 /system/lib64/arm64
sed -i=.sed.bak -e 's/namespace\.default\.permitted\.paths \= \/system\/\${LIB}\/drm/namespace\.default\.permitted\.paths \= \/system\/\$\{LIB\}\/drm\nnamespace\.default\.permitted\.paths \+\= \/system\/lib\/arm\/nb\nnamespace\.default\.permitted\.paths \+\= \/system\/lib64\/arm64\/nb/g' /linkerconfig/ld.config.txt
stop && start
GPU 名偽装は Android Emulator 側にhookかければできるので各ホストOSの方法で頑張る
要は GLEScontext::getRendererString を上書きしてやるとよい
Vulkanだとまた違うかも?