引言
Android.bp是用来替换Android.mk的配置文件,它使用Blueprint框架来解析。Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。Android.bp文件用类似JSON的简洁声明来描述需要构建的模块。
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。
举个例子
android_app {
name: "Camera2",
static_libs: [
"androidx.legacy_legacy-support-v13",
"androidx.legacy_legacy-support-v4",
"androidx.core_core",
"android-ex-camera2-portability",
],
optional_uses_libs: ["org.apache.http.legacy"],
srcs: [
"src/**/*.java",
"src_pd/**/*.java",
"src_pd_gcam/**/*.java",
],
resource_dirs: [
"res",
"res_p",
],
aaptflags: [
"--auto-add-overlay",
"--version-name",
"2.0.002",
"--version-code",
"20002000",
],
sdk_version: "current",
product_specific: true,
optimize: {
proguard_flags_files: ["proguard.flags"],
},
libs: ["org.apache.http.legacy"],
jni_libs: [
"libjni_tinyplanet",
"libjni_jpegutil",
],
}
为了便于理解,可以找到源码,查看Android.mk 与 Android.bp 语法对应规则;
build/soong/androidmk/cmd/androidmk/android.go Android.go
func init() {
addStandardProperties(bpparser.StringType,
map[string]string{
"LOCAL_MODULE": "name",
"LOCAL_CXX_STL": "stl",
"LOCAL_MULTILIB": "compile_multilib",
"LOCAL_ARM_MODE_HACK": "instruction_set",
"LOCAL_SDK_VERSION": "sdk_version",
"LOCAL_MIN_SDK_VERSION": "min_sdk_version",
"LOCAL_NDK_STL_VARIANT": "stl",
"LOCAL_JAR_MANIFEST": "manifest",
"LOCAL_CERTIFICATE": "certificate",
"LOCAL_CERTIFICATE_LINEAGE": "lineage",
"LOCAL_PACKAGE_NAME": "name",
"LOCAL_MODULE_RELATIVE_PATH": "relative_install_path",
"LOCAL_PROTOC_OPTIMIZE_TYPE": "proto.type",
"LOCAL_MODULE_OWNER": "owner",
"LOCAL_RENDERSCRIPT_TARGET_API": "renderscript.target_api",
"LOCAL_JAVA_LANGUAGE_VERSION": "java_version",
"LOCAL_INSTRUMENTATION_FOR": "instrumentation_for",
"LOCAL_MANIFEST_FILE": "manifest",
"LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING": "dex_preopt.profile",
"LOCAL_TEST_CONFIG": "test_config",
"LOCAL_RRO_THEME": "theme",
})
如何把Android.mk转化成Android.bp
out/soong/host/linux-x86/bin/androidmk 利用androidmk生成工具转化Android.mk androidmk
androidmk Android.mk > Android.bp
编译不同类型的模块
编译成 Java 库
Android.mk
include $(BUILD_JAVA_LIBRARY)
Android.bp
java_library {
......
}
编译成 Java 静态库
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
Android.bp
java_library_static {
......
}
编译成 App 应用
Android.mk
include $(BUILD_PACKAGE)
Android.bp
android_app {
......
}
编译成 Native 动态库
Android.mk
include $(BUILD_SHARED_LIBRARY)
Android.bp
cc_library_shared {
......
}
编译成 Native 静态库
Android.mk
include $(BUILD_STATIC_LIBRARY)
Android.bp
cc_library_static {
......
}
编译成 Native 执行程序
Android.mk
include $(BUILD_EXECUTABLE)
Android.bp
cc_binary {
......
}
编译成头文件库
Android.mk
include $(BUILD_HEADER_LIBRARY)
Android.bp
cc_library_headers {
......
}
注意:
Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。