构建AOSP的正确姿势

588 阅读4分钟

一、设置 Linux 构建环境

参考:source.android.com/docs/setup/…

  1. 软件安装
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
  1. 建立python3与python的软连接 (如果编译没有提示python问题,此处可以忽略)

参考:blog.csdn.net/weixin_4488…

方法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 //可以切换版本
  1. 安装repo

参考:source.android.com/docs/setup/…

$ 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

二、下载源码

下载地址:source.android.com/docs/setup/…

下面说一下最重要的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》

source.android.com/docs/setup/…

绝大多数同学都无法科学上网,就算能够科学上网,流量费和速度都让人焦虑,这里我大家推荐国内镜像:

清华大学开源软件镜像站: mirrors.tuna.tsinghua.edu.cn/help/AOSP/

三、构建Android

source.android.com/docs/setup/…

1. 设置环境

source build/envsetup.sh

2. 选择目标

lunch

lunch.png 输入我们想要编译的产品编号或者全称,如“76”或者“sdk_phone_x86_64-eng”。 如果已经确定目标可以直接执行“lunch 68”或者“lunch dk_phone_x86_64-eng”。

注意:‘-’后面代表编译不同权限的版本。

构建类型使用情况
user权限受限;适用于生产环境
userdebug与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng具有额外调试工具的开发配置
另外:增加产品选择(非必须)

img.png

build/make/target/product/AndroidProducts.mk文件中发现,还隐藏了一些product可供编译,我们可以通过在COMMON_LUNCH_CHOICES下配置sdk_phone_x86_64-eng,配置开发版本的product。 详细配置流程可查看《Android 12 源码编译与虚拟机调试》

blog.csdn.net/qq_17696807…

注意:增加产品选项的原因是由于在X86_64架构下的设备,能够成功编译展示出来的产品,但是无法正常启动虚拟机。故需要新增了sdk_phone_x86_64,确保虚拟机在X86_64架构下能够正常启动运行。

3. 构建代码

m -j16  构建的并行度可以通过 -jN 参数设置为“N”。如果你不提供 -j 参数,构建系统会自动选择并行它认为最适合您的系统的任务计数。

Commanddescription
croot快速切换到源码的根目录,方便开始编译
m在源码树的根目录执行编译
mm编译当前路径下所有模块,但不包含依赖
mmm [module_path]编译指定路径下所有模块,但不包含依赖
mma编译当前路径下所有模块,且包含依赖
mmma [module_path]编译指定路径下所有模块,且包含依赖
make [module_name]无参数,则表示编译整个Android代码
make clean-[module_name]清理该模块
make clean删除整个out文件夹!

更多命令可以通过”m help“获取。

编译单模块命令:
modulemake commandmmm command
initmake initmmm system/core/init
zygotemake app_processmmm rameworks/base/cmds/app_process
system_servermake servicesmmm frameworks/base/services
java frameworkmake frameworkmmm frameworks/base
framework-coremake framework-minus-apex
framework资源make framework-resmmm frameworks/base/core/res
jni frameworkmake libandroid_runtimemmm frameworks/base/core/jni
bindermake libbindermmm 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

代码引入过程参考:

note.youdao.com/ynoteshare/…

问题: 执行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 编辑器引入

软件下载地址:developer.android.google.cn/studio/plat…

代码导入的文章可以参考豪哥文章:系统开发专用版 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                                    

七、引用文章:

  1. Android 12 源码编译与虚拟机调试

  2. 使用 AIDEGen 将 AOSP 项目导入 Android Studio

  3. 使用Android Studio导入AOSP源码的奇技淫巧

  4. 理解Android编译命令

  5. framework开发实战技巧

  6. 系统开发专用版 Android Studio 上手指南