观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

版权声明

本文来自博客园,作者:观心静 ,转载请注明原文链接: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

posted on 2023-11-13 10:22  观心静  阅读(414)  评论(0编辑  收藏  举报