安卓源码编译8.0-【框架】速读AndroidAOSP基础知识

几年前刚毕业,在老东家参与Launcher的开发时接触到AOSP。 当时的幼儿教育平板还是基于Android 4.4的源码定制的。 跑了之后,我还在应用层抓鱼。 最近很流行。 我想准备一些基本的坐姿,所以这篇文章就到了~

温馨提示:本文并非作者个人实践。 它是根据参考文献部门几位大佬的文章改编的。 下载asop源代码很费时间。 我不需要编译和扫描源代码。 我只是在解决bug或者理解底层机制的时候看源码。 SDK自带的android.jar和一些在线源代码网站已经足够了。 环境搭建流程基本相同。 如果遇到问题,可以使用搜索引擎~

0x1,名词①AOSP

英文官网:source.android.google.cn/

AndroidOpenSourcePackage,Android系统的开源代码包,Android联通终端平台(Snapdragon、MTK等)首先在Android原生代码的基础上进行修改,生成自己的平台代码。 其他手机厂商则提供自己的联通终端解决方案(系统定制)。

asop源码编译后会生成一系列产品(在out目录下):

我们平时在AS中听到的源码库android.jar就是打包后的classes.jar。 详细路径为:out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar。 在某些场景下,需要使用SDK中的隐藏API(@hide注解)。 一种解决方案是用aosp编译生成的classes.jar替换原生SDK中的android.jar。 具体导出示例可以参见:《AndroidStudio3.5导出AOSP编译的classes.jar》

②格里特

Android使用Git作为代码管理工具,并开发了Gerrit进行初步代码审查,以方便更好地集中管理代码。 它实际上是一个Git服务器,为其服务器上托管的Git存储库提供一系列权限控制,以及用作CodeReview的网页。

③回购协议

Repo命令行工具使用Python封装Git命令,简化多个Git库的集中管理。

0x2,回购工作流程

如右图所示:

简单描述一下关键命令:

更多详情请参见:《源代码控制工作流程》

0x3、系统规划

只要下载源代码,任何系统都可以,但如果你仍然想编译,你需要Linux或MacOS系统。

如果要编译Windows,可以通过虚拟机间接安装上述系统。 常规的方法是:Docker或者VirtualBox。 前者的安装示例可以参见:《AndroidAOSP基础知识(一)Ubuntu的VirtualBox安装》

有关更多详细信息,请参阅:

0x4、源码下载

执行以下命令即可~

# ① 安装Git、Curl、Python,有些系统自带~
sudp apt-get install git
sudo apt-get install curl
sudo apt-get install python
# ② 创建bin,并添加到PATH中
mkdir ~/bin
PATH=~/bin:$PATH
# ③ 下载Repo工具,并设置为可执行
# Tips:国外源可能有问题,可以替换为国内镜像,比如:https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# ④ 创建工作文件目录 (存源码)
mkdir aosp
cd aosp
# Tips:Repo在运行过程中会尝试访问官方Git源更新自己,如果想用tuna镜像更新,可复制
# 下述内容到~/.bashrc中
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
# ⑤ Git设置身份信息(名字、邮箱)
git config --global user.name  "User Name"
git config --global user.email "user@example.com"
# ⑥ 初始化仓库 (同样支持替换镜像源)
repo init -u https://android.googlesource.com/platform/manifest
# 也支持指定分支,可选值查看:https://source.android.com/source/build-numbers#source-code-tags-and-builds
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r8 
# ⑦ 同步代码 (拉取aosp源码到工作目录,一般要几个小时)
repo sync
# Tips:下载过程可能出现某些project找不到,可能是镜像问题,也可能是网的问题,
# 试试可以单独同步该项目,支持-jN参数,-j4如:
repo sync -c platform/frameworks/layoutlib
# 附:asop不包含内核代码,有需要可以单独下载,版本有很多,如:
# common → 通用linux内核、goldfish → Android模拟器内核、msm → 高通MSM芯片
mkdir kernel
cd kernel
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
cd goldfish
# 可以查看有哪些内核版本分支可以下载
git branch -a
# 下载对应版本内核代码
git checkout remotes/origin/android-goldfish-3.4

更多详情请参见:“下载源码”

另外安卓源码编译8.0,美国的镜子也难免不稳定。 也可以直接使用北大镜像。 第一次同步很容易失败。 建议使用迅雷等软件直接下载初始化包aosp-latest.tar进行初始化,然后再次同步。

0x5,编译

同样,这里有一些名词的解释:

关系描述:

①编译环境规划

# ① 安装jdk 8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
# Tips:使用ubuntu 14+,还需要安装下述依赖包
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

②源代码重组

# ① 初始化环境
source build/envsetup.sh
# ② 删除out与中间文件,clean会删除本次设置生成的、clobber会删除所有配置生成的
make clobber
# ③ 选择编译目标,下述命令会进入菜单,选择相应的版本,输入序号回车
# 编译目标都采用 BUILD-BUILDTYPE 形式,BUILD 表示特定功能代号,BUILDTYPE是以下类型之一:
# user → 权限受限、适用于生产环境,没root权限,不能debug,adb默认处于停用状态;
# userdebug → 与user类似,但具备root权限和debug权限,一般用于调试真机。
# eng → 具有额外调试工具的开发配置,拥有最大的权限(root等),一般用于模拟器。
# 编译目标示例 → Pixel 3a XL的编译目标 → aosp_bonito-userdebug
lunch
# 也可以直接指定编译目标,如:lunch aosp_bonito-eng
# 还可以直接用序号,如:lunch 8,但不建议,因为不同的系统版本序号对应可能有偏差~
# ③ 开始编译,后面的-jN参数用来设置编译的并行任务数,CPU核心数为6,N值最好选6-12间
# 根据自己CPU核心数动态修改哈,见过有32的~
make -j6
# 也可以把输出结果打印到log文件中:make -j6 2>&1 | tee build_20211206_1403.log
# 编译成功后会生成out目录,比如这里的:~/aosp/out/target/product/bonito
# Tips:有需要还可以键入:make sdk,编译SDK生成修改后的android.jar

③源码单独编译

编译通常需要几个小时。 有时您可能只更改应用程序模块之一。 你只需要单独编译这个模块即可。 以设置模块为例:

source build/envsetup.sh
lunch aosp_bonito-eng
# 进入模块目录
cd package/apps/Setting
# 编译单独模块的可选指令如下:
# mm → 编译当前目录下的模块,不编译依赖模块
# mmm → 编译指定目录下的模块,不编译依赖模块
# mma → 编译当前目录下的模块及其依赖项
# mmmma → 编译指定路径下所有模块,切包含依赖
mm
# 编译成功会提示生成文件的存放路径,除了生成Setting.odex外,还会在
# priv-app/Settings目录下生成Settings.apk,可直接adb push或adb install
# 安装APK验证效果,也可以使用make snod命令重新打包生成system.img,运行模拟器查看

0x6。 刷机手机 ①Pixel 或 Nexus

恭喜你,可以直接刷机了。 首先进入DriverBinariesforNexusandPixelDevices安卓源码编译8.0,根据自己的型号和Android版本号下载对应的驱动程序。 然后解压并执行:

./extract-qcom-sargo.sh
./extract-google_devices-sargo.sh

进入bootloader并执行烧录命令(-w表示清除数据)

adb reboot bootloader
fastboot flashall -w

然后等待刻录完成即可~

②Android虚拟机

你必须自己编译AVD镜像,并在lunch中选择sdk_phone_x86_64编译目标。 除了常规编译外,还必须附加sdk和sdk_repo包。

如果上述方法不起作用,您可以将镜像复制到 SDK/system-images/android-xx/ 目录之一。

③其他手机

如果不是真兄弟,只能找驱动、厂商库等第三方ROM进行二次开发。 最有名的是CM(CyanogenMod),但它似乎已经不再那么流行了。 你可以尝试一下LineageOS。

由于篇幅所限,我将一一描述。 如果你有兴趣想自己尝试一下,可以参考:《自己编译Android(LineageOS)源代码》

0x7。 其他查看Android系统源码的方法

不仅可以直接下载完整的源代码到本地计算机,还可以直接在线或直接通过AS查看。

①在线查看

不用写一堆代码,而且有多个版本可以选择,非常好吃~

②AS快速查看

依次点击:设置→外观&行为→系统设置→AndroidSDK→选择需要的AndroidSDK版本源码下载:

然后在build.gradle中设置compileSdk版本号,同步一下,点击Jump Framework类进行跳转。

0x8。 调试Android系统源码①生成索引

Android源码提供了直接生成AS可以识别的文件的工具。 Android源码编译完成后,会在源码根目录下生成一个android.ipr。

AS使用OpenanexistingAndroidStudioProject方法打开这个文件并等待索引生成。

索引生成后,调整AS监控源代码的目录。 out等目录每次编译后都会改变,但是这个目录基本不会被用到。 简单地删除索引(Excluded),以out目录为例。 ,其他不需要的目录也这样处理:

②安装JDK和SDK

根据源码版本选择对应的SDK:

设置JDK:

③调试源码

在源代码中设置断点,然后单击 AttachDebuggertoAndroidProcess

选择要调试的进程,然后就可以愉快的调试了~

如果要在真机上调试系统进程,需要Root权限。 然后用Magisk等软件更改:ro.debuggable=1。 您可以在创建新模拟器时选择非 GooglePlay 64 位映像,也可以获取 ro.debuggable=1 的设备。

大多数时候,调试源码时并不需要使用所有的AOSP源码。 也可以直接导出部分源码进行调试。

另外,真机调试时,调试行号可能与源码不一致,行号在注释中。 大部分原因是国产ROM更改了相关源代码。 您可以在 Debugger/Frames 中查看调用方法来逐步理解这一点。 输入方法,然后按 Ctrl+F 搜索方法名称并找到正确的位置。

0x9,总结

本节快速介绍与 AOSP 相关的基本坐姿,这被认为是学习该框架的计划。 以后我会详细了解这方面的知识~

参考:

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 安卓源码编译8.0-【框架】速读AndroidAOSP基础知识 https://www.wkzy.net/game/196789.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务