当前位置:   article > 正文

用Docker跑Android系统,在x86电脑玩ARM手机游戏_redroid

redroid

ReDroid (Remote anDroid) 是自架「云手机」的方案,透过docker在电脑上跑Android系统容器,再利用Scrcpy的镜射萤幕功能连线到Android桌面。

ReDroid也是在电脑上用开源软体跑Android APP的解决方案。因为别说云手机了,很多Android手游模拟器都是闭源软体哪。相较之下,ReDroid除了ARM转译器以外都是开源的。更棒的是ReDroid支援GPU加速+ARM转x86的转译器,这样就可以玩大多数手机3D游戏了。

对Linux用户来说,这更是除了Waydroid以外,在Linux电脑高效率跑Android APP的方法。

本文将讨论如何在x86架构的Linux电脑,用ReDroid玩ARM架构的手机游戏。我们会在ReDroid映像档加入ARM转译器+Google服务框架,以达成最佳使用体验。

PS Windows和MacOS也可以跑Docker。

1. ReDroid需要用到的软体

ReDroid在Github上有各大Linux发行版的安装说明。

  1. 由于我是Arch Linux,要先补齐Linux核心模组binderfs

  2. 接着安装docker和docker-compose,用于执行容器

  3. 安装ADB和Scrcpy,连线到Android桌面:

  1. # archlinux
  2. sudo pacman -S android-tools
  3. sudo pacman -S scrcpy

  1. 下载用于传输音效的sndcpy,将其解压缩。

*想要Scrcpy和Sndcpy二者整合和按键映射的,可以试试看QtScrcpy

2. 取得ARM转译器libndk

大部分电脑是x86架构,只能执行x86版的Android APP,然而很多手机游戏只有ARM版。所以跑ReDroid前建议先下载ARM转译器,不然能执行的APP会少很多。

ReDroid支援用QEMU或libndk转译,本文采用后者。libndk是Google开发的ARM → x86转译器,含在Android Studio的模拟器里。注意libndk是专有软体,使用上处于灰色地带。

  1. 你可以用Droid-NDK-Extractor指令稿从Android 11模拟器映像档抽取libndk:
  1. sudo pacman -S sleuthkit p7zip binwalk git
  2. cd ~
  3. git clone https://github.com/sickcodes/Droid-NDK-Extractor.git
  4. cd Droid-NDK-Extractor
  5. chmod +x android-extract-ndk.sh
  6. ./android-extract-ndk.sh x86_64

  1. 之后会在工作目录的/working/extracted/下找到native-bridge.tar,大约30MB。

  2. 切换到native-bridge.tar所在的目录,修正权限后重新压缩档案:

  1. cd ~/Droid-NDK-Extractor/working/extracted/
  2. mkdir native-bridge
  3. cd native-bridge
  4. tar -xpf ../native-bridge.tar
  5. chmod 0644 system/etc/init/ndk_translation_arm64.rc
  6. chmod 0755 system/bin/arm
  7. chmod 0755 system/bin/arm64
  8. chmod 0755 system/lib/arm
  9. chmod 0755 system/lib64/arm64
  10. chmod 0644 system/etc/binfmt_misc/*
  11. tar -cpf native-bridge.tar system
  12. mv native-bridge.tar ..
  13. cd ..
  14. rm -r native-bridge

  1. 至此ARM转译器native-bridge.tar准备完成。

3. 建置ReDroid的Docker映像档

ReDroid目前提供Android 8 ~ Android 13的映像档。由于要使用libndk的关系,故以Android 11的映像档为基础下去建置。

  1. 新增一个空白目录android,将刚刚制作的native-bridge.tar放到此目录。

  2. android目录新增一个名为dockerfile的档案,填入以下内容:

  1. FROM redroid/redroid:11.0.0-amd64
  2. ADD native-bridge.tar /

  1. android目录开启终端机,开始建置含有libndk的ReDroid映像档:
docker build . -t redroid-11-libndk

4. 启动ReDroid

如果要用ReDroid玩手机游戏,建议电脑至少要有8GB以上RAM,因为有时ARM在转译成x86指令时会占用大量RAM。

  1. 部署ReDroid。没加--rm是因为后续还要对系统做修改。
  1. sudo docker run -itd --privileged \
  2. -v /home/user/data11-nb:/data \
  3. -p 5555:5555 \
  4. redroid-11-libndk \
  5. androidboot.redroid_gpu_mode=host \
  6. ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
  7. ro.product.cpu.abilist64=x86_64,arm64-v8a \
  8. ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
  9. ro.dalvik.vm.isa.arm=x86 \
  10. ro.dalvik.vm.isa.arm64=x86_64 \
  11. ro.enable.native.bridge.exec=1 \
  12. ro.dalvik.vm.native.bridge=libndk_translation.so \
  13. ro.ndk_translation.version=0.2.2

如果要用docker-compose.yml,内容如下:

  1. version: "3"
  2. services:
  3. redroid:
  4. image: redroid-11-libndk
  5. stdin_open: true
  6. tty: true
  7. privileged: true
  8. ports:
  9. - "5555:5555"
  10. volumes:
  11. - /home/user/data11-nb:/data
  12. command:
  13. - androidboot.redroid_gpu_mode=host
  14. - ro.product.cpu.abilist0=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi
  15. - ro.product.cpu.abilist64=x86_64,arm64-v8a
  16. - ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
  17. - ro.dalvik.vm.isa.arm=x86
  18. - ro.dalvik.vm.isa.arm64=x86_64
  19. - ro.enable.native.bridge.exec=1
  20. - ro.dalvik.vm.native.bridge=libndk_translation.so
  21. - ro.ndk_translation.version=0.2.2

  1. 用ADB连线至本机的ReDroid:
  1. adb connect localhost:5555
  2. # 如果連不上,用以下指令看一下容器內部發生什麼問題
  3. sudo docker logs <容器ID>
  4. sudo docker exec <容器ID> logcat

  1. 执行Scrcpy,连线到Android桌面:
scrcpy -s localhost:5555

  1. 这样就会看到Android的桌面了。

  2. 至于声音的话,切换到sndcpy所在的目录,执行sndcpy,开始串流音效:

./sndcpy localhost:5555

5. 安装Google服务框架

作者说Google服务框架是专有软体无法内建,那么就得自行安装了。第一个方法是重新编译映像档,第二个是手动安装OpenGApps。

不推荐第一个方法,耗时而且作者提供的GApps编译教学又有其他APP侦测不到的问题。

这里采用第二个方法:手动安装,过程参考自:Install GApps Manually - Google Groups

  1. OpenGapps下载x86_64架构的Android 11 GApps,选择最小化的pico版。

  2. 解压缩,会看到以下目录

  1. open_gapps-x86_64-11.0-pico-20220503
  2. ├── Core
  3. ├── GApps
  4. ├── META-INF
  5. ├── Optional

  1. 在解压缩的目录新增system目录。

  2. 接着,将CoreGApps目录里面的.lz档案都解压缩,并将里面的APK目录按照对应的安装目录放到system目录。例如GApps/googletts-x86_64/nodpi/app/下的GoogleTTS目录要放到/system/app

  3. 放好之后,system下的目录结构应该会长这样:

  1. system
  2. ├── app
  3. │   ├── GoogleCalendarSyncAdapter
  4. │   │   └── GoogleCalendarSyncAdapter.apk
  5. │   ├── GoogleContactsSyncAdapter
  6. │   │   └── GoogleContactsSyncAdapter.apk
  7. │   ├── GoogleExtShared
  8. │   │   └── GoogleExtShared.apk
  9. │   └── GoogleTTS
  10. │   └── GoogleTTS.apk
  11. ├── etc
  12. │   ├── default-permissions
  13. │   │   ├── default-permissions.xml
  14. │   │   └── opengapps-permissions-q.xml
  15. │   ├── permissions
  16. │   │   ├── com.google.android.dialer.support.xml
  17. │   │   ├── com.google.android.maps.xml
  18. │   │   ├── com.google.android.media.effects.xml
  19. │   │   ├── privapp-permissions-google.xml
  20. │   │   └── split-permissions-google.xml
  21. │   ├── preferred-apps
  22. │   │   └── google.xml
  23. │   └── sysconfig
  24. │   ├── dialer_experience.xml
  25. │   ├── google_build.xml
  26. │   ├── google_exclusives_enable.xml
  27. │   ├── google-hiddenapi-package-whitelist.xml
  28. │   └── google.xml
  29. ├── framework
  30. │   ├── com.google.android.dialer.support.jar
  31. │   ├── com.google.android.maps.jar
  32. │   └── com.google.android.media.effects.jar
  33. ├── priv-app
  34. │   ├── AndroidAutoPrebuiltStub
  35. │   │   └── AndroidAutoPrebuiltStub.apk
  36. │   ├── AndroidMigratePrebuilt
  37. │   │   └── AndroidMigratePrebuilt.apk
  38. │   ├── CarrierSetup
  39. │   │   └── CarrierSetup.apk
  40. │   ├── ConfigUpdater
  41. │   │   └── ConfigUpdater.apk
  42. │   ├── GoogleBackupTransport
  43. │   │   └── GoogleBackupTransport.apk
  44. │   ├── GoogleExtServices
  45. │   │   └── GoogleExtServices.apk
  46. │   ├── GoogleFeedback
  47. │   │   └── GoogleFeedback.apk
  48. │   ├── GoogleOneTimeInitializer
  49. │   │   └── GoogleOneTimeInitializer.apk
  50. │   ├── GooglePackageInstaller
  51. │   │   └── GooglePackageInstaller.apk
  52. │   ├── GooglePartnerSetup
  53. │   │   └── GooglePartnerSetup.apk
  54. │   ├── GoogleRestore
  55. │   │   └── GoogleRestore.apk
  56. │   ├── GoogleServicesFramework
  57. │   │   └── GoogleServicesFramework.apk
  58. │   ├── Phonesky
  59. │   │   └── Phonesky.apk
  60. │   ├── PrebuiltGmsCore
  61. │   │   └── PrebuiltGmsCore.apk
  62. │   └── SetupWizard
  63. │   └── SetupWizard.apk
  64. └── product
  65. └── overlay
  66. └── PlayStoreOverlay.apk

  1. 执行以下指令取得root权限:
  1. adb connect localhost:5555
  2. adb -s localhost:5555 root
  3. adb -s localhost:5555 remount
  4. adb -s localhost:5555 shell "rm -rf system/priv-app/PackageInstaller"

  1. 接着将system目录推送到ReDroid系统,并赋予权限:
  1. adb -s localhost:5555 push system /
  2. adb -s localhost:5555 shell "pm grant com.google.android.gms android.permission.ACCESS_COARSE_LOCATION"
  3. adb -s localhost:5555 shell "pm grant com.google.android.gms android.permission.ACCESS_FINE_LOCATION"
  4. adb -s localhost:5555 shell "pm grant com.google.android.setupwizard android.permission.READ_PHONE_STATE"
  5. adb -s localhost:5555 shell "pm grant com.google.android.setupwizard android.permission.READ_CONTACTS"
  6. adb reboot

  1. 重新启动ReDroid容器:
  1. docker ps
  2. docker restart <ReDroid的容器ID>

  1. 启动Scrcpy,开启系统设定→应用程式,点选右上角显示系统应用程式,将Google Play服务和Play商店的权限都开启。

  2. 执行以下指令取得Android装置ID,到Google网站注册装置,等个30分钟后重新启动Redroid容器,才能登入Google Play。

  1. adb -s localhost:5555 root
  2. adb -s localhost:5555 shell 'sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \
  3. "select * from main where name = \"android_id\";"'

6. ReDroid安装APK

目前即使有安装libndk,Android 11的Play商店还是不给下载ARM架构的APP,请配合APKPure之类的应用程式商店安装APP。

除了用容器内部的浏览器下载APK外,你还可以用ADB安装APK至ReDroid容器。比方说到ApkMirror下载Line的APK,接着用ADB安装:

adb -s localhost:5555 install "jp.naver.line.android.apk"

你也可以用ADB的pullpush指令传输档案。

关于萤幕解析度的调整,请参阅ReDroidScrcpy的使用说明。

7. ReDroid如何「开关机」

如果要将ReDroid关机,将Scrcpy视窗关闭后,停止容器:

  1. sudo docker ps
  2. sudo docker stop <ReDroid的容器ID>

之后可以再用此指令启动ReDroid。ReDroid容器的/data资料位于~/data11-nb目录,可以用来备份多个系统的档案。

  1. docker ps --filter "status=exited"
  2. docker start <ReDroid的容器ID>
  3. adb connect localhost:5555
  4. scrcpy -s localhost:5555

8. 总结

目前来看,ReDroid的泛用性比Waydroid好,因为不只造福Linux使用者,连那些想摆脱专有模拟器、想自架云手机的用户都可以利用ReDroid达成目的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/730553
推荐阅读
相关标签
  

闽ICP备14008679号