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

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桌面:

# archlinux
sudo pacman -S android-tools
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:
sudo pacman -S sleuthkit p7zip binwalk git


cd ~

git clone https://github.com/sickcodes/Droid-NDK-Extractor.git

cd Droid-NDK-Extractor

chmod +x android-extract-ndk.sh

./android-extract-ndk.sh x86_64

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

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

cd ~/Droid-NDK-Extractor/working/extracted/

mkdir native-bridge

cd native-bridge

tar -xpf ../native-bridge.tar

chmod 0644 system/etc/init/ndk_translation_arm64.rc

chmod 0755 system/bin/arm

chmod 0755 system/bin/arm64

chmod 0755 system/lib/arm

chmod 0755 system/lib64/arm64

chmod 0644 system/etc/binfmt_misc/*

tar -cpf native-bridge.tar system

mv native-bridge.tar ..

cd ..

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的档案,填入以下内容:

FROM redroid/redroid:11.0.0-amd64

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是因为后续还要对系统做修改。
sudo docker run -itd --privileged \

    -v /home/user/data11-nb:/data \

    -p 5555:5555 \

    redroid-11-libndk \

    androidboot.redroid_gpu_mode=host \

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

    ro.product.cpu.abilist64=x86_64,arm64-v8a \

    ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \

    ro.dalvik.vm.isa.arm=x86 \

    ro.dalvik.vm.isa.arm64=x86_64 \

    ro.enable.native.bridge.exec=1 \

    ro.dalvik.vm.native.bridge=libndk_translation.so \

    ro.ndk_translation.version=0.2.2

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

version: "3"

services:

  redroid:

    image: redroid-11-libndk

    stdin_open: true

    tty: true

    privileged: true

    ports:

      - "5555:5555"

    volumes:

      - /home/user/data11-nb:/data

    command:

      - androidboot.redroid_gpu_mode=host

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

      - ro.product.cpu.abilist64=x86_64,arm64-v8a

      - ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi

      - ro.dalvik.vm.isa.arm=x86

      - ro.dalvik.vm.isa.arm64=x86_64

      - ro.enable.native.bridge.exec=1

      - ro.dalvik.vm.native.bridge=libndk_translation.so

      - ro.ndk_translation.version=0.2.2

  1. 用ADB连线至本机的ReDroid:
adb connect localhost:5555


# 如果連不上,用以下指令看一下容器內部發生什麼問題

sudo docker logs <容器ID>

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. 解压缩,会看到以下目录

open_gapps-x86_64-11.0-pico-20220503

├── Core

├── GApps

├── META-INF

├── Optional

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

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

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

system

├── app

│   ├── GoogleCalendarSyncAdapter

│   │   └── GoogleCalendarSyncAdapter.apk

│   ├── GoogleContactsSyncAdapter

│   │   └── GoogleContactsSyncAdapter.apk

│   ├── GoogleExtShared

│   │   └── GoogleExtShared.apk

│   └── GoogleTTS

│       └── GoogleTTS.apk

├── etc

│   ├── default-permissions

│   │   ├── default-permissions.xml

│   │   └── opengapps-permissions-q.xml

│   ├── permissions

│   │   ├── com.google.android.dialer.support.xml

│   │   ├── com.google.android.maps.xml

│   │   ├── com.google.android.media.effects.xml

│   │   ├── privapp-permissions-google.xml

│   │   └── split-permissions-google.xml

│   ├── preferred-apps

│   │   └── google.xml

│   └── sysconfig

│       ├── dialer_experience.xml

│       ├── google_build.xml

│       ├── google_exclusives_enable.xml

│       ├── google-hiddenapi-package-whitelist.xml

│       └── google.xml

├── framework

│   ├── com.google.android.dialer.support.jar

│   ├── com.google.android.maps.jar

│   └── com.google.android.media.effects.jar

├── priv-app

│   ├── AndroidAutoPrebuiltStub

│   │   └── AndroidAutoPrebuiltStub.apk

│   ├── AndroidMigratePrebuilt

│   │   └── AndroidMigratePrebuilt.apk

│   ├── CarrierSetup

│   │   └── CarrierSetup.apk

│   ├── ConfigUpdater

│   │   └── ConfigUpdater.apk

│   ├── GoogleBackupTransport

│   │   └── GoogleBackupTransport.apk

│   ├── GoogleExtServices

│   │   └── GoogleExtServices.apk

│   ├── GoogleFeedback

│   │   └── GoogleFeedback.apk

│   ├── GoogleOneTimeInitializer

│   │   └── GoogleOneTimeInitializer.apk

│   ├── GooglePackageInstaller

│   │   └── GooglePackageInstaller.apk

│   ├── GooglePartnerSetup

│   │   └── GooglePartnerSetup.apk

│   ├── GoogleRestore

│   │   └── GoogleRestore.apk

│   ├── GoogleServicesFramework

│   │   └── GoogleServicesFramework.apk

│   ├── Phonesky

│   │   └── Phonesky.apk

│   ├── PrebuiltGmsCore

│   │   └── PrebuiltGmsCore.apk

│   └── SetupWizard

│       └── SetupWizard.apk

└── product

    └── overlay

        └── PlayStoreOverlay.apk

  1. 执行以下指令取得root权限:
adb connect localhost:5555

adb -s localhost:5555 root

adb -s localhost:5555 remount

adb -s localhost:5555 shell "rm -rf system/priv-app/PackageInstaller"

  1. 接着将system目录推送到ReDroid系统,并赋予权限:
adb -s localhost:5555 push system /

adb -s localhost:5555 shell "pm grant com.google.android.gms android.permission.ACCESS_COARSE_LOCATION"

adb -s localhost:5555 shell "pm grant com.google.android.gms android.permission.ACCESS_FINE_LOCATION"

adb -s localhost:5555 shell "pm grant com.google.android.setupwizard android.permission.READ_PHONE_STATE"

adb -s localhost:5555 shell "pm grant com.google.android.setupwizard android.permission.READ_CONTACTS"

adb reboot

  1. 重新启动ReDroid容器:
docker ps

docker restart <ReDroid的容器ID>

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

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

adb -s localhost:5555 root

adb -s localhost:5555 shell 'sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \

    "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视窗关闭后,停止容器:

sudo docker ps

sudo docker stop <ReDroid的容器ID>

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

docker ps --filter "status=exited"


docker start <ReDroid的容器ID>


adb connect localhost:5555


scrcpy -s localhost:5555

8. 总结

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

  • 10
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值