最近在研究Android Entreprise部分的特性,需要在Android手机上分析WorkProfile相关的源码,因为新买的Pixel样机还未到货,看了几天Android源码,迫切需要上真机对比分析。
又听说最近几年Android模拟器已经有些进步,至少性能比以前好多了,于是打算把Android Studio中废弃多年的AVD跑起来。一试,果真性能有进步,不算流畅,但点击操作没以前那种老马拉大车的感觉,所以打算切换到模拟器环境下,凑合用几天等真机。
当前,因为涉及framework中代码逻辑的变化,迫切要解决模拟器镜像不能修改的问题,摸索加查资料几天,过程记录如下
编译环境是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
因为是模拟器,选择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区解决
解决过程:
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机器上
介绍两种模拟器运行方式:
【方案一】
首先在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版本的虚拟机,是否合适,请自行判断
这个就不多说了,因为是eng版本,是有root的,可以修改系统配置或者替换AOSP的apk,
如果使用模拟器过程,需要修改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!