AOSP 编译配置:深入解析 Android.mk 和 Android.bp
基础篇.系统 mk_bp 讲解
📢 1. 职业规划篇
来聊聊安卓职业规划?整机开发大专能做么?
📢 2.基础篇
基础篇.前言
基础篇.编译环境搭建
基础篇.源码目录简介
基础篇.系统 mk_bp 讲解
基础篇.开机动画定制
基础篇.定制桌面壁纸、导航方式
基础篇.系统属性、api 使用
基础篇.名称修改、名词介绍
基础篇.用 bugreport 带你看 Crash 和 ANR
基础篇.Provision 源码分析
📢 3. 系统应用篇
系统应用篇.开机向导制作一
系统应用篇.开机向导制作二
系统应用篇.Settings 导航切换分析
系统应用篇.开机向导导航切换一
系统应用篇.开机向导导航切换二
系统应用篇.gms 制作集成
系统应用篇.开机向导适配 GMS
系统应用篇.Launcher3 结构剖析一
系统应用篇.Launcher3 结构剖析二
系统应用篇.Launcher3 结构剖析三
系统应用篇.Launcher3 图标加载流程一
系统应用篇.Launcher3 图标加载流程二
系统应用篇.Launcher3 桌面布局定制
系统应用篇.解密 Partner、google PAI 机制
系统应用篇.Partner 机制预制壁纸、默认布局
系统应用篇.Launcher 双排 Hotseat 定制一
系统应用篇.Launcher 双排 Hotseat 定制二
系统应用篇.Launcher 双排 Hotseat 定制三
系统应用篇.Launcher Taskbar 简介以及调出
系统应用篇.SystemUI 篇_用工具教会你看布局、进程
系统应用篇.SystemUI 结构讲解一
系统应用篇.SystemUI 结构讲解二
系统应用篇.SystemUI 的启动流程
系统应用篇.SystemUI 导航栏创建一
系统应用篇.SystemUI 导航栏创建二
系统应用篇.SystemUI 自定义导航按键
系统应用篇.SystemUI 快捷面板下拉流程
系统应用篇.SystemUI 定制禁用锁屏下拉通知栏
系统应用篇.SystemUI 通知注册流程
系统应用篇.SystemUI 通知发送流程
📢 4. 系统篇
系统篇.SystemServer 篇_应用与系统进程间关系
系统篇.SystemServer 简介、自定义 Service 服务一
系统篇.SystemServer 简介、自定义 Service 服务二
系统篇.SystemServer 简介、自定义 Service 服务三
系统篇.SystemServer 简介、自定义 Service 服务四
系统篇.SELinux 问题解决套路一
系统篇.SELinux 问题解决套路二
系统篇.ActivityManagerService 简介
系统篇.WindowManagerService 简介一
系统篇.WindowManagerService 简介二
系统篇.PackageManagerService 简介一
系统篇.PackageManagerService 简介二
系统篇.FW 实战 - Letterbox 定制应用方向一
系统篇.FW 实战 - Letterbox 定制应用方向二
系统篇.分屏流程一
系统篇.分屏流程二
📢 5. 性能篇
(省)低内存优化
性能篇 (省). 低内存查杀机制
性能篇 (省).SystemServer 与 LMK 的 socket 通信
性能篇 (省). 内核进程 LMKD
性能篇 (省). 内存分析
性能篇 (省). 内存泄漏定位与解决
(稳)稳定性优化
性能篇 (稳).WatchDog 检测机制一
性能篇 (稳).WatchDog 检测机制二
性能篇 (稳). 深入 Crash 捕获器流程一
性能篇 (稳). 深入 Crash 捕获器流程二
性能篇 (稳). 深入炸弹 ANR 流程一
性能篇 (稳). 深入炸弹 ANR 流程二
(快)开机优化
性能篇 (快). 开机耗时分析
性能篇 (快). 开机耗时优化
性能篇.实战优化方案分享
framework交流,答疑:251662478
🔹 一、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 适用于 AOSP 旧版本,语法自由,可以使用 变量、循环、条件判断。
✅ Android.bp 适用于 AOSP 7.0+,基于 Soong 构建系统,语法更简洁。
✅ mk 和 bp 不能混用,但可以同时存在(Google 逐步迁移 bp)。
🔹 八、进阶学习
📌 如何将 Android.mk 迁移到 Android.bp?
📌 如何在 bp 里使用 prebuilt_etc 安装额外资源?
📌 如何修改 AOSP build system 以支持自定义 BoardConfig.mk?
👉 这些内容会在后续课程中详细讲解,记得关注! 🚀