版权声明
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17815468.html
前言
在自学framework的时候,最大的难题就是如何动手实践修改framework并且看到实践效果。但是Android系统是需要linux环境下编译的,我们一般的个人电脑都是windows系统,所以为了学习framework重装电脑为linux系统有点不太实际。个人也试过虚拟机,但是系统资源开销太大了,而且也非常繁琐。 最后发现了Windows系统下的WSL可以满足编译Android系统的需求,并且效果十分不错,也比虚拟机更加高效。
参考官方文档
https://source.android.google.cn/docs/setup/build/building?hl=zh-cn
硬件要求
电脑要求内存最少32G/ 硬盘空间600GB以上 (Aosp的代码量庞大), 请注意,这里说的32GB内存在wsl虚拟机里会打对折变成16GB,这刚好够用。
Windows系统相关准备
1.首先要求windows10以上,并且有微软商城。
2.设置电脑相关配置
3.在商城中搜索 linux 关键字, 选择下载ubn-18.04.6版本
更新wsl内核
Linux 内核更新包会安装最新版本的 WSL 2 Linux 内核,以便在Windows 操作系统映像中运行 WSL。(若要运行 Microsoft Store 中的 WSL并更频警地推送更新请使用 wsl.exe --install 或 wsl.exe --update)
初始化linux系统
打开后创建账号与密码(这个密码很重要是sudo权限的密码,请牢记)
迁移WSL到其他盘中
因为wsl是默认在c盘安装的,但是后续我们还需要拉取aosp,c盘空间无法承载。这里我们需要将wsl搬迁到其他硬盘中(个人是建议用一个1TB的移动硬盘,这样你就可以不受限制的在各种设备上进行编译)。
打开cmd命令行,如下步骤操作:
第一步,查看状态并且停止
如果Running运行状态,关掉它(注意如果你的wsl正在运行,先将wsl关闭在输入下面的命令)
wsl --shutdown
第二步,搬迁位置
wsl --export Ubuntu-18.04 Z:\Ubuntu_WSL_18046\Ubuntu.tar
第三步,注销原来的wsl
wsl --unregister Ubuntu-18.04
第四步,重新导入新位置的wsl
wsl --import Ubuntu-18.04 Z:\Ubuntu_WSL_18046 Z:\Ubuntu_WSL_18046\Ubuntu.tar -->> 注意这里有2个路径
生成成功会在目录下多一个虚拟磁盘ext4.vhdx 文件
第五步,重新设置默认名称
Ubuntu1804 config --default-user zhou
编译环境
首先更新全部的软件
cd ~/ && sudo apt-get update
安装git和python
sudo apt install git python
配置repo环境
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
cp repo ~/bin
配置repo环境变量
vim ~/.bashrc
#添加下面两行环境变量配置 !wq 保存退出
PATH=~/bin:$PATH
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
#环境变量生效
source ~/.bashrc
下载代码
创建目录并下载aosp代码
mkdir aosp && cd aosp
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r36
repo sync -c
编译Android 10
#安装依赖工具链
sudo apt-get install libncurses5 libgl1-mesa-dev g++-multilib flex bison gperf build-essential tofrodos python-markdown libxml2-utils xsltproc dpkg-dev libsdl1.2-dev git-core gnupg flex bison gperf zip curl zlib1g-dev gcc-multilib libc6-dev-i386 x11proto-core-dev libx11-dev libgl1-mesa-dev libxml2-utils xsltproc unzip m4 ccache
#进入源代码根目录,编译
source build/envsetup.sh
#选择合适版本的模拟器,我电脑是x86-64 CPU,
#需要编译一个流畅运行的x86-64架构模拟器系统,这里最好编译选择24. aosp_x86_64-eng ,
#编译arm架构的模拟器在WINDOW上运行会非常慢,不建议。
lunch 24
make -j10
通常编译需要3小时,编译成功如下图:
编译成功后在out/下生成相应的img,如下图
如果你要编译其他平台
可以通过只输入lunch 查看可以编译的各个平台
zhou@DESKTOP-9QKQBJG:~/aosp$ lunch
You're building on Linux
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_blueline-userdebug
4. aosp_bonito-userdebug
5. aosp_car_arm-userdebug
6. aosp_car_arm64-userdebug
7. aosp_car_x86-userdebug
8. aosp_car_x86_64-userdebug
9. aosp_cf_arm64_phone-userdebug
10. aosp_cf_x86_64_phone-userdebug
11. aosp_cf_x86_auto-userdebug
12. aosp_cf_x86_phone-userdebug
13. aosp_cf_x86_tv-userdebug
14. aosp_coral-userdebug
15. aosp_crosshatch-userdebug
16. aosp_flame-userdebug
17. aosp_marlin-userdebug
18. aosp_sailfish-userdebug
19. aosp_sargo-userdebug
20. aosp_taimen-userdebug
21. aosp_walleye-userdebug
22. aosp_walleye_test-userdebug
23. aosp_x86-eng
24. aosp_x86_64-eng
25. beagle_x15-userdebug
26. car_x86_64-userdebug
27. fuchsia_arm64-eng
28. fuchsia_x86_64-eng
29. hikey-userdebug
30. hikey64_only-userdebug
31. hikey960-userdebug
32. hikey960_tv-userdebug
33. hikey_tv-userdebug
34. m_e_arm-userdebug
35. mini_emulator_arm64-userdebug
36. mini_emulator_x86-userdebug
37. mini_emulator_x86_64-userdebug
38. poplar-eng
39. poplar-user
40. poplar-userdebug
41. qemu_trusty_arm64-userdebug
42. uml-userdebug
如果需要重编system.img文件
make snod # 快速打包生成最新的system.img文件
启动模拟器,验证编译成果
编译完成系统后,我们需要一个模拟器去启动验证编译完成的系统。这里建议是直接使用wsl下aosp自带的模拟器。有些人可能会疑惑wsl下的linux是纯命令行的啊,怎么能支持图形下的模拟器呢?没错不用怀疑,wsl支持打开一个Android模拟器。
而且用aosp自带的模拟器还有一些好处,首先可以不需要去将编译后的庞大的代码拷贝到windows上了,其次直接拷贝到windows不等于Android studio上的模拟器能启动(而且经常错误启动到avd创建的模拟器上)。
首先需要设置下源
zhou@DESKTOP-9QKQBJG:~/aosp$ source build/envsetup.sh
然后,继续配置目标版本
zhou@DESKTOP-9QKQBJG:~/aosp$ lunch 24
接着,设置下要启动的系统路径
zhou@DESKTOP-9QKQBJG:~/aosp$ export ANDROID_PRODUCT_OUT=~/aosp/out/target/product/generic_x86_64/
然后启动模拟器
zhou@DESKTOP-9QKQBJG:~/aosp$ emulator
请注意!直接执行emulator是默认热启动(热启动会让一些修改看不到效果),如果你修改了framework重新编译了,请使用emulator -wipe-data ,直接擦除data数据,让模拟器重新冷启动加载系统。
如果出现需要权限:
zhou@DESKTOP-9QKQBJG:~/aosp$ emulator
emulator: WARNING: Couldn't find crash service executable /home/zhou/aosp/prebuilts/android-emulator/linux-x86_64/emulator64-crash-service
emulator: WARNING: system partition size adjusted to match image file (3083 MB > 800 MB)
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)
给它权限,然后在执行emulator
zhou@DESKTOP-9QKQBJG:~/aosp$ sudo chmod -R 777 /dev/kvm
启动后的效果图
AOSP常用编译和查找命令
与查找相关的命令
- cgrep:对C/C++文件执行 grep (只搜寻C/C++文件类型,也包括.h类型)。
- jgrep:只对Java文件执行 grep (只搜寻Java文件类型)。
- resgrep:只匹配 /res 目录下的 xml 文件。
- sepgrep:只查找sepolicy文件。
与重新编译相关的命令
- m :等同于 make ,进行一次完整编译。
- mm:在当前目录下编译所有模块,但不包括依赖项。
- mmm [目录]:编译指定目录下的所有模块,但不包括依赖项。只编译指定模块:mmm [dir/:target1,target2]
- mma:在当前目录下编译所有模块,包括依赖项。
- mmma [目录]:编译指定目录下的所有模块,包括依赖项。
- make snod:当重新编译部分模块完成后,快速生成img文件。
- make update-api:更新API,在framework API改动后需执行该指令,Api记录在目录frameworks/base/api
与清除相关的命令
- make clean:删除整个 out/ 目录,等价于rm -rf out/
- make clobber:用于清除编译缓存,与make clean一样
- make clean-<local_module> : 单独清除某个模块,例如 make clean-SystemUI ,就是删除 SystemUI 模块的编译产物和中间件
- make dataclean :会删除out目录下对应板级目录中data分区相关文件
- make installclean : 常用的编译命令,用于清除编译过程中生成的所有文件,包括编译生成的二进制文件、中间文件以及编译日志等. 为什么需要使用 make installclean ?在Andd编译时程中,编译过程会生成大量的临时文件和中间文件,这些文件不仅会占用磁盘空间,还可能导致编译过程出错,或者在编译新的代码时发生冲突。因此,为了保证编译的正常进行,我们需要定期清除这些临时文件和中间文件。会删除如下文件:
out/target/product/<product_name>/data/nativetest out/target/product/<product_name>/data/nativetest64 out/target/product/<product_name>/apusys.img out/target/product/<product_name>/cam_vpu1-verified.img out/target/product/<product_name>/cam_vpu1.img out/target/product/<product_name>/cam_vpu2-verified.img out/target/product/<product_name>/cam_vpu2.img out/target/product/<product_name>/cam_vpu3-verified.img out/target/product/<product_name>/cam_vpu3.img out/target/product/<product_name>/dpm-verified.img out/target/product/<product_name>/dpm.img out/target/product/<product_name>/mcupm.img out/target/product/<product_name>/spmfw-verified.img out/target/product/<product_name>/spmfw.img out/target/product/<product_name>/sspm.img out/target/product/<product_name>/tee-verified.img out/target/product/<product_name>/tee.img out/target/product/<product_name>/data out/target/product/<product_name>/obj/PACKAGING out/target/product/<product_name>/ramdisk out/target/product/<product_name>/debug_ramdisk out/target/product/<product_name>/vendor_ramdisk out/target/product/<product_name>/recovery out/target/product/<product_name>/root out/target/product/<product_name>/system out/target/product/<product_name>/system_dlkm out/target/product/<product_name>/vendor out/target/product/<product_name>/vendor_dlkm out/target/product/<product_name>/obj/FAKE out/target/product/<product_name>/odm_dlkm out/target/product/<product_name>/testcases out/target/product/<product_name>/symbols
替换ext4.vhdx的方式
ext4.vhdx就是linux的虚拟硬盘,我们下载完成aosp后,在其他电脑上如果需要实现系统编译,在下载一次aosp的海量代码,不太现实,可以通过替换ext4的方式实现
使用copy命令,或者在文件管理器里复制粘贴进行覆盖 (也可以是直接操作文件复制黏贴替换,但是要求对ext4.vhdx这个名称不做修改)
copy D:\Ubuntu-18.04-wsl-old\ext4.vhdx D:\Ubuntu-18.04-wsl\ext4.vhdx
编译中可能会出现问题
内存不足或者swap空间不足
内存不足解决思路一
有可能真的是你的电脑内存不足够提供编译时所需的内存(最少16G只是建议,但是有可能16G都是不够使用的),这里建议直接增加内存条
内存不足解决思路二
配置内存
export MAVEN OPTS="-Xms8192m -Xmx8192m"
swap空间不足解决思路--增加空间
创建swap文件
安装操作系统分区时需创建swap分区
安装的时候如果没有创建分区,需要手动创建。
1. 查看内存情况
命令是free -h (h显示的是G, m 显示的是M) 或者free -m
2. 创建swap 分区
dd if=/dev/zero of=/tmp/swapfile1 bs=1024 count=10240000
其中 if=/dev/zero: 输入/dev/zero文件。/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件。就像使用临时交换文件.
of=/tmp/swapfile1: 输出到/tmp.swapfile1文件
bs=1024: 定义块大小为1024bytes,默认单位是bytes
count=10240000,总数大小为10240000个bs即10240000kb,换算的话是10G。
3. 指定分区类型为swap
mkswap /tmp/swapfile1
4. 设置swap 分区有效
swapon /tmp/swapfile1
5. 设置扩展的swap分区为自动挂载
vim /etc/fstab 进去之后自动挂载分区命令 编辑这个 /tmp/swapfile1 swap swap defaults 0 0也就是设置为这个命令之后保存就可以。
6. 测试添加是否成功
使用命令 free -h, 如果看到swap 分区中内存增加了,就表示成功啦。
如果刚才创建的想要关闭,删除创建的文件的话,就是用命令 swapoff /tmp/swapfile1, 就表示关闭这个分区了,然后删除的命令是 rm /tmp/swapfile1 。
python版本问题
如下问题是缺少python2.7版本
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 10
end
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/17815468.html