一、核心差异总览
| 对比维度 | Android.mk (GNU Make) | Android.bp (Blueprint) |
|---|---|---|
| 语言类型 | 基于 Makefile 语法的脚本语言 | 专门为 Android 设计的声明式配置语言 |
| 可读性 | 语法复杂,嵌套逻辑多,新手入门难 | 简洁的 JSON 风格语法,结构清晰,可读性强 |
| 执行效率 | 编译时解析,可能存在重复计算 | 预解析为 Ninja 文件,执行效率更高 |
| 维护成本 | 大型项目中易出现语法错误和依赖混乱 | 强类型检查和结构化定义,减少维护问题 |
| 官方支持 | 逐步被弃用,新功能优先支持 Android.bp | 官方主推的编译配置方式,Android 11+ 强制要求 |
二、详细功能对比
1. 语法结构
-
Android.mk
使用 GNU Make 语法,通过变量赋值、条件判断(ifelse)和函数调用(如$(call my-dir))定义模块。LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := my_module LOCAL_SRC_FILES := file1.cpp file2.cpp include $(BUILD_SHARED_LIBRARY) -
Android.bp
采用声明式 JSON 风格语法,使用键值对定义模块属性,支持嵌套结构和类型标注。cc_library { name: "my_module", srcs: ["file1.cpp", "file2.cpp"], cflags: ["-Wall"], shared_lib: true, }
2. 模块定义方式
-
Android.mk
通过include $(BUILD_XXX)宏指定模块类型,需手动管理变量清空(CLEAR_VARS)。include $(CLEAR_VARS) LOCAL_MODULE := app LOCAL_PACKAGE_NAME := com.example.app include $(BUILD_PACKAGE) -
Android.bp
模块类型通过前缀明确(如cc_library、java_library、android_app),无需手动清空状态。android_app { name: "app", package: "com.example.app", srcs: ["src/*.java"], }
3. 依赖管理
-
Android.mk
使用LOCAL_STATIC_JAVA_LIBRARIES等变量声明依赖,需手动处理路径。LOCAL_STATIC_JAVA_LIBRARIES := lib1 lib2 -
Android.bp
通过deps字段声明依赖,支持相对路径和模块名引用,自动解析依赖关系。java_library { name: "lib_app", deps: ["lib1", "lib2"], }
4. 变量作用域
-
Android.mk
全局变量共享,容易因命名冲突导致意外覆盖,需谨慎管理变量名。MY_VAR := value1 # 其他文件可能修改 MY_VAR MY_VAR := value2 -
Android.bp
变量作用域限于模块内部,通过local关键字定义局部变量,避免全局污染。cc_library { name: "my_lib", local: { src_dir: "src/main/cpp", }, srcs: ["$(local.src_dir)/file.cpp"], }
5. 条件编译
-
Android.mk
使用 Make 语法的条件判断(ifeq、ifneq),逻辑复杂时可读性差。ifeq ($(TARGET_ARCH), arm64) LOCAL_CFLAGS += -march=armv8-a endif -
Android.bp
通过condition字段定义条件块,支持基于编译变量的逻辑判断,结构更清晰。cc_library { name: "arch_lib", srcs: ["common.cpp"], condition: { if: {TARGET_ARCH == "arm64"}, then: { srcs: ["arm64_specific.cpp"], }, }, }
三、迁移建议
- 新项目:直接使用 Android.bp,遵循官方推荐的配置方式。
- 旧项目迁移:
- 使用
bpconvert工具(位于build/soong/tools/bpconvert)自动转换 Android.mk 到 Android.bp。 - 优先迁移核心模块,逐步替换外围模块,避免一次性大规模修改。
- 使用
- 学习资源:
- 官方文档:Android Build System
- 示例仓库:Android 源码中的
packages/apps/目录包含大量 Android.bp 实例。
四、总结
Android.bp 通过声明式语法和结构化设计,解决了 Android.mk 在大型项目中维护困难、效率低下的问题,是 Android 编译系统的未来发展方向。若项目支持,建议尽早迁移至 Android.bp,以获得更好的编译性能和开发体验。
3726

被折叠的 条评论
为什么被折叠?



