构建高雅的Android Kernel内核和AOSP渠道代码阅览环境

1 阅览AOSP源码的方法

东西 描绘
Vim等文本东西 翻开速度快,不必索引源码,不支撑代码跳转。
Source Insight 界面朴素,索引速度较慢,代码跳转不完整,仅支撑Window渠道。
在线源码网站(如androidxref) 不必repo下载整个源码文件,但由于源码版权问题,不能阅览Android10之后的版别。
IDE 贴合实际开发环境,代码跳转、调试友好,IntelliJ/Android Studio支撑Java源码环境,CLion支撑Native源码环境。

在2023年的当下,笔者不再主张运用Source Insight来阅览本地源码(PS:相似Eclipse开发视感),这儿探求用AOSP源码供给的脚本东西生成运用于Android Studio和CLion项目来构建源码环境:

脚本东西 描绘 缺点 文档途径
IDEGen 生成android.ipr项目装备文件和android.iml依靠文件,AndroidStudio翻开android.ipr即可导入AOSP。 仅支撑生成Java源码环境,生成project未装备JDK依靠,由于索引整个AOSP项目导入Android Studio构建十分十分十分卡顿,需求手动扫除不要的模块目录才能减轻卡顿问题。 /development/tools/idegen/README.md
Soong 可指定选定的模块生成CMakeLists.txt适用于CLion的项目装备文件,CLion翻开即可导入AOSP。 仅支撑生成Native源码环境,用.mk文件编译(Make构建源码)的模块不会生成CMakeLists.txt文件,需求手动编写.bp(Soong构建)文件编译模块,编译出来的是各个模块独自的CMakeLists.txt,需求手动创立项目总CMakeLists.txt把各个模块兼并。 /build/soong/docs/clion.md
AIDEGen 主动完结指定模块的一切依靠,并主动拉起指定IDE导入项目。 假如指定的Native模块依靠许多、很大,工作耗时长 /tools/asuite/aidegen/README.md

2 AOSP源码环境搭建准备工作

2.1 体系硬件装备

装备项 内容 阐明
体系 Ubuntu18.04(官方指定) 自 2021 年 6 月 22 日起,不再支撑在 Windows 或 MacOS 上进行构建,并且在Android12或之前版别,AOSP运用的渠道API在较新版别MacOS抛弃编译不经过(如:exteral目录下的第三库运用C的sprintf()函数),能够经过虚拟机计划(VMware Fusion,Paralles Desktop)处理体系问题。
硬盘 至少250G起步,分区必须是Ext4文件体系,否则编译产品含有” * : – / ?”的特殊命名文件不会被辨认,Android Kernel(common-android13-5.15)编译后巨细为28G左右,AOSP(android-13.0.0_r41)编译后巨细为195G。 对于硬盘焊死在主板不支撑拓宽电脑,能够外接移动硬盘(Ext4文件体系)处理。
内存 16G起步 对于虚拟机上分配内存或许本机内存小于16G或许情况,能够在Ubunt调整swap分区巨细(默认2G,主张16G起步)。

更多详情能够参阅官方资料: 软硬件要求:https://source.android.google.cn/docs/setup/start/requirements?hl=zh-cn

2.2 Ubuntu装置与装备依靠软件

笔者运用的2016年MacBook Pro 15寸高配版别,故这儿以虚拟机计划处理Ubuntu体系问题。 由于Paralles Desktop是收费的,故这儿运用VMware Fusion个人版免费版别:https://www.vmware.com/products/fusion.html,注册VMware账号即可拿到license进行装置。

构建优雅的Android Kernel内核和AOSP平台代码阅读环境

由于Ubuntu官方镜像在国内下载速度较慢,故这儿运用阿里云镜像站供给的ubuntu-18.04-desktop-amd64.iso:https://mirrors.aliyun.com/oldubuntu-releases/releases/18.04.5/ubuntu-18.04-desktop-amd64.iso

接下来将ubuntu-18.04-desktop-amd64.iso用VMware Workstation Player导入即可。

构建优雅的Android Kernel内核和AOSP平台代码阅读环境
假如插上了移动硬盘但虚拟机辨认不了,请翻开虚拟机设置->usb和蓝牙,挑选对应的UBS的协议版别即可:
构建优雅的Android Kernel内核和AOSP平台代码阅读环境

由于笔者的2016年MacBook Pro 15寸硬盘只要512G,但目前可用空间也就200G远远不能满意编译AOSP和Android Kernel的空间巨细,所以这儿挑选外接移动硬盘,注意:要把移动硬盘格局化成Ext4格局

构建优雅的Android Kernel内核和AOSP平台代码阅读环境

接下来翻开终端履行apt指令装置所需求的软件包:

# 参阅官网:https://source.android.google.cn/docs/setup/start/initializing?hl=zh-cn#installing-required-packages-ubuntu-1804
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

由于生成构建源码至少需求16G+的内存巨细,所以在虚拟机调整swap巨细:

# 1.设置swap巨细为16G
sudo dd if=/dev/zero of=/tmp/swapfile bs=1G count=16
#  2.修正空间权限
sudo chmod 600 /tmp/swapfile
#  3.格局化空间
sudo mkswap /tmp/swapfile
#  4.启用Swap
sudo swapon /tmp/swapfile
#  5.永久启用虚拟空间
sudo vim /etc/fstab
#  在文件最结尾参加下面内容保存即可
/tmp/swapfile swap swap defaults 0 0
# 6.检查内存设置是否生效
free -m

构建优雅的Android Kernel内核和AOSP平台代码阅读环境

最终便是下载AndroidStudio和CLion2020版别(PS:2020以后版的较新版别导入生成的Native项目Cmake会构建失利)到opt目录(PS:从snap软件商铺下载,后面AIDEgen不能主动辨认到它们的装置途径导致不能主动发动导入生成的项目代码),这儿以装置CLion为例 (AndroidStudio同理,但装置完需求翻开并装置SDK等相关装备) : 1.从CLion官网下载压缩包:https://download.jetbrains.com/cpp/CLion-2020.3.4.tar.gz 2.创立opt目录,把CLion压缩包解压到clion-stable。(ps:只要命名为‘clion-stable’才会被AIDEgen会主动辨认拉起CLion,而AndroidStudio装置包要解压在opt/android-studio目录)

构建优雅的Android Kernel内核和AOSP平台代码阅读环境

sudo mkdir /opt/clion-stable
sudo sudo tar -zxvf CLion-2020.3.4.tar.gz -C /opt/clion-stable

3.发动CLion并创立桌面快捷方法

#  发动CLion
sh /opt/clion-stable/bin/clion.sh 

在完结CLion装备后,随便新建个项目进入主界面,在顶部菜单栏挑选即可:Tools -> Create Desktop Entry

构建优雅的Android Kernel内核和AOSP平台代码阅读环境

2.3 下载AOSP分支源码

首先要在终端装备git的用户名和邮箱:

git config --global user.name "你的用户名"
git config --global user.email "您的邮箱地址"

然后便是装置Repo(PS:这是下载源码的东西):参阅官方Repo的资料:https://source.android.google.cn/docs/setup/download?hl=zh-cn#repo

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
vim ~/bin/repo

将文件中首行的’#!/usr/bin/env python’改为’#!/usr/bin/env python3’,这样Repo就以Python3履行,而不会报错或许履行不兼容的Python2。

构建优雅的Android Kernel内核和AOSP平台代码阅读环境
最终再装备Python3别号和Repo镜像源地址的环境变量:

vim ~/.bashrc
# 将下面两行插入文件最末端
# Python3别号
alias python='python3'
# Repo镜像源地址设置为清华大学开源软件镜像站源
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
# 保存修正退出后,要履行source指令装备才生效
source ~/.bashrc

最终便是在移动硬盘创立工作目录进行拉取下载AOSP代码,这儿不是拉取master分支,而是android-13.0.0_r41分支,这样拉取单个分支代码占用存储空间会小许多,更多分支参阅官网:https://source.android.google.cn/docs/setup/about/build-numbers?hl=zh-cn#source-code-tags-and-builds,笔者在拉过程中网络下载速度平均30M/s,峰值60M/s,可能是清华大学开源软件镜像站限制了网速发挥不了千兆网络宽度的速度,约1小时18分左右就完结下载,但下载完结Repo主动履行checkout代码又花了15分钟左右,整个过程花了1个半小时左右,所以这个时刻长短取决于您的网络带宽和电脑的CPU的核心数和硬盘、内存的读写性能。

# 以下指令是在移动硬盘翻开终端履行操作
mkdir aosp && cd aosp && repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r41 && repo sync

2.4 AOSP的模块概念

AOSP的模块:文件目录下有 Android.bp(Soong构建装备文件) 或许 Android.mk(GUN Make构建装备文件)即可视为模块:

source build/envsetup.sh
# 将AOSP一切模块的姓名打印输出写入到文件检查(直接在终端输出打印会由于太多而显现不完整。)
allmod >> mods.txt
# 获取模块在源码的途径
pathmod framework
# 下面一行是输出framework模块在源码的途径
/media/petter/AOSP/AOSP_13/frameworks/base
pathmod libbinder
# 下面一行是输出binder模块在源码的途径
/media/petter/AOSP/AOSP_13/frameworks/native/libs/binder

envsetup.sh脚本封装了许多有用的指令,’allmod’检查AOSP一切模块,’pathmod’检查模块在源码的途径,能够履行’hmm’检查更多指令的用法。

3 IDEGen生成AOSP源码Java环境(不推荐)

# 以下指令是移动硬盘下载源码的目录翻开终端履行操作
apt install default-jdk -y && source build/envsetup.sh && make idegen && . development/tools/idegen/idegen.sh

履行上面的指令也是十分的耗时的,当成功后在AOSP代码根目录下能够找到 android.iml 和 android.ipr 两个文件。翻开Android Studio,点击File –> Open,选中生成的 android.ipr 文件即可。但是整个源码的体积很大,假如全部导入会十分十分卡顿,能够扫除一些代码,能够在android.iml下修正:

<content url="file://$MODULE_DIR$">
    <excludeFolder url="file://$MODULE_DIR$/bionic" />
    <excludeFolder url="file://$MODULE_DIR$/bootable" />
    <excludeFolder url="file://$MODULE_DIR$/build" />
    <excludeFolder url="file://$MODULE_DIR$/cts" />
    <excludeFolder url="file://$MODULE_DIR$/dalvik" />
    <excludeFolder url="file://$MODULE_DIR$/developers" />
    <excludeFolder url="file://$MODULE_DIR$/development" />
    <excludeFolder url="file://$MODULE_DIR$/device" />
    <excludeFolder url="file://$MODULE_DIR$/docs" />
    <excludeFolder url="file://$MODULE_DIR$/external" />
    <excludeFolder url="file://$MODULE_DIR$/hardware" />
    <excludeFolder url="file://$MODULE_DIR$/kernel" />
    <excludeFolder url="file://$MODULE_DIR$/out" />
    <excludeFolder url="file://$MODULE_DIR$/pdk" />
    <excludeFolder url="file://$MODULE_DIR$/platform_testing" />
    <excludeFolder url="file://$MODULE_DIR$/prebuilts" />
    <excludeFolder url="file://$MODULE_DIR$/sdk" />
    <excludeFolder url="file://$MODULE_DIR$/system" />
    <excludeFolder url="file://$MODULE_DIR$/test" />
    <excludeFolder url="file://$MODULE_DIR$/toolchain" />
    <excludeFolder url="file://$MODULE_DIR$/tools" />
    <excludeFolder url="file://$MODULE_DIR$/.repo" />
</content>

也能够在AndroidStudio挑选目录手动扫除:

构建优雅的Android Kernel内核和AOSP平台代码阅读环境
最终便是点击顶部菜单栏File -> Project Structure装备项目对应的JDK、SDK了。

4 Soong生成AOSP源码Native环境(不推荐)

source build/envsetup.sh && export SOONG_GEN_CMAKEFILES=1 && export SOONG_GEN_CMAKEFILES_DEBUG=1
# 这是编译生成整个AOSP各个模块的CMakeList.txt,
# ‘-j8’指定的履行生成使命的线程数为8个,可根据自己电脑的cup参数指定
# make -j8 
# 编译特定途径的模块
make frameworks/native/libs/binder

Soong编译模块期间顺带着把Native代码依靠关系记录到一个文件CMakeLists.txt里,上指令履行十分耗时,生成的CMakeLists.txt文件在对应的途径:‘out/development/ide/clion/frameworks/native/libs/binder/libbinder-arm-android/CMakeLists.txt’,其中‘/frameworks/native/libs/binder’是指对应模块在源码的途径,‘libbinder-arm-android’是代表lib<模块名>-架构名-<渠道名>意思。更多参阅官方Soong文档:https://source.android.google.cn/docs/setup/build?hl=zh-cn

# out/development/ide/clion/frameworks/native/libs/binder/libbinder-arm-android/CMakeLists.txt
project(libbinder)
set(ANDROID_ROOT /media/petter/AOSP/AOSP_13)
set(CMAKE_C_COMPILER "${ANDROID_ROOT}/prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang")
set(CMAKE_CXX_COMPILER "${ANDROID_ROOT}/prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang++")
list(APPEND
     SOURCE_FILES
    ${ANDROID_ROOT}/frameworks/native/libs/binder/Binder.cpp
    ${ANDROID_ROOT}/frameworks/native/libs/binder/BpBinder.cpp
    ${ANDROID_ROOT}/frameworks/native/libs/binder/BufferedTextOutput.cpp
    ${ANDROID_ROOT}/frameworks/native/libs/binder/Debug.cpp
    ${ANDROID_ROOT}/frameworks/native/libs/binder/FdTrigger.cpp
    ${ANDROID_ROOT}/frameworks/native/libs/binder/IInterface.cpp
    ${ANDROID_ROOT}/frameworks/native/libs/binder/IMemory.cpp
# 省掉...

用CLion翻开刚生成的CMakeLists.txt即可,翻开后目录结构是扁平的,需求修正工程根目录,在顶部菜单栏挑选Tools -> CMake -> Change Project Root,以上面为例挑选源码frameworks/native/libs/binder目录即可。假如您想引导多个模块,只能手动创立CMakeLists.txt把对应生成模块的CMakeLists.txt添加进来:

cmake_minimum_required(VERSION 3.6)
project(native)
add_subdirectory(services/surfaceflinger)
add_subdirectory(libs/ui/libui-arm64-android)
add_subdirectory(libs/gui/libgui-arm64-android)

5 AIDEGen 生成AOSP源码Java\Native环境(推荐)

AIDEGen是在2020开端释放出现在AOSP源码中,协助开发者主动完结项目在IDE上的模块依靠、SDK、JDK等环境装备,不再需求开发者手动装备,注意的是从Android 10开端支撑生成Java项目,而Native项目则从Android 11开端才完全支撑,在完结使命后主动发动指定的IDE并导入项目代码。

# ‘sdk_pc_x86_64-userdebug’表明要构建方针为64位的pc模拟器版别,
# 更多参阅官方:https://source.android.google.cn/docs/setup/build/building?hl=zh-cn#choose-a-target
source build/envsetup.sh && lunch sdk_pc_x86_64-userdebug
# 生成framework模块的java源码环境,并发动AndroidStudio导入项目
aidegen framework -i s
# 也能够指定多个途径构建,下面是Binder相关的native层源码环境,并发动CLion导入项目
aidegen frameworks/base/core/jni frameworks/native/libs/binder -i c

假如您之前已经运用aidegen生成过模块,能够添加‘-s’越过部分过程加速使命,更多Aidegen的参数阐明如下:

参数 完整参数 描绘
-d --depth 指定源码模块的深度值
-i --ide 发动IDE的类型, j=IntelliJ s=Android Studio e=Eclipse c=CLion v=VS Code
-p --ide-path 指定用户装置IDE的途径.
-n --no_launch 完结使命后不发动IDE导入源码.
-r --config-reset 重置AIDEGen已保存的装备
-s --skip-build 越过构建jar包和模块
-v --verbose 在履行使命时显现DEBUG级别的log
-a --android-tree 生成整个AOSP的IDE项目文件
-e --exclude-paths 扫除指定目录
-l --language 运用特定语言发动IDE,j=java c=C/C++ r=Rust
-h --help 协助

6 最佳实践

假如您完结Ubuntu软硬件,AndroidStudio、CLion、Git、Repo、Python装备,到了用Repo拉取源码这最耗时的过程,首先在Android Studio、CLion的设置受信赖项目的途径,这样AIDEgen发动它们是就不弹出这个窗口:

构建优雅的Android Kernel内核和AOSP平台代码阅读环境
翻开IDE设置菜单:Build、Execution、Deployment -> Trusted Locations,设置AOSP途径即可
构建优雅的Android Kernel内核和AOSP平台代码阅读环境
最终履行以下指令就会完结源码拉取、编译依靠、发动IDE的使命,假如您的电脑性能好、宽带网速能够,一觉醒来您就发现能够AndroidStudio、CLion检查Framework源码了。

mkdir aosp && cd aosp && repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r41 && repo sync && source build/envsetup.sh && lunch sdk_pc_x86_64-userdebug && aidegen framework -i s && aidegen frameworks/native -i c

7 构建Android Kernel内核源码环境

由于AOSP把Kernel内核分脱离,若要检查Kernel层的模块代码(如Binder驱动),则需求独自下载Kernel分支了,而不同的设备有不同的内核分支,这儿下载的是通用内核common-android13-5.15分支。更多参阅官网:https://source.android.google.cn/docs/setup/build/building-kernels?hl=zh-cn

mkdir kernel && cd kernel && repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/kernel/manifest -b common-android13-5.15 && repo sync && LTO=thin BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh && common/scripts/clang-tools/gen_compile_commands.py -d ./out/android13-5.15/common/

上面指令履行经过repo拉取代码,编译,然后运用‘gen_compile_commands.py’脚本在根目录生成‘compile_commands.json’的依靠索引文件,直接用CLion翻开即可阅览Kernel内核的代码了。

8 支撑正版软件

VScode在AIGEGen也支撑java、Native项目导入,但要装置对应的Java、Camke、C、C++,CQuery插件,相对繁琐并索引代码速度慢,而Kernel内核源码也能经过clangd插件构建索引,总而言之,CLion导入Native项目却十分省心而高效,但CLion是收费的:

1.若资金允许请购买正版:www.jetbrains.com.cn/clion/buy/#…

2.学生凭学生证可免费请求正版授权:www.jetbrains.com/shop/eform/…

3.创业公司可5折购买正版授权:www.jetbrains.com/shop/eform/…

9 总结

以上便是笔者构建Android Kernel内核和AOSP渠道代码阅览环境的过程,由于笔者水平有限仅给各位供给参阅,期望能够抛砖引玉,也欢迎各位在谈论区留言沟通意见。