📢 1. 职业规划篇
📢 2.基础篇
基础篇.用 bugreport 带你看 Crash 和 ANR
📢 3. 系统应用篇
系统应用篇.解密 Partner、google PAI 机制
📢 4. 系统篇
系统篇.SystemServer 简介、自定义 Service 服务一
系统篇.SystemServer 简介、自定义 Service 服务二
系统篇.SystemServer 简介、自定义 Service 服务三
系统篇.SystemServer 简介、自定义 Service 服务四
📢 5. 性能篇
(省)低内存优化
性能篇 (省).SystemServer 与 LMK 的 socket 通信
(稳)稳定性优化
(快)开机优化
framework交流,答疑:251662478
AOSP 编译配置:深入解析 Android.mk 和 Android.bp
在 AOSP(Android Open Source Project)开发中,Android.mk 和 Android.bp 是用于定义 模块编译规则 的核心文件。
本篇文章将详细解析它们的作用、用法以及如何编写高效的编译配置,帮助你更好地 定制 ROM 和系统应用!
🔹 一、Android.mk 文件介绍
Android.mk 是 AOSP 传统的 Makefile 文件,主要用于描述 如何编译可执行文件、共享库、静态库和 APK。
📌 Android.mk 结构
# 1️⃣ 定义当前路径
LOCAL_PATH := $(call my-dir)
# 2️⃣ 清除变量,防止影响其他模块
include $(CLEAR_VARS)
# 3️⃣ 设置模块名称
LOCAL_MODULE := Demo
# 4️⃣ 目标文件(apk、so、可执行文件等)
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
# 5️⃣ 指定编译范围(user/eng/tests/optional)
LOCAL_MODULE_TAGS := optional
# 6️⃣ 说明模块类型(APPS/JAVA_LIBRARIES/SHARED_LIBRARIES/EXECUTABLES)
LOCAL_MODULE_CLASS := APPS
# 7️⃣ 设置签名方式
LOCAL_CERTIFICATE := PRESIGNED # 可选:platform/shared/PRESIGNED
# 8️⃣ 说明模块安装路径(是否是 /system/priv-app 级别应用)
LOCAL_PRIVILEGED_MODULE := false # true 放入 /system/priv-app,false 放入 /system/app
# 9️⃣ 确定模块存放在哪个分区
LOCAL_SYSTEM_EXT_MODULE := false # false 存放在 /system,true 存放在 /system_ext
# 1️⃣0️⃣ 预编译规则
include $(BUILD_PREBUILT)
🔹 二、mk 文件中重要的编译规则
在 AOSP 编译过程中,我们可以 控制模块安装位置、屏幕适配、依赖关系 等。以下是常见的配置:
📌 1. 影响模块的安装位置
LOCAL_SYSTEM_MODULE := true # 安装在 /system/app
LOCAL_SYSTEM_EXT_MODULE := true # 安装在 /system_ext/app
LOCAL_PRODUCT_MODULE := true # 安装在 /product/app
LOCAL_VENDOR_MODULE := true # 安装在 /vendor/app
📢 注意:
/system/priv-app目录下的应用具有 更高的权限,可以使用受限 API。
/system/app目录下的应用则是 普通系统应用。
📌 2. 让其他模块不参与编译
LOCAL_OVERRIDES_PACKAGES := messaging Mms Messages
📢 作用: 让
messaging、Mms、Messages这几个模块 不参与编译。
📌 3. 指定库依赖
LOCAL_OPTIONAL_USES_LIBRARIES := org.apache.http.legacy androidx.window.extensions
📢 作用: 指定 额外的 Java 运行库。
📌 4. 屏幕适配相关
# 适配不同分辨率
LOCAL_DPI_VARIANTS := xxxhdpi xxhdpi xhdpi hdpi mdpi
# 设置资源文件命名规则
LOCAL_DPI_FILE_STEM := $(LOCAL_MODULE)_$(my_src_arch)_%.apk
📢 作用: 适配 不同分辨率设备,保证 UI 兼容性。
🔹 三、Android.bp 文件介绍
AOSP 在 Android 7.0 之后,逐渐用 Android.bp 取代 Android.mk,它基于 Soong 构建系统,语法更清晰,但无法使用循环和条件判断。
📌 Android.bp 结构
android_app {
name: "DemoApp", // 模块名称
srcs: ["src/**/*.java"], // 源文件路径
static_libs: ["libdemo"], // 依赖的静态库
resource_zips: ["res.zip"], // 资源文件
manifest: "AndroidManifest.xml", // 指定清单文件
certificate: "platform", // 签名方式
privileged: true, // 是否安装到 /system/priv-app
}
📢 语法:
Android.bp没有include $(CLEAR_VARS)这样的命令,每个模块直接定义name、srcs、manifest等属性。
🔹 四、常见编译类型
📌 1. 编译 APK
android_app {
name: "MyApp",
srcs: ["src/**/*.java"],
manifest: "AndroidManifest.xml",
}
📌 2. 编译可执行文件
cc_binary {
name: "MyBinary",
srcs: ["main.cpp"],
}
📌 3. 编译共享库(动态库)
cc_library_shared {
name: "libMySharedLib",
srcs: ["lib.cpp"],
}
📌 4. 编译静态库
cc_library_static {
name: "libMyStaticLib",
srcs: ["lib.cpp"],
}
🔹 五、Android.bp 实例解析
📌 示例:ThemePicker
android_app {
name: "ThemePicker",
static_libs: [
"wallpaper-common-deps",
"SettingsLibSettingsTheme",
],
srcs: [
"src/**/*.java",
"src/**/*.kt",
],
resource_zips: ["ThemePicker_res.zip"],
manifest: "AndroidManifest.xml",
certificate: "platform",
privileged: true,
}
📢 作用:
该
Android.bp文件定义了一个 系统 UI 主题应用,它:
依赖 静态库
包含 资源文件
使用 系统签名
具有 系统权限
🔹 六、mk vs. bp:对比分析
| 对比项 | Android.mk | Android.bp |
|---|---|---|
| 构建系统 | GNU Make | Soong |
| 使用版本 | 适用于 Android 7.0 之前 | 适用于 Android 7.0 及更高版本 |
| 语法 | 需要 include 变量 | 直接使用 JSON 类似的格式 |
| 灵活性 | 可以使用 if/else 和 循环 | 不能使用条件判断 |
| 推荐使用 | 旧项目兼容 | 新项目推荐 |
🔹 七、总结
✅ Android.mk 适用于 AOSP 旧版本,语法自由,可以使用 变量、循环、条件判断。
✅ Android.bp 适用于 AOSP 7.0+ ,基于 Soong 构建系统,语法更简洁。
✅ mk 和 bp 不能混用,但可以同时存在(Google 逐步迁移 bp)。
🔹 八、进阶学习
📌 如何将 Android.mk 迁移到 Android.bp ?
📌 如何在 bp 里使用 prebuilt_etc 安装额外资源?
📌 如何修改 AOSP build system 以支持自定义 BoardConfig.mk ?
👉 这些内容会在后续课程中详细讲解,记得关注! 🚀