背景:
经常有学员朋友反馈一些Android.bp不知道如何写,希望有一个比较全面的文档进行说明进行学习。其实这个问题很多同学应该都有,不过在这里我其实不建议大家刚开始就一直想着要全面掌握Android.bp相关语法为目的方式进行学习,主要原因有以下几个:
1、这种方式大大耗费大家的时间,而且大家耗费时间去学习一堆的语法,学习了前面忘记了后面,最后还是很多不懂
2、学习了很多Android.bp相关语法,可能大部分都是平常不用的,或者是基本上用不上的。
这个就有点类似大家刚开始去学习某个编程语言,一上来就想要一个很全面文档介绍来学习掌握,这种肯定不是正确方式,正确Android.bp快速学习方式建议如下:
1、一定要先从简单的案例开始进行实战编写掌握,比如大家可以刚开始不需要在乎什么语法,属性等,直接在系统写简单的Android.bp,主要包含常见的native程序,so库,apk程序,jar包等目标类型的bp。不需要多么复杂的功能,只需要可以实现最基本的既可以。
2、要多参考学习aosp系统中现有的一些Android.bp,完全可以基于它们改造成自己的项目Android.bp.
3、不用纠结于实战过程中有偶尔不懂的属性语法,这种正常,遇到时候再进查询理解既可以
4、如果本身Android.mk,可以用命令进行转换,或者研究命令转换源码
Android.bp相关介绍
定位与作用:Android.bp 是 Android 构建系统(Soong)的核心配置文件,用于定义模块的构建规则及依赖关系。它替代了传统的 Android.mk 文件,语法类似 JSON,但更简洁高效,支持模块化管理。
发展历程:从 Android 7.0 开始引入,Android 8.0 后成为默认配置,基于 Ninja 构建框架,通过 Blueprint 解析,最终生成 Ninja 文件执行编译
常见模块案例
Java 库模块
模块类型: java_library
用于编译 Java 代码生成 .jar 文件。
java_library { //模块类型为 java 库,这个类型与 java_library_static 是完全一样的
name: "api.test", //模块名
installable: true, //下面详细说明
srcs: [
"java/**/*.java", //文件列表
],
static_libs: ["xxxx"], // 依赖其他库
}
installable 配置有必要作下说明
java_library builds and links sources into a .jar file for the device, and possibly for the host as well. By default, a java_library has a single variant that produces a .jar file containing .class files that were compiled against the device bootclasspath. This jar is not suitable for installing on a device, but can be used as a static_libs dependency of another module. Specifying installable: true will product a .jar file containing classes.dex files, suitable for installing on a device.
简单的说就是如果不指定 installable: true, 则编译出来的 jar 包里面是 .class 文件。这种包是没法安装到系统上的,只能给其他 java 模块作为 static_libs 依赖。
指定 installable: true, 则编译出来的 jar 包里面是 classes.dex 文件。这种才是 Android 虚拟机可以加载的格式。
Android 应用模块
模块类型: android_app
构建 APK 应用。
android_app {
name: "MyApp",
srcs: ["src/**/*.java"],
manifest: "src/main/AndroidManifest.xml",
resource_dirs: ["res"],
static_libs: ["mylibrary"], // 依赖内部 Java 库
certificate: "platform", // 使用系统签名
}
native共享库模块
模块类型: cc_library_shared
生成动态共享库(.so 文件)。
cc_library_shared {
name: "mylib",
srcs: ["src/*.cpp"],
shared_libs: ["liblog"],
export_include_dirs: ["include"],
}
native静态库模块
模块类型: cc_library_static
生成静态库(.a 文件)。
cc_library_static {
name: "mylib_static",
srcs: ["src/*.cpp"],
include_dirs: ["include"],
}
native可执行文件模块
模块类型: cc_binary
编译 C/C++ 可执行程序。
cc_binary {
name: "mybin",
srcs: ["main.cpp"],
cflags: ["-Wall", "-Werror"],
shared_libs: ["liblog"],
}
预编译库模块
模块类型: cc_prebuilt_binary
引入预编译的二进制文件。
cc_prebuilt_binary {
name: "prebuilt_bin",
srcs: ["prebuilt/*.so"],
}
Android.bp相关属性文档查阅
写Android.bp时候可能会遇到一些陌生的属性等,这些属性需要有相关文档来查询作用。
相关Android.bp属性介绍的全面文章可以查阅如下:
https://note.qidong.name/demo/soong_build/
如何基于现有Android.mk升级成Android.bp
编写bp时候如果之前有Android.mk,那其实可以直接使用androidmk命令进行转换然后改造,当然也可以自己手写,Android.mk和Android.bp中对应的关键字,其实都有对应的关系,这个也就是为啥可以命令转换的核心原理。
可以去目录:
build/soong/androidmk/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_installable", // will be rewritten to java_library by bpfix
"BUILD_STATIC_JAVA_LIBRARY": "java_library",
"BUILD_HOST_JAVA_LIBRARY": "java_library_host",
"BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
"BUILD_PACKAGE": "android_app",
"BUILD_RRO_PACKAGE": "runtime_resource_overlay",
"BUILD_CTS_EXECUTABLE": "cc_binary", // will be further massaged by bpfix depending on the output path
"BUILD_CTS_SUPPORT_PACKAGE": "cts_support_package", // will be rewritten to android_test by bpfix
"BUILD_CTS_PACKAGE": "cts_package", // will be rewritten to android_test by bpfix
"BUILD_CTS_TARGET_JAVA_LIBRARY": "cts_target_java_library", // will be rewritten to java_library by bpfix
"BUILD_CTS_HOST_JAVA_LIBRARY": "cts_host_java_library", // will be rewritten to java_library_host by bpfix
}
var prebuiltTypes = map[string]string{
"SHARED_LIBRARIES": "cc_prebuilt_library_shared",
"STATIC_LIBRARIES": "cc_prebuilt_library_static",
"EXECUTABLES": "cc_prebuilt_binary",
"JAVA_LIBRARIES": "java_import",
"APPS": "android_app_import",
"ETC": "prebuilt_etc",
}
更多framework实战开发,请关注下面千里马学框架“”