一、设置 Linux 构建环境
- 软件安装
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev
gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev
libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
- 建立python3与python的软连接 (如果编译没有提示python问题,此处可以忽略)
方法1:
1.查看python3的版本
python3 --version
2.查找python3的安装位置:
whereis python3
3.为其创建符号连接:
sudo ln -s /usr/bin/python3 /usr/bin/python
方法2:
sudo apt install python2
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 2
sudo update-alternatives --list python
sudo update-alternatives --config python //可以切换版本
- 安装repo
$ mkdir -p ~/.bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
$ chmod a+rx ~/.bin/repo
$ cd ~/vim .bashrc
$ export PATH=$PATH:~/.bin
$ source .bashrc
二、下载源码
下面说一下最重要的init仓库。
repo init -u https://android.googlesource.com/platform/manifest -b master
repo sync -c -j8 //构建的并行度可以通过 -jN 参数设置为“N”。如果你不提供 -j 参数,构建系统会自动选择并行它认为最适合您的系统的任务计数。
master可变为我们需要的源码分支,如android-12.0.0_r28 具体分支可查看《源代码标记和 build》
绝大多数同学都无法科学上网,就算能够科学上网,流量费和速度都让人焦虑,这里我大家推荐国内镜像:
清华大学开源软件镜像站: mirrors.tuna.tsinghua.edu.cn/help/AOSP/
三、构建Android
1. 设置环境
source build/envsetup.sh
2. 选择目标
lunch
输入我们想要编译的产品编号或者全称,如“76”或者“sdk_phone_x86_64-eng”。 如果已经确定目标可以直接执行“lunch 68”或者“lunch dk_phone_x86_64-eng”。
注意:‘-’后面代表编译不同权限的版本。
| 构建类型 | 使用情况 |
|---|---|
| user | 权限受限;适用于生产环境 |
| userdebug | 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型 |
| eng | 具有额外调试工具的开发配置 |
另外:增加产品选择(非必须)
build/make/target/product/AndroidProducts.mk文件中发现,还隐藏了一些product可供编译,我们可以通过在COMMON_LUNCH_CHOICES下配置sdk_phone_x86_64-eng,配置开发版本的product。 详细配置流程可查看《Android 12 源码编译与虚拟机调试》
注意:增加产品选项的原因是由于在X86_64架构下的设备,能够成功编译展示出来的产品,但是无法正常启动虚拟机。故需要新增了sdk_phone_x86_64,确保虚拟机在X86_64架构下能够正常启动运行。
3. 构建代码
m -j16
构建的并行度可以通过 -jN 参数设置为“N”。如果你不提供 -j 参数,构建系统会自动选择并行它认为最适合您的系统的任务计数。
| Command | description |
|---|---|
| croot | 快速切换到源码的根目录,方便开始编译 |
| m | 在源码树的根目录执行编译 |
| mm | 编译当前路径下所有模块,但不包含依赖 |
| mmm [module_path] | 编译指定路径下所有模块,但不包含依赖 |
| mma | 编译当前路径下所有模块,且包含依赖 |
| mmma [module_path] | 编译指定路径下所有模块,且包含依赖 |
| make [module_name] | 无参数,则表示编译整个Android代码 |
| make clean-[module_name] | 清理该模块 |
| make clean | 删除整个out文件夹! |
更多命令可以通过”m help“获取。
编译单模块命令:
| module | make command | mmm command |
|---|---|---|
| init | make init | mmm system/core/init |
| zygote | make app_process | mmm rameworks/base/cmds/app_process |
| system_server | make services | mmm frameworks/base/services |
| java framework | make framework | mmm frameworks/base |
| framework-core | make framework-minus-apex | |
| framework资源 | make framework-res | mmm frameworks/base/core/res |
| jni framework | make libandroid_runtime | mmm frameworks/base/core/jni |
| binder | make libbinder | mmm frameworks/native/libs/binder |
四、代码搜索
| 搜索指令 | 解释 |
|---|---|
| cgrep | 所有C/C++文件执行搜索操作 |
| jgrep | 所有Java文件执行搜索操作 |
| ggrep | 所有Gradle文件执行搜索操作 |
| mangrep [keyword] | 所有AndroidManifest.xml文件执行搜索操作 |
| mgrep [keyword] | 所有Android.mk文件执行搜索操作 |
| sepgrep [keyword] | 所有sepolicy文件执行搜索操作 |
| resgrep [keyword] | 所有本地res/*.xml文件执行搜索操作 |
| sgrep [keyword] | 所有资源文件执行搜索操作 |
五、启动虚拟机
如果编译完启动只需如下命令:
emulator
如果关闭Terminal窗口再次启动,需要初始化环境:
source build/envsetup.sh
lunch 68
emulator
六、通过idegen将AOSP导入Studio
1. 通过命令执行idegen脚本
// 初始化脚本
source build/envsetup.sh
// 切换环境
lunch sdk_phone_x86_64-eng
// 编译idegen
mmm development/tools/idegen/
// 执行idegen.sh
development/tools/idegen/idegen.sh
代码引入过程参考:
问题: 执行idegen.sh时遇到了如下问题:
~/Android12Source$ development/tools/idegen/idegen.sh
find: ‘out/target/product/emulator_x86_64/root/d/tracing’: Permission denied
解决方案:
从错误信息可知,我们访问一些文件需要root权限,所以做如下处理:
// 切换root用户
su root
// 初始化脚本
source build/envsetup.sh
// 切换环境
lunch sdk_phone_x86_64-eng
// 执行idegen.sh
development/tools/idegen/idegen.sh
如果我们并没有设置root密码,做如下命令进行设置:
sudo passwd
2. 通过Android Studio for Platform 编辑器引入
代码导入的文章可以参考豪哥文章:系统开发专用版 Android Studio 上手指南
注意:由于Android Studio和Android Studio for Platform 创建图标时会发生冲突,可以采用如下方法避免:
sudo su //进入root模式
... //输入密码
cd /usr/share/applications
cp asfp.desktop ./androidstudio.desktop
vim androidstudio.desktop
//编辑修改Name、Exec、Icon内容
asfp.desktop内容如下:
[Desktop Entry]
Name=Android Studio for Platform
Exec=/opt/android-studio-for-platform/bin/studio.sh
Icon=/opt/android-studio-for-platform/bin/studio.png
Terminal=false
Type=Application
Categories=Development;IDE;
StartupWMClass=jetbrains-studio