Skip to content

Commit

Permalink
add oracle-arm-redroid post
Browse files Browse the repository at this point in the history
  • Loading branch information
resticDOG committed Dec 6, 2023
1 parent deb79c3 commit 22447dc
Show file tree
Hide file tree
Showing 3 changed files with 263 additions and 20 deletions.
32 changes: 18 additions & 14 deletions content/posts/android-x86-pve.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,28 @@ toc:

现阶段能作为选择的有3种方案:

- 1. ChromeOS首当其冲的就是基
[Chromium OS](https://www.chromium.org/chromium-os/)的ChromeOS及其他发行
版如国内的[FydeOS](https://fydeos.io/),这系统号称老电影福音,具有完整的桌
面环境并兼容Android应用,可惜对于显卡的兼容性不是很好,而虚拟机能使用3D加速
的显卡,除了显卡直通外还有一种就是最近一两年积极维护
- 1. **ChromeOS**:

首当其冲的就是基于[Chromium OS](https://www.chromium.org/chromium-os/)
ChromeOS及其他发行版如国内的[FydeOS](https://fydeos.io/),这系统号称老电影
福音,具有完整的桌面环境并兼容Android应用,可惜对于显卡的兼容性不是很好,而
虚拟机能使用3D加速的显卡,除了显卡直通外还有一种就是最近一两年积极维护
[VirtualGL](https://wiki.archlinux.org/title/VirtualGL),所以ChromeOS在
VirtualGL下运行是否可行还得画个问号,后面再折腾。

- 2. 容器化方案-Waydroid,Redroid第二种方案就是借助容器化cgroup,namespace等功能
的容器化方案,这种方案启动快速,可使用宿主机硬件资源,也能使用宿主机GPU 进
行 3D 加速, 但是对于Nvidia的显卡兼容性很差。运用pve创建一个lxc容器来运行
docker redroid容器也能运行,后续折腾一下这个方案。
- 2. **容器化方案 -`Waydroid` or `Redroid`**:

第二种方案就是借助容器化`cgroups``namespace` 等内核技术的容器化方案,这种
方案启动快速,可使用宿主机硬件资源,也能使用宿主机GPU进行3D加速, 但是对于
Nvidia的显卡兼容性很差。运用pve创建一个lxc容器来运行docker redroid容器也能
运行,后续折腾一下这个方案。

- 3. **Android-x86:**

- 3. Android-x86 [Android-x86](https://www.android-x86.org/) 在AOSP的基础上增加
x86平台的支持,可通过native-bridge转义arm指令从而运行arm应用,同样称为老电
脑福音,GPU兼容性较好,兼
[VirtualGL](https://wiki.archlinux.org/title/VirtualGL) ,今天我们就来在
pve中尝试一下这个系统有什么妙处。
[Android-x86](https://www.android-x86.org/) 在AOSP的基础上增加x86平台的支
持,可通过native-bridge转义arm指令从而运行arm应用,同样称为老电脑福音,GPU
兼容性较好,兼容[VirtualGL](https://wiki.archlinux.org/title/VirtualGL)
今天我们就来在pve中尝试一下这个系统有什么妙处。

## 2. 安装Android-x86

Expand Down
13 changes: 7 additions & 6 deletions content/posts/oneplus3T-lineageOS-install.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ layout: post

tags:
- 折腾
- Android
categories:
- Android
lightgallery: true
Expand All @@ -18,14 +19,14 @@ toc:
最近在在使用scrcpy连接手机发现音频的传输需要系统在Android 10以上,然而这个手机早
已失去了官方的支持,最终最新版系统停留在安卓9.0,幸好这手机在国外很受欢迎,有
[LineageOS](https://download.lineageos.org/devices/oneplus3/builds) 的官方支持,
最新的系统也有基于Android 11 的 `LineageOS 18`,今天就来记录一下安装过程。
最新的系统也有基于Android 11 的 `LineageOS 18.1`,今天就来记录一下安装过程。

> 本文不是教程文章,只是自己的折腾记录,如果你要按照本文的方式来操作,请确保你了
> 解必要的手机刷机的知识如 adb、fastboot、解锁 bootload 等。
> 解必要的手机刷机的知识如 adb、fastboot、解锁 bootloader 等。
![image.png](https://img.linkzz.eu.org/main/images/2023/11/a33f29c483d4231a3d9135e2431961ba.png)

## 1. 解锁 Bootload, 刷入第三方 recovery
## 1. 解锁 Bootloader, 刷入第三方 recovery

手机刷机第一步,由于我的一加3T很早以前就已经解锁BL并刷入了第三方TWRP recovery,
这里就写一写步骤就好了
Expand All @@ -41,10 +42,10 @@ Mac和Linux系统无须安装usb驱动,但在Windows上则必须安装,否

![image.png](https://img.linkzz.eu.org/main/images/2023/11/fcdffc63063c8d58a1bb5efe24b39fec.png)

下载之后是setup exe文件,点击安装之后用手机连接Windows,设备管理器里没有Android
设备的感叹号就好了
下载之后是 `setup.exe` 文件,点击安装之后用手机连接Windows,设备管理器里没有
Android设备的感叹号就好了

### 1.2 解锁 Bootload
### 1.2 解锁 Bootloader

安装 adb 工具

Expand Down
238 changes: 238 additions & 0 deletions content/posts/oracle-arm-redroid.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
---
title: 甲骨文免费Arm主机新玩法-云安卓手机
date: 2023-12-06
description: "甲骨文免费Arm主机新玩法-云安卓手机"
layout: post

tags:
- 折腾
- Android
- Docker
- Linux
categories:
- Android
- Linux
lightgallery: true

toc:
auto: true
---

## 1. 前言

我的一篇 [文章](posts/android-x86-pve/) 中有提到过云安卓手机的项目-redroid,该
[项目](https://github.com/remote-android/redroid-doc) 基于容器技术,构建一个安卓
的运行时,同时通过Linux的内核模块,支持调用宿主机的硬件资源,同时其可运行于
`x86` 架构之上,通过转译来运行仅支持 `arm` 架构的安卓应用,用来跑app测试可以一
试,正好甲骨文的arm主机资源没有好好利用,今天就来折腾一下这个玩法。

## 2. 加载内核模块 ashmem_linux、binder_linux

### 2.1 基于 `Ubuntu 20.04` 以上发行版

这两个模块是容器运行必须的内核模块,按照官方文档,在 `Ubuntu 20.04` 以上版本中,
这两个模块已经编译到内核里了,可以直接 `modprobe` 命令加载,所以如果你的
`arm服务器` 正好是`Ubuntu 20.04` 以上版本,按照一下命令即可运行:

```bash
# 安装额外内核模块
apt install linux-modules-extra-`uname -r`
# 加载内核模块
modprobe binder_linux devices="binder,hwbinder,vndbinder"
modprobe ashmem_linux

# 运行容器
docker run -itd --rm --privileged \
--pull always \
-v ~/data:/data \
-p 5555:5555 \
redroid/redroid:11.0.0-latest \
androidboot.redroid_gpu_mode=guest
```

### 2.2 Oracle Linux 8

否则如果你像我一样开主机的时候选了 `Oracle Linux 8` 的话,很遗憾,官方没有该系统
的运行文档,以上两个内核模块也并没有编译,奈何我对该发行版不熟,升级了官方内核到
`5.10` 版本来编译redroid提供的两个内核模块的
[源码](https://github.com/remote-android/redroid-modules) ,最终用
`amazonlinux2` 的分支可已正常编译`ashmem`模块,然而另一个 `binder` 模块始终无法
编译成功。

```bash
# Amadevel-uname-r == `uname -r`"
sudo make # build kernel modules
sudo make install # build and install *unsigned* kernel modules
```

### 2.3 Debian 10

于是我又想到了,`Ubuntu` 起源于 `Debian`,那倘若我将系统dd成Debian是否就可以正常
加载这些内核模块了呢,于是我找到了一个手动
[重装的教程](https://lala.im/7905.html) 该教程基于网络安装,是走的官方渠道获取的
系统镜像,不用担心被植入后门,这也是为什么不选择那些 `一键dd脚本` 的原因,缺点是
只能安装 `Debian 10` ,较新的 `Debian 11` 只能装完之后再寻求升级方法了。

比较顺利系统安装成功之后顺利登录系统,看了一下系统内核版本是 `4.19` 版本,还是有
点老,于是从官方库升级了一下最新的稳定版内核 `5.10`~~开始编译以上两个模块,这
次很顺利编译成功了(虽然报了几个警告)~~,看了官方内核已经编译了两个内核模块,果
然和 `Ubuntu 20.04` 以上版本一样,2个内核模块都可以加载。按照官方的教程开始运行
容器:

```bash
# 加载内核模块
modprobe ashmem_linux
modprobe binder_linux devices=binder1,binder2,binder3,binder4,binder5,binder6
# 修改权限
chmod 666 /dev/binder*
chmod 666 /dev/ashmem

# 运行容器
docker run -itd --rm --privileged \
--pull always \
-v /dev/binder1:/dev/binder \
-v /dev/binder2:/dev/hwbinder \
-v /dev/binder3:/dev/vndbinder \
-v ~/data11:/data \
-p 5555:5555 \
--name redroid11 \
redroid/redroid:11.0.0-latest \
androidboot.redroid_gpu_mode=guest

# adb 连接容器
adb connect arm-2

# scrcpy 连接
scrcpy -e
```

然而在 `scrcpy` 连接容器的时候却报了个错:

```log
[server] ERROR: Could not create default video encoder for h264
List of video encoders:
(none)
[server] ERROR: Exception on thread Thread[video,5,main]
java.lang.IllegalArgumentException: Failed to initialize video/avc, error 0xfffffffe (NAME_NOT_FOUND)
at android.media.MediaCodec.native_setup(Native Method)
at android.media.MediaCodec.<init>(MediaCodec.java:2000)
at android.media.MediaCodec.<init>(MediaCodec.java:1978)
at android.media.MediaCodec.createEncoderByType(MediaCodec.java:1933)
at com.genymobile.scrcpy.ScreenEncoder.createMediaCodec(ScreenEncoder.java:229)
at com.genymobile.scrcpy.ScreenEncoder.streamScreen(ScreenEncoder.java:73)
at com.genymobile.scrcpy.ScreenEncoder.lambda$start$0$com-genymobile-scrcpy-ScreenEncoder(ScreenEncoder.java:294)
at com.genymobile.scrcpy.ScreenEncoder$$ExternalSyntheticLambda0.run(Unknown Source:4)
at java.lang.Thread.run(Thread.java:1012)
INFO: Renderer: opengl
INFO: OpenGL version: 4.6 (Compatibility Profile) Mesa 22.3.3
INFO: Trilinear filtering enabled
```

scrcpy报告找不到有效的视频编码器,然而虽然甲骨文的arm主机没有给gpu资源,但是看了
用cpu 编码也是可行的呀,为啥运行不了,最终在这个
[Issue](https://github.com/remote-android/redroid-doc/issues/407) 下面找到了答
案,那即是在编译的内核中需要启用内核 `codec2` 的支持,于是最终还是走到了自己编译
内核这步。

### 2.4 自编译Debian的内核

Debian的内核源码以软件包的方式提供,我们搜索一下最新的源码包:

```bash
~ apt search ^linux-source
Sorting... Done
Full Text Search... Done
linux-source/oldstable 5.10.197-1 all
Linux kernel source (meta-package)

linux-source-5.10/oldstable,now 5.10.197-1 all
Linux kernel source for version 5.10 with Debian patches
```

可以看到最新的 `5.10` 的源码, 安装:

```bash
sudo apt install linux-source-5.10
```

在用户目录中编译:

```bash
# 创建目录
mkdir ~/kernel; cd ~/kernel
# 解压内核源码
tar -xaf /usr/src/linux-source-5.10.tar.xz
```

至于为什么不在 `/usr/src` 目录中用 root 编译,官方是这么说的, 我认为非常合理:

> 传统上,Linux内核源代码放置于 `/usr/src/linux/`,需要root权限才能编译。但是,
> 在不需要时应避免使用管理员权限。`src` 群组的成员也可以使用该文件夹,但是应避免
> 使用 `/usr/src/`。把核心源代码置于个人文件夹时,应把安全放在第一位:在
> `/usr/` 内的文件都应明确其在软件包系统内的作用,试图收集内核使用的信息时,不能
> 在读取 `/usr/src/linux` 时误导程序。
配置内核:

```bash
# 先将原本的内核配置保留,在原基础上修改
cp /boot/config-5.10.0-26-arm64 ~/kernel/linux-source-5.10/.config
vim ~/kernel/linux-source-5.10/.config
```

修改一下内容:

```config
CONFIG_DMABUF_HEAPS=y
CONFIG_DMABUF_HEAPS_SYSTEM=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
```

开始编译:

```bash
make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
```

开始漫长的等待,期间有可能提示缺少某个包之类的,按照提示处理一下即可,处理编译建
议单线程,然后经过2天试错之后终于编译完成。安装内核:

```bash
sudo dpkg -i ../linux-image*.deb
# 重启
sudo reboot
```

重启之后重复 `2.3` 的运行步骤即可成功运行, 运行后的一下截图:

![image.png](https://img.linkzz.eu.org/main/images/2023/12/b23ada35a18404e8952cd3b68216a328.png)

![image.png](https://img.linkzz.eu.org/main/images/2023/12/1cf8250b034f8c58c311a9ac5ce3d6ff.png)

运行效果:

![redroid-oracle-arm.gif](https://img.linkzz.eu.org/main/images/2023/12/b3ac2d75502895045eda2e20d9da7c45.gif)

## 3. 结语

从上一张的GIF运行效果图相比大家也不难看出,这个云安卓的效率也不是很强,虽然能运
行安卓应用,但是帧数很低,这是因为以下几个原因:

1. **网络问题**

我的主机位置在韩国春川,家宽为联通,最近两边的网络延迟已经飙升到200了,还时常
伴随丢包,所以操作有很大延迟,对延迟很敏感的应用肯定不适合运行。

2. **配置问题**

我开了2台Arm,所以这台的配置为 `2C12G` 没有硬件加速的情况下cpu压力太大,下面
是运 行抖音播放视频时的资源占用截图:

![image.png](https://img.linkzz.eu.org/main/images/2023/12/66086810e53e4df2454132feeeb66fb8.png)

3. **容器问题**

容器在用纯CPU下仅有15Hz的刷新率,使得在源头上就不可能流畅。

**总结**:适合用来做一些静态应用的测试,或者一些挂机的应用,日常使用还是算了。

0 comments on commit 22447dc

Please sign in to comment.