前言
在自学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 ~/bincurl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repochmod +x repocp repo ~/bin
配置repo环境变量
vim ~/.bashrc#添加下面两行环境变量配置 !wq 保存退出PATH=~/bin:$PATHexport REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'#环境变量生效source ~/.bashrc
下载代码创建目录并下载aosp代码
mkdir aosp && cd aosprepo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r36repo 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 24make -j10
通常编译需要3小时,编译成功如下图:
编译成功后在out/下生成相应的img,如下图
如果你要编译其他平台
可以通过只输入lunch 查看可以编译的各个平台
zhou@DESKTOP-9QKQBJG:~/aosp$ lunchYou're building on LinuxLunch 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
启动模拟器,验证编译成果
编译完成系统后,我们需要一个模拟器去启动验证编译完成的系统。这里建议是直接使用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$ emulatoremulator: WARNING: Couldn't find crash service executable /home/zhou/aosp/prebuilts/android-emulator/linux-x86_64/emulator64-crash-serviceemulator: 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常用编译和查找命令
- m :等同于 make ,进行一次完整编译。
- mm:在当前目录下编译所有模块,但不包括依赖项。
- mmm [目录]:编译指定目录下的所有模块,但不包括依赖项。只编译指定模块:mmm [dir/:target1,target2]
- mma:在当前目录下编译所有模块,包括依赖项。
- mmma [目录]:编译指定目录下的所有模块,包括依赖项。
- make clean:删除整个 out/ 目录。
- make clobber:用于清除编译缓存。
- make snod:当重新编译部分模块完成后,快速生成img文件。
- cgrep:对C/C++文件执行 grep (只搜寻C/C++文件类型,也包括.h类型)。
- jgrep:只对Java文件执行 grep (只搜寻Java文件类型)。
- resgrep:只匹配 /res 目录下的 xml 文件。
- sepgrep:只查找sepolicy文件。
替换ext4.vhdx的方式(存疑)
ext4.vhdx就是linux的虚拟硬盘,我们下载完成aosp后,在其他电脑上如果需要实现系统编译,在下载一次aosp的海量代码,不太现实,可以通过替换ext4的方式实现
将旧的ext4.vhdx文件copy到新的里,避免权限问题,因为旧的ext4.vhdx是上一个系统创建的,新的系统有时候会无法访问,这里我试过两种方式,都是可行的,只要不是剪切重命名貌似都可以
- 使用copy命令,或者在文件管理器里复制粘贴进行覆盖
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
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。