源码下载

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下也分为多个模块

  1. framework/base目录下的外层模块,Activity,WindowManager等非服务的组件属于这个模块

  2. base/子目录下的其他模块,如services,核心的而WMS和AMS服务层都属于这个模块

Android 13

在Android 13车载环境测试过

framework.jar

先将编译路径切换到aosp根目录下

两种framework.jar

  1. 安装到/system/framework/系统目录下的framework.jar运行时jar包

  2. 系统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.sh

lunch

模拟器版本

构建aosp 模拟器使用的镜像

sdk开头的支持模拟器,且模拟器为x86架构, userdebug支持root,开启调试日志

// Android 13
lunch sdk_car_x86_64-userdebug

//Android 15
lunch sdk_car_x86_64-trunk_staging-userdebug

make

  • 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 SystemUI

push到系统生效

首先需要root权限,remount之后一般需要重启生效

adb root
adb remount
adb reboot

framework.jar

adb push frameowork.jar /system/framework/framework.jar

services.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

春风花气馥,秋月寒江湛