最近在研究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.编译过程
因为是模拟器,选择x86
$ cd ~/aosp
$ source build/envsetup.sh
$ lunch aosp_x86_64-eng
$ 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
3.替换模拟器
通过Android Studio下载模拟器文件路径一般在如下目录,其中xxxx是全局变量[ANDROID_SDK_HOME]所在位置,默认在C:\Users\xxxx\.android
xxxxxx/.android\avd\Pixel_7_API_34.avd
在上述目录下查看,是没有一般常识中的system.img,vendor.img的,这些文件实际位置在Android SDK中
例如:D:\Tools_dev\AndroidSDK\system-images\android-34\default\x86_64
D:\Tools_dev\AndroidSDK就是Android SDK所在目录
然后就好办了,首先确认我编译的是Android 14,对于api level是34,那么替换android-34\default\x86_64目录下的文件;我的电脑中实际还有个android-34\google_apis_playstore\x86_64目录,盲猜是带gms版本的,我用不上,没管。
第一步:
拷贝文件:把out\target\product\generic_x86_64下编译好的镜像文件重命名
system-qemu.img=>system.img
ramdisk.img--保持现状
vender-qemu.img=>vender.img
prebuilt/sdk/linux-kernel/kernel-ranchu-64-保持现状
system/build.prop-保持现状
把这几个文件改名替换到模拟器所在目录[android-34\default\x86_64]中,替换同名文件
第二步:
到AVD Manager中wipe data,然后重启模拟器
4. 模拟器运行
这个就不多说了
5.小技巧
如果仅是替换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)
然后重新编译出system.img,这个img里面的jar包,apk都是可以替换的