前言

  在自学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是上一个系统创建的,新的系统有时候会无法访问,这里我试过两种方式,都是可行的,只要不是剪切重命名貌似都可以

  1. 使用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

本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。