deepin运行Android应用踩坑笔记

0x00 前言

Deepin v20.2.2系统支持运行Android应用,于是安装了Windows/Deepin双系统后,开始了运行Android应用的踩坑之旅。以下是在这过程中的踩坑记录。

0x01 安装uengine

Deepin中是通过一个叫uengine的工具来支持Android应用的,这是一个基于anbox进行二次开发而成的工具。它的基本原理是通过在Linux内核中安装Android所需要的内核模块(如:binder、ashmem等),然后运行一个Android容器而实现的。

安装内核模块

$ sudo apt install uengine-modules-dkms

安装成功后/dev目录下能够找到如下两个设备:

crw-rw-rw-   1 root root    511,   0 7月  24 17:16 binder
crw-rw-rw-   1 root root     10,  58 7月  24 17:16 ashmem

如果没有看到可以尝试以下方法来手动加载:

$ sudo insmod ashmem_linux
$ sudo insmod binder_linux

如果加载失败可以试下重启电脑后再加载。

安装uengine

$ sudo apt install uengine

安装之后会创建两个服务:uengine-sessionuengine-container,同时在/data/uengine目录下写入Android镜像等文件。如果/data挂载的是ntfs分区的话,需要将/data/uengine软链到非ntfs分区目录,否则会导致容器启动失败。

安装之后也会新增一个网卡:uengine0,分配的ip地址是:192.168.250.1

容器成功启动后会分配到192.168.250.2这个地址,并且这个地址是可以ping通的。

容器启动的日志可以在:/data/uengine/data/logs路径下找到,在容器启动失败失败时可以根据这个日志来分析原因。

0x02 安装Android应用

安装Android应用最简单的方法是在应用市场里下载安装,也可以使用命令行安装。

$ sudo apt install uengine.com.tencent.mobileqq

安装后会在桌面创建一个图表,指向的命令行是:/usr/bin/uengine-launch.sh --action=android.intent.action.MAIN --package=com.tencent.mobileqq --component=com.tencent.mobileqq.activity.SplashActivity

/usr/bin/uengine-launch.sh的内容是:

#!/bin/bash

uengine launch $*

这里默认是用的多窗口模式,每个应用都是在一个新的窗口中打开的。

0x03 使用adb访问Android系统

安装adb

$ sudo apt install adb

连接设备

$ adb connect 192.168.250.2
192.168.250.2:5555      unauthorized

正常Android设备在连接adb调试的时候会弹出授权窗口,但是这里怎么都无法弹出授权窗口,因此需要我们手动将adb的公钥拷贝到设备的对应目录中。

$ cp ~/.android/adbkey.pub /data/uengine/data/rootfs/data/misc/adb/adb_keys

重启adb server后再次连接就成功了。

0x04 解决高分辨率电脑上显示较小问题

uengine默认使用的分辨率为:540x960,而且缩放比例是1,导致在高分辨率电脑上看起来不仅窗口小,而且字也比较小。这种情况可以通过在/usr/share/uengine/appetc目录下写入应用配置文件来解决。例如,对于Android QQ可以使用以下配置:

cat com.tencent.mobileqq.txt

verticalWidth 1080
verticalHeighe 1920
horizontaltWidth 1920
horizontaltHeighe 1080
verticalScreen  1  
allowFullScreen 1 
allowScreenSwitching 1
defaultFullScreen 0

logicalDensityDpi 400
physicalDpi 72
appWidth 1080
appHeight 1920
logicalWidth 1080
logicalHeight 1920

com.tencent.mobileqq要替换成实际应用的包名;logicalDensityDpi参数用于控制缩放比例,160表示没有缩放,320表示放大一倍。可以根据电脑实际情况修改这些参数值。

0x05 总结

使用容器方式跑Android系统比虚拟机方式更节省资源,启动也更快,更接近于原生应用的体验。这种方式也会逐渐成为各大Linux系统均支持的能力,具有较大的应用潜力。

分享