基于CentOS7.9编译Android10源码

背景

基于一台CentOS 7远程服务器,下载AOSP源代码Android 10,并且编译完成,运行安卓模拟器。由于后期开发面向系统级应用,为了方便调试,需要打开模拟器设备的可读/写权限。

工作内容有:

1、配置服务器环境

2、下载并编译源码

3、生成图形界面,运行安卓模拟器

4、设备可调试可读写

环境准备
安装python3
// 检查更新,安装系统包
yum update-check
yum update

通过repo下载安卓源代码要使用python3,服务器默认环境安装python2,因此需要从网上下载python3安装包,并切换。

// 安装python的依赖库
yum install gcc gcc-c++
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel make libffi-devel
// 下载python3
wget http://npm.taobao.org/mirrors/python/3.9.0/Python-3.9.0.tgz

// 解压
tar -zxvf Python-3.9.0.tgz  

// 进入文件夹
cd Python-3.9.0

// 配置安装位置到目录 /usr/local/python3 ..
./configure prefix=/usr/local/python3

// 安装
make && make install

安装成功后,在/usr/local/目录下面,会出现一个python3的文件夹
在这里插入图片描述

建立python3软链接

ln -s /usr/local/python3/bin/python3.9 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.9 /usr/bin/pip3

在这里插入图片描述

删除原有的python2链接,修改成python3链接

rm -rf /usr/bin/python
ln -s /usr/bin/python3 /usr/bin/python

在这里插入图片描述

由于CentOS系统的yum指令依靠python2来执行,此时也需要将相应的命令调整成python2

vim /usr/bin/yum
把 #! /usr/bin/python 修改为 #! /usr/bin/python2

vim /usr/libexec/urlgrabber-ext-down
把 #! /usr/bin/python 修改为 #! /usr/bin/python2

将系统python版本切换成python3之后,开始使用repo拉取AOSP源代码

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-10.0.0_r40

repo sync
编译源代码

安装JDK8

sudo yum install -y java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64 java-1.8.0-openjdk-headless.x86_64

安装依赖库

sudo yum install -y libstdc++.i686 libstdc++-devel.i686 perl cpio expat-devel gettext-devel autoconf glibc.i686 glibc-devel.i686 zlib-devel.i686 libX11-devel.i686 ncurses-devel.i686 ncurses-libs.i686 gperf flex bison patch unzip

此时需要注意,前面讲到repo拉取AOSP源码需要使用python3,这里在编译的时候却需要使用python2,否则会出现类似错误error: system-qemu-x86.img

@ 为了方便在python2和python3之间进行切换,可以使用alternatives指令,将不同的python版本加入进来,灵活地进行切换

// 首先确认系统原始状态
alternatives --display python
// 将不同版本加入系统
alternatives --install /usr/bin/python python /usr/bin/python2 1
alternatives --install /usr/bin/python python /usr/bin/python3 2
// 加入系统后再显示确认
alternatives --display python
// 进行选择配置
alternatives --config python

基于CentOS7.9编译Android10源码_第1张图片

一切准备就绪,开始编译AOSP源代码

source build/envsetup.sh
lunch 8
make -j16
运行模拟器
emulator 

模拟器运行期间,遇到如下问题,需要注意:

问题1:

qemu-system-x86_64: error while loading shared libraries: libpulse.so.0: cannot open shared object file: No such file or directory

解决:

yum install pluseaudio 

问题2:

emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
Please ensure KVM is properly installed and usable.
CPU acceleration status: This user doesn’t have permissions to use KVM (/dev/kvm)

解决:

yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python python-virtinst libvirt-client virt-install virt-viewer

lsmod |grep kvm // 查询kvm是否挂载成功

systemctl start libvirtd
systemctl enable libvirtd

问题3:

qemu_ram_alloc_user_backed: call
Segmentation fault

解决:

sudo setenforce 0
加载图形界面

如上操作后,基于AOSP源代码的安卓模拟器已经可以正常启动,但是由于我们是远程连接CentOS服务器编译运行,所以我们现在还看不到模拟器界面,要求在本地能够看到模拟器界面,因此需要借助一些工具。

大致思路如下:

本地Windows10机器采用 MobaXterm 连接远程CentOS服务器,在服务器上运行 GUI 程序 (即 安卓模拟器),通过 SSH X11 Forwarding,转发到本地进行界面显示。

安装图形依赖库

sudo yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils xorg-x11-fonts-Type1 xclock

配置参数

sudo vim /etc/ssh/sshd_config

修改关键的两个参数

基于CentOS7.9编译Android10源码_第2张图片

重启sshd服务

sudo systemctl restart sshd.service

基于CentOS7.9编译Android10源码_第3张图片

重新登录SSH,看到如上4个绿色勾勾,则表示辅助工具安装完成,测试一下

xclock

基于CentOS7.9编译Android10源码_第4张图片

运行xclock,可以看到服务器端的时钟界面出现在客户端Windows桌面上,说明图形通讯成功,

此时,我们再运行安卓模拟器,就可以看到界面效果了。

基于CentOS7.9编译Android10源码_第5张图片

调试模拟器
安装adb工具

系统默认没有安装,需要下载包解压

cd /opt
mkdir andSDK

wget https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip
unzip sdk-tools-linux-3859397.zip

将tools目录添加至环境变量

vim /etc/profile
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
export PATH=$PATH:/opt/andSDK/tools/bin

然后依靠sdkmanager安装platform-tools工具

sdkmanager --list
sdkmanager "platform-tools"

将platform-tools目录添加至环境变量

vim /etc/profile
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
export PATH=$PATH:/opt/andSDK/tools/bin
// 新添加地方
export PATH=$PATH:/opt/andSDK/platform-tools

重启登录后生效,可以使用adb命令

可读写权限

编译AOSP源码的时候,lunch选择userdebug版本,如果安卓版本较低,可以直接执行adb root && adb remount 即可。笔者使用的是安卓10,使用此方法会导致 remount failed,经过网上查阅大量资料和实际测验,使用如下方式可以成功将userdebug版本的安卓10模拟器remount

首先,我们需要使用"可写"的方式启动模拟器,谷歌官方对可写(-writable-system)是这样解释的:

在这里插入图片描述

emulator -writable-system 

​ 注:使用命令选项 -wipe-data 可以清除模拟器中数据。

直接参考谷歌说法,似乎remount会非常顺利,可实际情况是,这样启动的模拟器,依然没办法remount成功

基于CentOS7.9编译Android10源码_第6张图片

接下来的几个步骤非常重要,每一步的顺序可能都会影响remount效果

// 1. 获取root权限 
adb root
// 2. 关闭校验
adb shell avbctl disable-verity
// 3. 关闭启动时验证
adb shell avbctl disable-verification
// 4. 重启模拟器
adb reboot
===== 等待几秒钟,模拟器会自动重启,如果一直卡黑屏就重复上面的步骤执行 =====
// 5. 重新获取root权限
adb root
// 6. 挂载
adb remount

基于CentOS7.9编译Android10源码_第7张图片

在这里插入图片描述

最终可以看到:remount succeeded,这样我们就可以真正操作system分区下的文件,进行系统应用开发调试了。

你可能感兴趣的:(Android,android,centos)