手机源码怎么编译-苏通AOSP,成功编译调试Android源码

/前言/

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

温馨提示:本文并非作者个人实践,而是参考部分几位大佬文章的总结。 aosp源码的下载比较耗时。 我不需要编译和扫描源代码。 我只是在解决bug或者理解底层机制的时候看源码。 SDK自带的android.jar和一些在线源代码网站已经足够了。 环境搭建流程基本相同。 遇到问题的时候,好好利用搜索引擎~

/名词/

① AOSP

英文官网:

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

aosp源码编译后会生成一系列产品(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命令行工具将Git命令封装在Python中,以简化多个Git存储库的集中管理。

/回购工作流程/

简单描述一下关键命令:

更详细的内容可以参见:《源代码控制工作流程》(

/系统规划/

只需简单下载源码即可,任何系统都可以,但如果要编译,则需要Linux或MacOS系统。

如果Windows想要编译,可以通过虚拟机安装上述系统来间接实现。 常规方法:Docker或VirtualBox。 前面的安装示例可以看:《Android AOSP基础知识(一)用VirtualBox安装Ubuntu》(

更多详情请参考:《搭建环境》(#using-a-separate-output-directory)

/源码下载/

下面的命令来一波吧~

# ① 安装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

# 附:aosp不包含内核代码,有需要可以单独下载,版本有很多,如:
# 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

更详细的内容可以参见:“下载源码”()

手机源码怎么编译-苏通AOSP,成功编译调试Android源码

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

/编译/

同样,首先对名词进行一些解释:

关系描述:

①编译环境方案

# ① 安装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

③源码单独编译

编译通常需要几个小时,有时可能只是更改其中一个应用程序模块,只需单独编译该模块即可,以setup模块为例:

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,运行模拟器查看

/省砖/

①兄弟Pixel或Nexus

恭喜你,可以直接刷机了,先去DriverBinariesforNexusandPixelDevices()根据你的型号和Android版本号下载对应的驱动。 然后解压并执行:

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

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

adb reboot bootloader
fastboot flashall -w

然后等待刻录完成即可~

②Android虚拟机

你必须自己编译AVD镜像,午餐时选择sdk_phone_x86_64编译目标,除了常规编译之外,你还必须附加sdk和sdk_repo包。

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

③其他手机

没有真正的兄弟,驱动,厂家库等,只能找第三方ROM进行二次开发。 最有名的是CM(CyanogenMod),不过好像很酷,可以试试LineageOS()

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

手机源码怎么编译-苏通AOSP,成功编译调试Android源码

/查看源码/

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

① 在线查看

不用下载一堆代码,多个版本挑着看,很香~

②AS快速查看

依次点击:Settings→Appearance&Behavior→SystemSettings→AndroidSDK→选择所需的AndroidSDK版本源码下载:

然后在build.gradle中设置compileSdk版本号,点击Sync,点击跳转到Framework类进行跳转。

/调试源代码/

① 生成索引

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

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

手机源码怎么编译-苏通AOSP,成功编译调试Android源码

索引生成后,调整AS监控源代码的目录。 像out这样的目录每次编译都会发生变化,但是这个目录基本不会被使用,直接把索引去掉(排除)。 以out目录为例,其他不需要的目录也同样处理:

②设置JDK和SDK

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

设置 JDK:

③ 调试源代码

在源代码断点下,然后单击 AttachDebuggertoAndroidProcess

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

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

很多时候,并不需要使用全部AOSP源码进行调试,也可以直接导出部分源码进行调试。

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

收藏 (0) 打赏

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

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

悟空资源网 源码编译 手机源码怎么编译-苏通AOSP,成功编译调试Android源码 https://www.wkzy.net/game/171677.html

常见问题

相关文章

官方客服团队

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