源码下载
Android 源码
假设我们已经配置好了repo
官网教程:下载 Android 源代码 | Android Open Source Project[1]
mkdir aosp && cd aosp
//google地址
repo init -u https://android.googlesource.com/platform/manifest -b android-15.0.0_r22
//国内地址
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-15.0.0_r22
repo sync -c -j8找到一个空间足够大的目录作为源码和编译产物的工作控件,至少500G
我们使用国内地址初始化repo仓库, -b分支,分支从这里查找 代号、标记和 build 号[2]
拉源码,时间很长,网需要足够好
内核源码
不知道从什么版本开始,内核不参与Android源码编译
mkdir android-kernel && cd android-kernel
//google地址
repo init -u https://android.googlesource.com/kernel/manifest -b common-android15-6.6
//国内地址
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/kernel/manifest -b common-android15-6.6
repo sync -c -j8
创建一个独立的目录android-kernel
初始化repo仓库, -b 指定分支,kernel分支查找对应的android版本分支 Kernel branches and their build systems [3],也可以在系统-设置-关于-版本号里边查看到内核版本号
拉取代码
单编Framework
想要单编某个模块需要先整编系统,然后可以通过Make,mm,mmm等命令单编某个模块, framework下也分为多个模块
framework/base目录下的外层模块,Activity,WindowManager等非服务的组件属于这个模块
base/子目录下的其他模块,如services,核心的而WMS和AMS服务层都属于这个模块
Android 13
在Android 13车载环境测试过
framework.jar
先将编译路径切换到aosp根目录下
两种framework.jar
安装到/system/framework/系统目录下的framework.jar运行时jar包
系统app源码用来访问隐藏API和系统接口调用所引用的依赖包framework.jar
在framework/base/Android.bp中有上面对应的两个模块,其中注释写到:包括可安装和不可安装两种,如果想要修改源码Push到系统查看效果,需要编译 framework-minus-apex模块
// This "framework" module is NOT installed to the device. It's
// "framework-minus-apex" that gets installed to the device. Note that
// the filename is still framework.jar (via the stem property) for
// compatibility reason. The purpose of this module is to provide
// framework APIs (both public and private) for bundled apps.
// "framework-minus-apex" can't be used for the purpose because 1)
// many apps have already hardcoded the name "framework" and
// 2) it lacks API symbols from updatable modules - as it's clear from
// its suffix "-minus-apex".
java_library {
name: "framework",
defaults: ["framework-aidl-export-defaults"],
installable: true, // this lib is a build-only library
static_libs: [
"app-compat-annotations",
"framework-minus-apex",
"framework-updatable-stubs-module_libs_api",
],
sdk_version: "core_platform",
apex_available: ["//apex_available:platform"],
}
编译运行时效果的 framework.jar
make framework-minus-apex编译后会输出:Install out/target/product/xxxx/system/framework/framework.jar
编译API framework.jar
make framework编译后会输出: out/target/product/xxxx/objs/javalibrary.jar
services.jar
在Android Q(10)上也测试过
make services
# 或者
cd frameworks/base/services
mm输出: Install out/target/product/xxxx/system/framework/services.jar
整编aosp
source
source build/envsetup.shlunch
模拟器版本
构建aosp 模拟器使用的镜像
sdk开头的支持模拟器,且模拟器为x86架构, userdebug支持root,开启调试日志
// Android 13
lunch sdk_car_x86_64-userdebug
//Android 15
lunch sdk_car_x86_64-trunk_staging-userdebugmake
j24: 24线程编译
make -j24运行到模拟器
压缩镜像包
make emu_img_zip输出 [100% 1030/1030] Package: out/target/product/emulator_car_x86_64/sdk-repo-linux-system-images-eng.xxx.zip
将压缩包解压到 目录 /data/data/rom,新增一个x86_64的子目录
使用命令行启动模拟器
如果还没有模拟器先通过AndroidStudio创建模拟器
#查看存在的模拟器
$ emulator -list-avds
Pixel_Tablet_API_34
#启动模拟器,指定镜像目录
$ emulator -avd Pixel_Tablet_API_34 -sysdir /data/data/rom/x86_64
内核
Android aosp 编译使用的是预编译内核,位于prebuilt目录下,kernel源码需要单独下载
单编app
SystemUI
检查SystemUI模块名称,位于 frameworks/base/packages/apps/SystemUI/Android.bp
make SystemUIpush到系统生效
首先需要root权限,remount之后一般需要重启生效
adb root
adb remount
adb rebootframework.jar
adb push frameowork.jar /system/framework/framework.jarservices.jar
adb push services.jar /system/framework/servicesjar重启生效
adb reboot
参考链接
[1] 下载 Android 源代码 | Android Open Source Project
[2] 代号、标记和 build 号 | Android Open Source Project
[3] Kernel branches and their build systems | Android Open Source Project