下载编译源代码

  1. 下载源代码
    1. 初始化Manifest
    2. 同步源代码
  2. 编译源代码
    1. 设置编译环境
    2. 选择编译目标
    3. 编译代码
    4. 修改源代码
    5. 编译产生物
      1. 编译镜像
      2. 系统常用jar包路径

下载源代码

初始化Manifest

repo init –depth=1 -u https://android.googlesource.com/platform/manifest -b android13-release
镜像使用:将 https://android.googlesource.com/ 全部使用 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/ 代替即可。

repo init –depth=1 -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android13-release

-b 指定下载分支为android13-release
–depth=1 只下载最新的提交,不下载历史记录,会加速很多

此Manifest非彼Manifest,他是用来描述Repo的目录结构的,它显式的描述每一个工程是从哪个代
码仓库来的,是哪个分支,哪个Tag。它在$DIR/.repo目录下存在一个default.xml,里面就是这个manifest文件。我们在$DIR/.repo/local_manifests/*
.xml创建本地文件,里面配置修改的工程。

1
2
3
4
5
<manifest>
<project path="manifest" name="tools/manifest" />
<project path="platform-manifest" name="platform/manifest" />
</manifest>

同步源代码

使用命令行将仓库的代码下载到本地:
repo sync -c –no-clone-bundle –no-tags -j8
参数说明

-c 使用当前分支,不下载其他分支源代码
–no-clone-bundle 不下载bundle的文件
–no-tags 不下载tags
-j8 使用8个线程进行下载

编译源代码

在完成源代码下载之后,需要进行源代码的编译工作,产生重要的镜像文件(Image)

设置编译环境

1
source build/envsetup.sh

每次启动 terminal 的时候都需要重新设置编译环境,否则会出现找不到文件路径和命令的情况。

选择编译目标

1
lunch

选择适配的目标构建版本(开发板或者模拟器),所有构建目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE
是以下类型之一:

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

根据我们的模拟器环境,选择x86(Intel芯片的mac)或者 arm(m系列的mac)的系统镜像。
备注:⻋机模拟器运行类型以“sdk_car_”开头

编译代码

使用envsetup脚本中提供的编译命令,来进行系统镜像的编译

1
m -j8

参数说明

-j8 使用8个线程进行下载

可以通过在 m 命令行中列出相应名称来构建特定模块,而不是构建完整的设备映像。此外,m 还针对各种特殊目的提供了一些伪目标。以下是一些示例:

  • droid - m droid 是正常 build。此目标在此处,因为默认目标需要名称。
  • all - m all 会构建 m droid 构建的所有内容,加上不包含 droid 标记的所有内容。构建服务器会运行此命令,以确保包含在树中且包含
  • Android.mk 文件的所有元素都会构建。
  • m - 从树的顶部运行构建系统。这很有用,因为您可以在子目录中运行 make。如果您设置了 TOP
    环境变量,它便会使用此变量。如果您未设置此变量,它便会从当前目录中查找相应的树,以尝试找到树的顶层。您可以通过运行不包含参数的
    m 来构建整个源代码树,也可以通过指定相应名称来构建特定目标。
  • mma - 构建当前目录中的所有模块及其依赖项。
  • mmma - 构建提供的目录中的所有模块及其依赖项。
  • croot - cd 到树顶部。
  • clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同。
    说明:
1
make/m

该命令会编译所有的代码。我们可以通过添加参数-jN来并发加速执行,这将极大加速我们编译系统速度。
第一次编译如果是-j12的话,时间大概是6小时,如果默认的话,时间会变成12小时。

1
mm/mmm

如果每次的编译都要等待6个小时,那么我们的工作就很难开展。Android系统支持增量编译,还支持独立编译Module。mm命令就提供我们一种可能性,它编译当前目录下的所有模块。以services.jar为例,mm编译的时间在10分钟,可以极大的提高我们的开发效率。

修改源代码

官方给我们提供了很多快捷指令来帮助我们修改更新源代码,关于修改验证会在后续的章节详细介绍,这里不做过多的讲解。以下罗列一些常见的指令:

  • croot 快速切换回源代码根目录
  • cgrep 在本地所有的C/C++文件中寻找内容
  • jgrep 在本地所有的Java文件中寻找内容

编译产生物

编译镜像

编译完成后,会产生编译好的镜像。位于以下目录中:

1
$DIR/out/target/product/$Lunch_Target/

这里面有两个镜像非常重要,一个是Boot.img,另一个是System.img

- Boot.img 主要包含Linux kernel以及Ramdisk根文件系统
- System.img 包含整个Android系统,/system目录的内容,包含系统应用,Android框架等等
- Userdata.img 包含了用户安装的应用信息跟数据,在/data目录

系统常用jar包路径

当需要进行系统应用或者服务开发时,有一些API是内部internel级别或者hide级别,需要我们引入AOSP的原生jar包来解决。

如何找到对应目录的jar包?

  • 在AOSP根目录下通过find -name “*xxx*查找到所有路径
  • 在Android13后,应该在这个路径下进行挑选:./out/soong/.intermediates/packages/…/android_common/**
    或者out/target/common/obj/JAVA_LIBRARIES/目录下寻找。

出现多个不同地址jar包如何选择?
这些jar包会出现在多个路径中,例如:’withres-withoutdex/’, ‘aligned/’, ‘dex/’,’turbine-combined/’, ‘turbine/’, ‘javac/‘等等:

  • withres-withoutdex: 这个目录下的JAR文件包含了所有的.class文件和资源文件,但没有被打包成dex格式。
  • aligned: 这个目录下的JAR文件包含了所有的.class文件和资源文件,并且已经被对齐和压缩过。
  • dex: 这个目录下的JAR文件是一个标准的dex文件,里面包含了所有的.class文件。
  • turbine-combined: 这个目录下的JAR文件包含了用于编译Java代码的Turbine编译器生成的代码。
  • turbine: 这个目录下的JAR文件包含了Turbine编译器生成的代码,但是这些代码没有被合并成单个文件。
  • javac: 这个目录下的JAR文件包含了用于编译Java代码的Javac编译器生成的代码。
    注意:如果需要引入jar包参与编译,不能选择turbine或者turbine-combined的jar包,否则会遇到desugar异常。

下面罗列一些常见的jar包地址
Framework.jar
AOSP/out/soong/.intermediates/frameworks/base/framework-minus-apex/android_common/combined/framework-minus-apex.jar
注意:这个framework.jar不能从
AOSP/out/target/product/emulator_car_x86_64/system/framework/framework.jar,这里面的jar包不全,缺少东西

Framework-bluetooth.jar
~AOSP/out/target/common/obj/JAVA_LIBRARIES/framework-bluetooth.com.android.btservices_intermediates/classes.jar

Framework-wifi.jar
~AOSP/out/target/common/obj/JAVA_LIBRARIES/framework-wifi.com.android.wifi_intermediates/classes.jar

Car-lib.jar
~
AOSP/out/soong/.intermediates/packages/services/Car/car-lib/android.car/android_common/withres-withoutdex/android.car.jar

Core-libart.jar
~AOSP/out/soong/.intermediates/libcore/core-libart/android_common_apex31/withres-withoutdex/core-libart.jar


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 350394277@qq.com

Title:下载编译源代码

Count:1.9k

Author:Yunlong Wen

Created At:2023-12-17, 14:18:27

Updated At:2023-12-17, 14:18:27

×

donation.headline