log+android+bp,第二章:Android.bp语法
一. Android.bp語法初識
1.1 模塊
從前面的列子可以看出定義一個模塊從模塊的類型開始,模塊有不同的類型,如前面例子中的cc_library_shared,當然類型還有很多種,譬如cc_binary、android_app 、cc_library_static等等。模塊包含一些屬性格式為“property-name:property-value”,其中name屬性必須指定,其屬性值必須是全局唯一的。
其中默認模塊可用于在多個模塊中重復相同的屬性
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中可以定義變量,當然作為新編譯系統中替代Android.mk的Android.bp也是一定存在,更加何況Android.mk還可以一定條件的轉換成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 支持預編譯類型
Android.bp可以支持多種預編譯類型,具體定義在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是一門實戰性的東西,光說不練沒有啥用,說再多不如直接開練來得舒服。那就直接開始手撕實例了,讓我們開戰嗎!
下面幾種庫編譯類型:
2.1 動態庫類型
最終編譯為so包
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",
"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: [ //編譯所依賴的動態庫,類似于Android.mk中的LOCAL_SHARED_LIBRARIES
"libandroid_runtime",
"libchrome",
"libnativehelper",
"libcutils",
"libutils",
"liblog",
"libhardware",
],
static_libs: [ //編譯所依賴的靜態庫,類似于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: [ //編譯所依賴的靜態庫
"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"],
}
動態庫:可以被 install/copy 到應用程序包(apk)
靜態庫:可以被鏈接入動態庫
name : 模塊的名稱
src : 模塊的源碼
include_dirs : 指定的頭文件查找路徑
shared_libs : 編譯時依賴的動態庫
static_libs : 編譯時依賴的靜態庫
subdirs : 是一個文件級的頂層屬性,指定后會查找次級目錄下的Android.bp。
2.3 Andorid應用類型
最終編譯為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 : 靜態庫,其中 nearme_nfc 為下方定義的:java_import
optimize : 壓縮配置,enabled 是否開啟,obfuscate 是否開啟混淆,proguard_flags_files 混淆規則配置文件
host_supported : Android.bp 文件要求每個模塊擁有唯一的名稱,但每個模塊可以內置多種變化,例如可以添加 host_supported: true。
總結
以上是生活随笔為你收集整理的log+android+bp,第二章:Android.bp语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/运算符(按位与、按位或、按位异或)
- 下一篇: ssh+dwr实现级联操作