第二章:Android.bp語法

注意:關(guān)于Android.bp的權(quán)威解釋可以參見 android.bp權(quán)威文檔
Google官方語法文檔https://android.googlesource.com/platform/build/soong

一. Android.bp語法初識

1.1 模塊

從前面的列子可以看出定義一個模塊從模塊的類型開始,模塊有不同的類型,如前面例子中的cc_library_shared,當然類型還有很多種,譬如cc_binary、android_app 、cc_library_static等等。模塊包含一些屬性格式為“property-name:property-value”,其中name屬性必須指定,其屬性值必須是全局唯一的。

其中默認模塊可用于在多個模塊中重復(fù)相同的屬性

cc_defaults {//     //默認模塊名稱
    name: "default_module",
    shared_libs: ["libz"],
    stl: "none",
}
cc_binary {
    name: "test1",
    defaults: ["default_module"],   //引用默認模塊名稱
    srcs: ["src/test/test.c"],
}

srcs 屬性以字符串列表的形式指定用于編譯模塊的源文件。您可以使用模塊引用語法 “:” 來引用生成源文件的其他模塊的輸出,如 genrule 或 filegroup。
實例說明:


~/aosp$ cd frameworks/base/core/java/
~/aosp/frameworks/base/core/java$ vi Android.bp

filegroup {
    name: "IKeyAttestationApplicationIdProvider.aidl",
    srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"],
}

filegroup {
    name: "IDropBoxManagerService.aidl",
    srcs: ["com/android/internal/os/IDropBoxManagerService.aidl"],

~/aosp/frameworks/base/core$ cd ..
~/aosp/frameworks/base$ vi libs/services/Android.bp

cc_library_shared {
    name: "libservices",
    srcs: [
        ":IDropBoxManagerService.aidl",  //這里引用了上面定義的模板
        "src/os/DropBoxManager.cpp",
        "src/os/StatsDimensionsValue.cpp",
        "src/os/StatsLogEventWrapper.cpp",
    ],  
    shared_libs: [
        "libbinder",
        "liblog",
        "libcutils",
        "libutils",
    ]
}

1.2 變量

我們知道Android.mk中可以定義變量,當然作為新編譯系統(tǒng)中替代Android.mk的Android.bp也是一定存在,更加何況Android.mk還可以一定條件的轉(zhuǎn)換成Android.bp。

變量范圍限定為聲明它們的文件的其余部分,可以使用 “=” 號賦值, 但是不能使用 “:=” 賦值。變量是不可變的,但有一個例外它們可以附上+= 賦值,但僅在變量被引用之前。

error: packages/apps/Bluetooth/jni/Android.bp:2:15: expected "=" or "+=" or "{" or "(", found ":"
ninja: error: rebuilding 'out/soong/.minibootstrap/build.ninja': subcommand failed
10:28:15 soong failed with: exit status 1

下面我們看一下正確使用變量的列子:

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

1.3 注釋

我們知道Android.mk中可以進行注釋,當然Android.bp里面也可以,Android.mk中使用#然后添加注釋,Android.bp使用單行注釋//和多行注釋/* */兩種方式。

1.4類型

具體支持以下幾種類型:

  • Bool(true or false)
  • Integers(int)
  • Strings("string")
  • Listsof strings (["string1","string2"])
  • Maps({key1: "value1", key2: ["value2"]})

1.5 操作符

String類型、字符串列表類型和Map類型支持操作符+

1.6 支持模塊類型 *

Android.bp可以支持android_app、cc_binary、cc_binary_host等多種類型,具體定義在Android源碼的build/soong/androidmk/cmd/androidmk/android.go可以查看,具體如下:

var moduleTypes = map[string]string{
    "BUILD_SHARED_LIBRARY":        "cc_library_shared",
    "BUILD_STATIC_LIBRARY":        "cc_library_static",
    "BUILD_HOST_SHARED_LIBRARY":   "cc_library_host_shared",
    "BUILD_HOST_STATIC_LIBRARY":   "cc_library_host_static",
    "BUILD_HEADER_LIBRARY":        "cc_library_headers",
    "BUILD_EXECUTABLE":            "cc_binary",
    "BUILD_HOST_EXECUTABLE":       "cc_binary_host",
    "BUILD_NATIVE_TEST":           "cc_test",
    "BUILD_HOST_NATIVE_TEST":      "cc_test_host",
    "BUILD_NATIVE_BENCHMARK":      "cc_benchmark",
    "BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host",

    "BUILD_JAVA_LIBRARY":             "java_library",
    "BUILD_STATIC_JAVA_LIBRARY":      "java_library_static",
    "BUILD_HOST_JAVA_LIBRARY":        "java_library_host",
    "BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
    "BUILD_PACKAGE":                  "android_app"
}

1.7 支持預(yù)編譯類型

Android.bp可以支持多種預(yù)編譯類型,具體定義在Android源碼的build/soong/androidmk/cmd/androidmk/android.go可以查看,如下圖所示:

var prebuiltTypes = map[string]string{
    "SHARED_LIBRARIES": "cc_prebuilt_library_shared",
    "STATIC_LIBRARIES": "cc_prebuilt_library_static",
    "EXECUTABLES":      "cc_prebuilt_binary",
    "JAVA_LIBRARIES":   "prebuilt_java_library",
}

1.8 條件式編譯

例如:system/core/libusbhost/Android.bp aosp9.0開始

cc_library {
    name: "libusbhost",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    host_supported: true,
    srcs: ["usbhost.c"],
    cflags: ["-Werror"],
    export_include_dirs: ["include"],
    target: {
        android: {    //編譯Android上運行的程序
            cflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"],
        },
        darwin: {    //編譯darwin上運行的程序
            enabled: false,
        },
    },
}

二. Android.bp 舉個例子

Android.bp是一門實戰(zhàn)性的東西,光說不練沒有啥用,說再多不如直接開練來得舒服。那就直接開始手撕實例了,讓我們開戰(zhàn)嗎!
下面幾種庫編譯類型:
2.1 動態(tài)庫類型
最終編譯為so包

cc_library_shared {             //編譯成動態(tài)庫,類似于Android.mk中的BUILD_SHARED_LIBRARY
    name: "libbluetooth_jni",   //編譯出的模塊的名稱,類似于Android.mk中的LOCAL_MODULE
    srcs: [                     //源文件,類似于Android.mk中的LOCAL_SRC_FILES
        "com_android_bluetooth_btservice_AdapterService.cpp",
        "com_android_bluetooth_hfp.cpp",
        "com_android_bluetooth_hfpclient.cpp",
        "com_android_bluetooth_a2dp.cpp",
        "com_android_bluetooth_a2dp_sink.cpp",
        "com_android_bluetooth_avrcp.cpp",
        "com_android_bluetooth_avrcp_controller.cpp",
        "com_android_bluetooth_hid.cpp",
        "com_android_bluetooth_hidd.cpp",
        "com_android_bluetooth_hdp.cpp",
        "com_android_bluetooth_pan.cpp",
        "com_android_bluetooth_gatt.cpp",
        "com_android_bluetooth_sdp.cpp",
    ],
    include_dirs: [             //用戶指定的頭文件查找路徑,類似于Android.mk中的LOCAL_C_INCLUDES
        "libnativehelper/include/nativehelper",
        "system/bt/types",
    ],
    shared_libs: [              //編譯所依賴的動態(tài)庫,類似于Android.mk中的LOCAL_SHARED_LIBRARIES
        "libandroid_runtime",
        "libchrome",
        "libnativehelper",
        "libcutils",
        "libutils",
        "liblog",
        "libhardware",
    ],
    static_libs: [              //編譯所依賴的靜態(tài)庫,類似于Android.mk中的LOCAL_STATIC_LIBRARIES
        "libbluetooth-types",
    ],
    cflags: [                   ///編譯flag,類似于Android.mk中的LOCAL_CFLAGS
        "-Wall",
        "-Wextra",
        "-Wno-unused-parameter",
    ],
}

**2.2 java庫類型: **
最終編譯為jar包

java_library {  /編譯成java庫
    name: "services",//編譯出的模塊的名稱

    dex_preopt: {
        app_image: true,
        profile: "art-profile",
    },

    srcs: [ //源文件
        "java/**/*.java",
    ],

    // The convention is to name each service module 'services.$(module_name)'
    static_libs: [  //編譯所依賴的靜態(tài)庫
        "services.core",
        "services.accessibility",
        "services.appwidget",
        "services.autofill",
        "services.backup",
        "services.companion",
        "services.coverage",
        "services.devicepolicy",
        "services.midi",
        "services.net",
        "services.print",
        "services.restrictions",
        "services.usage",
        "services.usb",
        "services.voiceinteraction",
        "android.hidl.base-V1.0-java",
    ],

    libs: [
        "android.hidl.manager-V1.0-java",
    ],

    // Uncomment to enable output of certain warnings (deprecated, unchecked)
    //javacflags: ["-Xlint"],

}

動態(tài)庫:可以被 install/copy 到應(yīng)用程序包(apk)
靜態(tài)庫:可以被鏈接入動態(tài)庫

  • name : 模塊的名稱
  • src : 模塊的源碼
  • include_dirs : 指定的頭文件查找路徑
  • shared_libs : 編譯時依賴的動態(tài)庫
  • static_libs : 編譯時依賴的靜態(tài)庫
  • subdirs : 是一個文件級的頂層屬性,指定后會查找次級目錄下的Android.bp。

2.3 Andorid應(yīng)用類型
最終編譯為apk包

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 : 靜態(tài)庫,其中 nearme_nfc 為下方定義的:java_import
  • optimize : 壓縮配置,enabled 是否開啟,obfuscate 是否開啟混淆,proguard_flags_files 混淆規(guī)則配置文件
  • host_supported : Android.bp 文件要求每個模塊擁有唯一的名稱,但每個模塊可以內(nèi)置多種變化,例如可以添加 host_supported: true。

轉(zhuǎn)自:https://blog.csdn.net/tkwxty/article/details/104395820

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容