노트북에서 arm64 안드로이드 게임 돌리기

Shovel

이전 글에서 이어지는 글입니다.

서론

예전에 해당 글을 쓸 때에는 Android 9 버전 용 64비트 지원 libhoudini가 없어 arm64-v8a 만 지원하는 게임을 돌릴 수가 없었습니다.

그런데, 최근에 일본 뱅드림이 구글 플레이에서 데이터 불러오기 기능이 제대로 작동하지 않아 민트자매 이벤트 기간임에도 불구하고 한 판도 플레이하지 못하게 되었습니다. 이런저런 문제를 의심하던 도중에 혹시 이 문젠가 하고 libhoudini를 바꾸는 과정에서 64비트 지원이 최근 추가됐다는 사실을 알게 되게 되어 후속글을 쓰게 됩니다. 물론 뱅드림은 아직도 로그인이 안되는 상태입니다. 해결방법을 아시는 분이 계시다면 도와주시면 감사하겠습니다 :(

+ 12/20: 일본 뱅드림 자체 버그로, 현재는 픽스가 되었습니다.

libhoudini

각설하고 본론으로 들어가서, libhoudini는 ChromeOS를 뜯어서 나온 x86 용 ARM 번역 라이브러리 입니다. 현재 Android-x86이 이 libhoudini를 이용해서 ARM 용 앱을 번역해 실행 중에 있으며, 유니티의 x86 안드로이드 지원이 끊긴 지금 대다수의 노트북 (x86_64)에서 게임을 돌리기 위해 사실상 반 필수가 된 라이브러리입니다. 그리고 번역속도가 꽤 빠른 것 같습니다.

아무튼, 원래는 Android 7버전까지만 arm64가 지원됐고 Android 9버전은 지원이 안되는 상태였는데 최근 ChromeOS 릴리즈 중에 arm64 지원 Android 9용 libhoudini가 포함돼 나온 릴리즈가 있었습니다. 원본 글

추출방법

추출된 파일을 밑에 업로드 해두었습니다.
이 문단은 그저 한 방법을 정리하기 위해서이니, 간단히 스킵하셔도 괜찮습니다.

추출은 다음과 같은 방법으로 하시면 됩니다.

  1. CrOS Updates Serving 에서 ChromeOS 이미지 파일을 가져옴
  2. 이미지를 마운트 후, vendor.raw.img 를 다시 한번 마운트
  3. 중요한 파일들을 가져와 squashfs로 묶기

우선 이미지 파일인데, 저는 chromeos_13310.93.0_drallion_recovery_stable-channel_mp-v2.bin 파일로 작업했습니다. 아마 기기와 버전 명을 맞추셔서 받으시면 될 것 같습니다.

이미지 마운트는 다음과 같이 하시면 됩니다.

$ sudo kpartx -av chromeos_13310.93.0_drallion_recovery_stable-channel_mp-v2.bin

add map loop(숫자)p1
...

$ sudo mount -t ext2 /dev/mapper/loop(숫자)p3 -o ro /(마운트 경로)/c
$ sudo mount /(마운트 경로)/c/opt/google/containers/android/vendor.raw.img /(마운트 경로)/img

가져오실 파일들은 다음과 같습니다. (z버전 기준)

  • lib64/libhoudini.so
  • lib64/arm64/
  • bin/houdini64

y버전을 추출하실 분들은 64를 다 빼면 됩니다. 저 안의 내용물을 다 한 폴더에 넣습니다.

그리고 $ mksquashfs /(내용물이 들은 폴더)/ houdini9_z.sfs 를 통해 squashfs를 만들어주시면 됩니다.

마지막으로, 아까 마운트한 역순으로 umount, umount, kpartx -dv 를 실행하셔서 마운트를 해제해주시면 됩니다.

참고한 글은 다음과 같습니다.
Android x86 Google Groups BlissRoms-x86/android_vendor_google_chromeos-x86

적용방법

houdini9.zip 다운로드

우선은 제가 추출한 houdini9.zip 을 받습니다. 사실 저는 64비트 버전을 사용하려면 무조건 houdini9_z.sfs 를 사용해야하는 줄 알았는데 아니었나 봅니다. 저도 어떻게 했는지는 잘 기억이 나지 않을 정도로 이리저리 잡다하게 시도했었는데 우선 한 일은 다음과 같습니다.

  1. build.prop 수정해서 64비트도 설치되게 변경
  2. enable_nativebridge 수정
  3. houdini9_y.sfs와 houdini9_z.sfs 추가
  4. enable_nativebridge 실행

우선 build.prop 은 다음과 같이 수정해주시면 됩니다.

- ro.product.cpu.abilist=x86_64,x86,armeabi-v7a,armeabi
+ ro.product.cpu.abilist=x86_64,x86,arm64-v8a,armeabi-v7a,armeabi

- ro.product.cpu.abilist64=x86_64
+ ro.product.cpu.abilist64=x86_64,arm64-v8a
/system/build.prop
- ro.vendor.product.cpu.abilist=x86_64,x86,armeabi-v7a,armeabi
+ ro.vendor.product.cpu.abilist=x86_64,x86,arm64-v8a,armeabi-v7a,armeabi

- ro.vendor.product.cpu.abilist64=x86_64
+ ro.vendor.product.cpu.abilist64=x86_64,arm64-v8a
/system/vendor/build.prop

enable_nativebridge 는 다음과 같이 수정해주시면 됩니다.

@@ -82,4 +82,6 @@ else
 	log -pi -thoudini "houdini$1 enabled"
 fi
 
+[ "$(getprop ro.zygote)" = "zygote64_32" -a -z "$1" ] && exec $0 64
+
 exit 0
/system/bin/enable_nativebridge

houdini9_y.sfshoudini9_z.sfs 는 위 링크에서 받아서 /system/etc 에 추가해주시면 됩니다. 제 개인적인 생각으로는 houdini9_y 만 있어도 작동할 수도 있겠다 싶은데 아무튼 houdini9_z 만 가지고는 안 됐던거 같아서 혹시 몰라 둘 다 넣었습니다. 9_y 만 있어도 가능하지 않을까 싶습니다.

마지막으로, ./enable_nativebridge 64./enable_nativebridge 를 실행시켜 주시고 재부팅해주시면 적용이 됐을 것 같습니다.

결론

이렇게 하시면 안드로이드9 x86 노트북에서도 64비트 게임을 돌릴 수 있게 됩니다. 이전 글에서도 설명했듯이, 렉이 별로 없이 상당히 부드럽게 돌아가긴 하지만 발열은 확실히 조금 심하긴합니다. 아무튼 패드가 없어도 이렇게 사용할 수 있는 게 장점인 것 같습니다.

후디니가 바뀌어도 뱅드림은 여전히 데이터 인계가 안되는 게 아쉽긴 한데, 로그캣을 열심히 뒤져보아도 원인을 찾기가 어려워 어쩔 수 없이 1년 지나 한도리에 해당 이벤트가 나오기를 기다려야할 듯 합니다.

읽어주셔서 감사합니다.