android framework 基础篇.系统 mk_bp 讲解

208 阅读6分钟

📢 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

 

AOSP 编译配置:深入解析 Android.mk 和 Android.bp

在 AOSP(Android Open Source Project)开发中,Android.mkAndroid.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) 这样的命令,每个模块直接定义 namesrcsmanifest 等属性。


 

🔹 四、常见编译类型

📌 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.mkAndroid.bp
构建系统GNU MakeSoong
使用版本适用于 Android 7.0 之前适用于 Android 7.0 及更高版本
语法需要 include 变量直接使用 JSON 类似的格式
灵活性可以使用 if/else 和 循环不能使用条件判断
推荐使用旧项目兼容新项目推荐

 

🔹 七、总结

Android.mk 适用于 AOSP 旧版本,语法自由,可以使用 变量、循环、条件判断

Android.bp 适用于 AOSP 7.0+ ,基于 Soong 构建系统,语法更简洁。

mkbp 不能混用,但可以同时存在(Google 逐步迁移 bp)。


 

🔹 八、进阶学习

📌 如何将 Android.mk 迁移到 Android.bp

📌 如何在 bp 里使用 prebuilt_etc 安装额外资源?

📌 如何修改 AOSP build system 以支持自定义 BoardConfig.mk

👉 这些内容会在后续课程中详细讲解,记得关注! 🚀