android.bp和android.mk的区别

一、核心差异总览
对比维度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_libraryjava_libraryandroid_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 语法的条件判断(ifeqifneq),逻辑复杂时可读性差。

    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"],
            },
        },
    }
    
三、迁移建议
  1. 新项目:直接使用 Android.bp,遵循官方推荐的配置方式。
  2. 旧项目迁移
    • 使用 bpconvert 工具(位于 build/soong/tools/bpconvert)自动转换 Android.mk 到 Android.bp。
    • 优先迁移核心模块,逐步替换外围模块,避免一次性大规模修改。
  3. 学习资源
    • 官方文档:Android Build System
    • 示例仓库:Android 源码中的 packages/apps/ 目录包含大量 Android.bp 实例。
四、总结

Android.bp 通过声明式语法和结构化设计,解决了 Android.mk 在大型项目中维护困难、效率低下的问题,是 Android 编译系统的未来发展方向。若项目支持,建议尽早迁移至 Android.bp,以获得更好的编译性能和开发体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值