Android.bp在安卓项目中的构建

Android.bp 是 Android 构建系统的一部分,主要用于描述模块和它们之间的依赖关系。它使用一种名为 Blueprint 的 DSL(领域特定语言)来定义模块的属性和行为,取代了之前的 Android.mk 文件。

1. 基本结构

Android.bp 文件的基本结构包括:

  • 模块类型:定义模块的类型,如 cc_libraryjava_library 等。
  • 属性:模块的属性,如名称、源文件、依赖关系等。

2. 常见模块类型

以下是一些常见的模块类型及其用途:

  • cc_library:用于 C/C++ 语言的库。
  • java_library:用于 Java 的库。
  • android_app:用于 Android 应用程序。
  • android_library:用于 Android 库。
  • prebuilt_:用于引入已构建的二进制文件。

3. 示例

示例 1:C++ 库

以下是一个简单的 C++ 库模块的定义:

cc_library {
    name: "mylib",
    srcs: [
        "src/mylib.cpp",
    ],
    shared_libs: [
        "libc",
        "libm",
    ],
    include_dirs: [
        "include",
    ],
}
  • name:模块的名称。
  • srcs:源文件列表。
  • shared_libs:所依赖的共享库。
  • include_dirs:头文件目录。
示例 2:Java 库

下面是一个简单的 Java 库的定义:

java_library {
    name: "myjavapackage",
    srcs: [
        "src/MyClass.java",
    ],
    deps: [
        ":mylib",  // 依赖之前定义的 C++ 库
    ],
}
  • deps:该库所依赖的其他模块。

4. 使用依赖关系

Android.bp 文件中,可以通过不同的方式声明模块之间的依赖关系:

  • 直接依赖:使用 deps 或 shared_libs 声明直接依赖的模块。
  • 间接依赖:依赖的模块也可以声明自己的依赖,构建系统会自动处理。

5. 运行构建

在你定义好 Android.bp 文件后,可以使用以下命令来构建你的项目:

m build myapp

比如/frameworks/base/core/java/Android.bp 这个Android.bp文件

java_library {
167     name: "modules-utils-locallog",
168     srcs: ["android/util/LocalLog.java"],
169     libs: ["unsupportedappusage"],
170     sdk_version: "module_current",
171     min_sdk_version: "30",
172     apex_available: [
173         "//apex_available:anyapex",
174         "//apex_available:platform",
175     ],
176     visibility: ["//visibility:public"],
177 }

java_library {
    name: "modules-utils-locallog",                 // 模块的名称
    srcs: ["android/util/LocalLog.java"],           // 源文件路径
    libs: ["unsupportedappusage"],                   // 依赖的库
    sdk_version: "module_current",                   // SDK 版本
    min_sdk_version: "30",                           // 最小 SDK 版本
    apex_available: [                                // 可用的 APEX 模块
        "//apex_available:anyapex",
        "//apex_available:platform",
    ],
    visibility: ["//visibility:public"],             // 可见性
}
各个属性的解释
  1. name:

    • 定义了库的名称,其他模块可以通过这个名称引用这个库。
    • 在这个例子中,名称为 "modules-utils-locallog"
  2. srcs:

    • 指定库的源文件,这里仅有一个源文件 LocalLog.java
    • 源文件路径是相对于构建文件位置的。
  3. libs:

    • 列出此库所依赖的其他库。在这个例子中,依赖于 unsupportedappusage 库。
    • 这些库在编译时会被链接到这个 Java 库中。
  4. sdk_version:

    • 指定编译时使用的 SDK 版本,这里使用 module_current 表示当前模块的 SDK 版本。
    • 这个设置可以确保与当前 Android SDK 的兼容性。
  5. min_sdk_version:

    • 指定支持的最低 Android SDK 版本,这里设置为 30,表示这个库只能在 API 级别 30 或更高的设备上运行。
  6. apex_available:

    • 指定这个库可用的 APEX 模块,APEX 是 Android 的一部分,用于模块化和版本控制。
    • 这个字段包含两个可用的 APEX 模块:anyapex 和 platform
  7. visibility:

    • 设置模块的可见性,这里设置为 //visibility:public,意味着这个库对所有模块都是可见的。
    • 如果需要限制可见性,可以使用其他设置,比如只允许特定的模块访问。

6.那如何在其它模块对其引用呢?

在其他模块中引用 modules-utils-locallog 库的示例:

plaintextCopy Code

java_library {

name: "myapp-library",

srcs: ["src/MyApp.java"],

deps: [

":modules-utils-locallog", // 引用本地库

],

}

你可能感兴趣的:(Android,代码学习,android)