环境说明

  • 操作系统:Ubuntu 20.04
  • 内存:32GB
  • CPU:12核心(推荐开启虚拟化 VT-x 支持)
  • 存储空间:1TB(建议使用SSD)
  • 编译时间
    • 首次完整编译约需 1小时+
    • 增量编译(修改单个模块)只需 十几分钟

AOSP 源码拉取及编译

一、源码拉取

1. 安装所需工具

sudo apt update
sudo apt install openjdk-11-jdk git curl python3 python-is-python3 repo -y

repo 是 Google 提供的管理 AOSP 多仓库工具。

2. 配置 repo

mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

建议将 export PATH=~/bin:$PATH 加入 .bashrc.zshrc 中,便于长期使用。

3. 初始化源码

mkdir aosp
cd aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r48

说明:

  • -u 后跟 manifest 仓库地址
  • -b 指定分支,android-11.0.0_r48 仅为示例,实际可根据需要选择版本

4. 拉取源码

repo sync -c -j$(nproc)

参数说明:

  • -c 只拉取当前分支
  • -j$(nproc) 多线程同步,加快拉取速度

全部源码约 100GB+,需要耐心等待。


二、源码编译

1. 编译前准备

source build/envsetup.sh
lunch

执行 lunch 后会提示选择构建目标,如 aosp_x86_64-eng。推荐使用 x86 模拟器环境调试,开发效率较高。

2. 开始编译

make -j$(nproc)

make 会构建整个系统镜像,包括 framework、系统服务、启动程序、内核镜像等。

3. 启动模拟器

emulator -verbose -cores 4 -show-kernel

参数说明:

  • -verbose:显示详细模拟器日志
  • -cores 4:模拟使用4核心
  • -show-kernel:输出内核日志,便于调试 init 或系统服务问题

若提示 emulator not found,可以在 prebuilts/android-emulator/ 路径下找到。


编写系统级 App

如果你的 App 需要访问隐藏或系统 API(如 LocationManagerService、PackageManagerService),必须以 系统身份运行,也就是打包成 system app

一、Manifest 权限声明

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.systemapp"
    android:sharedUserId="android.uid.system">

sharedUserId="android.uid.system" 表示此 App 与系统进程共享 uid,可以调用系统 API。

二、编译为系统 App

将你的应用放入源码路径下的 packages/apps/MySystemApp/ 中,并加入 Android.mkAndroid.bp

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := MySystemApp
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := MySystemApp
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)

或者使用 Android.bp:

android_app {
    name: "MySystemApp",
    srcs: ["src/**/*.java"],
    platform_apis: true,
    privileged: true,
    certificate: "platform",
}

然后执行系统增量编译:

make MySystemApp -j$(nproc)

最终会生成在 out/target/product/<device>/system/priv-app/ 目录下。

三、注意事项

  • App 必须使用 platform 签名,才能生效
  • 若使用 adb install 安装带 sharedUserId 的系统 App,会 失败,需放入 system 分区后随系统启动
  • 可通过 adb root && adb remount 进行动态替换,但重启后会恢复原样,调试方便