Android.bp 语法浅析

随着 android 工程越来越大,包含的 module 越来越多,以 makefile 组织的项目编译花费的时间越来越多。Google 在 7.0 引入了 ninja 是 Google 的一名程序员推出的注重速度的构建工具,一般在 Unix/Linux 上的程序通过 make/makefile 来构建编译,而 Ninja 通过将编译任务并行组织,大大提高了构建速度。

7.0 的时候 android 项目还是有大部分是由 makefile 来组织的,因此 Google 引入了 kati 将 makefile 翻译成 ninja 文件。8.0 开始,android 引入了 Android.bp 来替代 之前的 Android.mk 文件,不同于Android.mk,Android.bp只是纯粹的配置文件,不包括分支、循环等流程控制。在 android 项目上如何进行选择编译、解析配置、转换成 ninja 等,Soong 就被创造出来,将 Android.bp 转换为ninja文件进行管理。

简而言之,kati 把 bp 直接翻译成 ninja,blueprint / soong 则把 bp 翻译成 ninja。

Android.bp --> Blueprint --> Soong --> Ninja
Makefile or Android.mk --> kati --> Ninja

1. 模块

cc_library_shared {                //编译成动态库,类似于Android.mk中的BUILD_SHARED_LIBRARY
    name: "libbluetooth_jni",    //编译出的模块的名称,类似于Android.mk中的LOCAL_MODULE
    srcs: [                     //源文件,类似于Android.mk中的LOCAL_SRC_FILES
        "com_android_bluetooth_btservice_AdapterService.cpp"
    ],
    include_dirs: [                //用户指定的头文件查找路径,类似于Android.mk中的LOCAL_C_INCLUDES
        "libnativehelper/include/nativehelper",
        "system/bt/types",
    ],
    shared_libs: [                //编译所依赖的动态库,类似于Android.mk中的LOCAL_SHARED_LIBRARIES
        "libandroid_runtime",
        "libchrome",
    ],
    static_libs: [                //编译所依赖的静态库,类似于Android.mk中的LOCAL_STATIC_LIBRARIES
        "libbluetooth-types",
    ],
    cflags: [                    ///编译flag,类似于Android.mk中的LOCAL_CFLAGS
        "-Wall",
        "-Wextra",
        "-Wno-unused-parameter",
    ],
}
subdirs = ["subdir1", "subdir2"]

定义一个模块从模块的类型开始,模块有不同的类型,上面例子中的 cc_library_shared 声明编译成动态库,当然类型还有很多种,譬如 cc_binary android_app、cc_library_static 等等。模块包含一些属性格式为 property-name:property-value,其中name属性必须指定,其属性值必须是全局唯一的。

动态库:可以被 install/copy 到应用程序包(apk)
静态库:可以被链接入动态库
  • name : 模块的名称
  • src : 模块的源码
  • include_dirs : 指定的头文件查找路径
  • shared_libs : 编译时依赖的动态库
  • static_libs : 编译时依赖的静态库
  • subdirs : 是一个文件级的顶层属性,指定后会查找次级目录下的Android.bp。

2. 示例

我们来看一下,android 中一个实际的 bp 文件:

android_app {
    name: "NFC",
    srcs: [
        "src/**/*.java",
        "nci/**/*.java",
        ":statslog-Nfc-java-gen",
    ],
    platform_apis: true,
    certificate: "platform",
    jni_libs: ["libsn100nfc_nci_jni"],
    libs: ["com.nxp.nfc.nq"],
    static_libs: [
        "androidx.appcompat_appcompat",
        "nearme_nfc",
        ],
    optimize: {
        enabled: true,
        obfuscate: true,
        proguard_flags_files: ["proguard.flags"],
    },
}

java_import {
    name: "nearme_nfc",
    host_supported: true,
    jars: [
        "libs/env.jar",
    ],
}
  • platform_apis : 用 sdk 的 hide 的 api 來编译
  • certificate : 指定用的是什么签名,如上用的是 platform 签名。
  • jni_libs : 依赖使用的 JNI 库
  • libs : 工程中的 libs 库
  • static_libs : 静态库,其中 nearme_nfc 为下方定义的:java_import
  • optimize : 压缩配置,enabled 是否开启,obfuscate 是否开启混淆,proguard_flags_files 混淆规则配置文件
  • host_supported : Android.bp 文件要求每个模块拥有唯一的名称,但每个模块可以内置多种变化,例如可以添加 host_supported: true。

3. 转换 mk

Soong 包含了一个工具,可以将 Android.mk 文件转换为 Android.bp 文件:
androidmk Android.mk > Android.bp

工具位于:android\out\soong\host\linux-x86\bin\androidmk 该工具可以转换变量,模块,注释和一些条件,但任何自定义的 Makefile 规则,复杂条件或额外的 include 必须手动转换。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值