编译Android14 AOSP原生代码并在X86模拟器中运行

最近在研究Android Entreprise部分的特性,需要在Android手机上分析WorkProfile相关的源码,因为新买的Pixel样机还未到货,看了几天Android源码,迫切需要上真机对比分析。

又听说最近几年Android模拟器已经有些进步,至少性能比以前好多了,于是打算把Android Studio中废弃多年的AVD跑起来。一试,果真性能有进步,不算流畅,但点击操作没以前那种老马拉大车的感觉,所以打算切换到模拟器环境下,凑合用几天等真机。

当前,因为涉及framework中代码逻辑的变化,迫切要解决模拟器镜像不能修改的问题,摸索加查资料几天,过程记录如下

1.编译准备

编译环境是Ubuntu20.04,Hyper-V上安装的虚拟机,20G内存,NVME1T硬盘。安装编译依赖:

$ sudo apt update
$ sudo apt install flex bison build-essential zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc fontconfig -y
$ sudo apt install make git-core gnupg zip unzip curl python3 openjdk-11-jdk -y

安装repo:

$ echo `export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'` >> ~/.bashrc 
$ source ~/.bashrc 

下载代码:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r2
repo sync -c -j8

android版本tag可以从如下页面中查询

https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

2.编译过程

因为是模拟器,选择sdk_pc_x86_64-userdebug

$ cd ~/aosp
$ source build/envsetup.sh
$ lunch sdk_pc_x86_64-userdebug
$ make -j8

正常就可以编译成功,内存建议16G以上,否则开头有个告警,实际编译也会出怪异问题

如果是报内存溢出,建议如下方式解决:

export MAVEN_OPTS="-Xms5120m -Xmx5120m"
export _JAVA_OPTIONS="-Xmx5120m"
# 也可以添加 .bashrc 最后,修改.bashrc记得source .bashrc


#记得清除out目录,重编译
rm -rf out  

实际编译,还出现了怪异问题,后来通过重新创建并扩大swap区解决

编译Android14 AOSP原生代码并在X86模拟器中运行_第1张图片

解决过程:

1. 查看交换区大小
free -m 
2. 关闭原来的swap文件
sudo swapoff /swapfile
3. 删除原来的swpa文件
sudo rm /swapfile
4. 重新创建spap文件
sudo dd if=/dev/zero of=/swapfile bs=1G count=16
5. 赋予权限
sudo chmod 0600 /swapfile
6.创建文件系统
sudo mkswap -f /swapfile
7. 开启swapfile
sudo swapon /swapfile

编译完成后,在aosp目录,执行如下命令,打包模拟器x86镜像

make emu_img_zip

生成的压缩包在路径:out\target\product\emulator64_x86_64\sdk-repo-linux-system-images-eng.xxxx.zip

然后把压缩包拷贝到window机器上

3.创建模拟器镜像

介绍两种模拟器运行方式:

【方案一】

首先在Android Studio中任意新建一个模拟器,名称任意,例如 PIXEL5

然后把步骤2中的压缩包,解压到任意纯英文目录下,例如D:\avd-files\,注意,解压后D:\avd-files\x86_64目录下包含了,system.img,vendor.img等镜像文件

然后添加windows环境变量,把如下目录加入环境变量中的path

D:\ToolsDev\android-sdk\emulator

D:\ToolsDev\android-sdk\是我的android-sdk路径,实际用你的替换

随后,在windows的cmd命令行中执行如下命令,模拟器就运行起来了

emulator -avd PIXEL5 -sysdir D:\avd-files\x86_64

【方案二】

如果嫌命令行启动麻烦,改环境变量之类的,那么可以找到android-sdk路径下的system-images目录,把上述编译生成压缩包中的文件替换同名文件,这样在Android Studio图形化界面启动的虚拟机的已经是修改后的了。

路径一般是$Android-sdk/system-images/android-34/default/x86_64,注意android-34,替换成你使用的api版本号,$Android-sdk替换成android-sdk的真实路径

说明下,这种方式会影响所有使用对应sdk版本的虚拟机,是否合适,请自行判断


 

4. 模拟器运行

这个就不多说了,因为是eng版本,是有root的,可以修改系统配置或者替换AOSP的apk,

5.小技巧

如果使用模拟器过程,需要修改framework/app代码,但不想重新执行第二步中的操作,仅是替换framework中的个别文件,例如service.jar,因为编译的镜像是有root的,所以可以直接替换,但实际需要改如下文件,把odex版本改成dex版本,方能替换成功。

1)build\make\core\board_config.mk

WITH_DEXPREOPT := true  改为 WITH_DEXPREOPT := false

2)build\make\core\dex_preopt_config.mk

注释掉 :##$(call pretty-error, DEXPREOPT must be enabled for user and userdebug builds)

修改上述代码后,编译出对应的二进制,然后用adb root,adb push命令替换掉原镜像中的二进制。

同样要说明,这种方式修改的单个虚拟机中的文件,其他使用相同sdk版本的虚拟机,均会受影响,请自行判断是否采用。

至此,教程结束,enjoy!

你可能感兴趣的:(android,AOSP,模拟器)