AOSP构建-Android.bp的理解


C/C++是一种非常古老的编程语言,在大型项目开发管理过程中,单靠MAKE,CMAKE等工具已经不满足需求了,因此催生出了各种个样的构建工具,比如Google自家的GN,Bazel等,还有CMake,XMake,Vcpkg等.工具虽然多种多样,但是要解决问题是一样的,思路也大同小异.

从Android 7.0开始,ASOP开始引入Soong构建系统,用来替换之前的Make.
Soong使用bp文件来描述构建:

cc_library_shared {
     name: “libxmlrpc++”,

     rtti: true,
     cppflags: [
           “-Wall”,
           “-Werror”,
           “-fexceptions”,
     ],
     export_include_dirs: [“src”],
     srcs: [“src/**/*.cpp”],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

这个语法和Google的GN,Bazel有点像.

Android.bp 文件格式

bp文件中不包含任何条件语句和控制语句,所有复杂的问题都由Go编写逻辑处理.

模块/Module

Android.bp中的模块都以模块类型开头,模块类型有很多,具体的参考Soong模块类型.

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

每个模块下都必须有一个唯一的name属性,不同的模块类型下面的属性各不相同,还比价灵活.后面总结下一些常见的模块和它的属性.

C++

对于C++模块来说,我们一般关注三种类型:

  • cc_binary
    即二进制执行文件

    cc_binary {
      name: "android.hardware.biometrics.fingerprint@2.1-service",
      defaults: ["hidl_defaults"],
      init_rc: ["android.hardware.biometrics.fingerprint@2.1-service.rc"],
      vintf_fragments: ["android.hardware.biometrics.fingerprint@2.1-service.xml"],
      vendor: true,
      relative_install_path: "hw",
      srcs: [
          "BiometricsFingerprint.cpp",
          "service.cpp",
      ],
    
      shared_libs: [
          "libcutils",
          "liblog",
          "libhidlbase",
          "libhardware",
          "libutils",
          "android.hardware.biometrics.fingerprint@2.1",
      ],
    
    }

    srcs: 表示模块包含的源文件
    init_rc : 表示如果该模块被安装,这些rc配置文件也会被安装
    shared_lib : 表示会被链接到该模块的动态链接库
    vendor: 模块是否与特定的SOC有关
    relative_install_path: 安装到默认安装目录的子目录

  • cc_library_shared
    动态链接库

  • cc_library_static
    静态链接库

java

  • android_app
  • java_library

默认模块

默认模块可用于在多个模块中重复使用相同的属性。例如:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

预编译的模块

某些预编译的模块name与源码中模块的name相同.

总结

  1. 遇到不清楚的属性,模块类型,直接查文档就行

文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
 上一篇
使用VSCode阅读Android源码 使用VSCode阅读Android源码
在VSCode 中 ,打开命令面板进行编辑,可以使用UI页面编辑,也可以直接编辑json文件. 主要就是includePath,把主要的头文件路径都包含进去: { "configurations": [ {
2020-06-25
下一篇 
Android系统启动流程-Zygote分析 Android系统启动流程-Zygote分析
zygote是通过app_process或者app_process64命令行程序启动的. 先来看下app_process的流程: app_processint main(int argc, char* const argv[]) {
2020-06-25
  目录