Android官方是提供了Android 源码编译的方法,在国外的话就相对来说比较简单了,一是语言无障碍,二是网络无限制,在国内的话困难就比较多了,网络就是最大的一点限制

一、 源码编译

在编译之前首先明确一个概念repo

1.1 repo

定义: 一种代码版本管理工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库

它其实就是用来统一管理git 仓库的一个管理工具,有一系列的python脚本支撑,Android 源码的编译完全依赖于各类python 脚本的执行

1.2 使用外网下载Android 源码、编译

1. wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo
2. chmod 777 repo
3. cp repo /bin/

紧接着创建放置源码所需要的文件夹,我这边是AndroidSource
4. mkdir AndroidSource
5. cd AndroidSource
初始化repo 仓库
6. repo init -u https://dl-ssl.google.com/dl/googlesource/git-repo/repo
同步repo 的源码 (时间较长)
7. repo sync

进到源码目录,执行make 命令

1.2 使用清华ASOP镜像同步源码、编译

  • repo
1. git clone https://aosp.tuna.tsinghua.edu.cn/git-repo/
2. chmod a+x git-repo/repo
// 使用echo $PATH 命令查看一环境变量
3. export PATH=路径/git-repo:$PATH
// 配置好环境变量之后,使用vim 打开repo 文件,修改一下repo_url,repo的下载地址
4. sudo vim repo 使用vim编辑,找到repo_url 修改其路径为
 https://mirrors.tuna.tsinghua.edu.cn/git/git-repo

以上就是使用清华ASOP安装了repo

  • 下载源码
// 创建源码文件夹AndroidSource
1. mkdir AndroidSource
2. cd AndroidSource
3. repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
// 进到repo中的git 分支管理目录
4. cd .repo/manifests.git/
// 查看git 的所有分支
5. git branch -a
// 拉取指定版本的分支 android-8.1.0_r41 
6. repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r41
// 执行完毕之后 同步代码
7. repo sync

// 时间较长,期间遇到问题,重试几遍即可

查看下载的代码的版本:

Android源码已全编译过,在out/target/product/generic_arm64/system/build.prop里面查看ro.build.version.release的值
  • 编译

在编译之前确保已经进行了环境配置、所需工具、依赖等的安装《自我进阶(一) Android 源码编译,环境准备》

  • 编译之前看一下编译步骤中的操作的意义
  1. . build/envsetup.sh

主要作用:

  1. 加载了编译时使用到的函数命令,如 help、lunch、mmm等
  2. 添加两个编译选项: generic-eng 和 simulator ,两个选项是系统默认选项
  3. 查找vendor/<-厂商目录>/和vendor/<厂商目录>/build/目录下的vendorsetup.sh,如果存在的话,加载执行它,添加厂商自己定义产品的编译选项
    其实,上述第3条是向编译系统添加了厂商自己定义产品的编译选项,里面的代码就是:add_lunch_combo xxx-xxx。



// cd 到源码目录 初始化编译环境
4. . build/envsetup.sh
// 初始化编译环境后引入了一些执行脚本,包括lunch命令,lunch指令可以设置编译目标(编译目标就是编译后运行的设备) ,在此编译目标为aosp_arm64-eng
5. lunch aosp_arm64-eng
// j8 编译开启8个线程进行编译 最大不能超过CPU内核的2倍,可以使用cat /proc/cpuinfo查看相关cpu信息
6. make -j8

二、 常见问题

说明:在编译的时候我就遇见了两个问题及缺失的依赖,具体依赖在《自我进阶(一) Android 源码编译,环境准备》中有记录

  • jdk 版本问题,

根据error 提示安装相应的jdk

  • sizeof (_nl_value_type_LC_TIME[0]))’ ???

使用export LC_ALL=C 去除本地化配置

  • 其他

具体问题可以联系我,同步一下常见问题

三、运行模拟器

当走到这一步的时候基本上已经搞定了Android源码的编译,

  • 使用emulator 运行模拟器
// 模拟器需要四个文件
1. Linux Kernel
2. system.img
3. userdata.img
4. ramdisk.img

在lunch 命令时选择的是aosp_arm64-eng,因此linux默认使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件则是使用的source/out/target/product/generic64目录下的system.img、userdata.img和ramdisk.img。这些文件都是编译得来的

  • 使用emulator之后会出现Android 模拟器,并启动

这就完成了Android 源码的编译,那么花费如此多的时间我们编译就是为了运行模拟器吗?当然不是,接下来要做的就是,使用Google提供的命令来单独编译模块,

  • 比如说是单独编译SystemUI \StorageManager等等,
  • 这么向Android 系统中添加自己创建的模块
  • 通过自己创建的模块 观察分析Activity的启动方式、进程间的通信机制、各种控件是怎么绘制的怎么展示的等等
  • 具体都会在自我进阶系列中更新

编译命令解析,参考于 Android编译详解之lunch命令