没有繁杂的理论,单纯分享如何为我们的模块写 bp 文件,或者说如何将我们添加的模块加入到 bp 文件中。
1、确定模块的编译类型
这是首先要确定下来的,我们需要把源代码编译成什么类型的?常见的模块类型有: android_app :app,就是编写一个 apk cc_binary :可执行文件 cc_library_shared :native 动态库 cc_library_static :native 静态库 java_library :java 库 java_library_shared :java 动态库
还有好多模块类型,再列举也没啥意义了,当然,我也列举不出了。
2、指定模块名和模块源码位置
比如我现在要编写一个名为 DuoDuo 的 apk,最基本的必须写下面两行,指定模块源码路径和编译后的模块名称,要注意,每项结束后都有 , 。
android_app {
//编译后的模块名称
name: "DuoDuo",
//该模块对应的源码路径,是相对与 bp 文件所在目录的路径
srcs: ["src/**/*.java"],
}
但其实我们编写过程中肯定会用到各种库,不可能这么简单就完事了,下面就拿 anroid 源码举几个例子。
3、实列
3.1 实列 1:基本使用
/packages/apps/Car/Dialer/Android.bp ,先看下该目录下文件结构。
下面解析一下,CarDialerApp 这个 apk 的写法。
44 android_app {
//编译后模块名
45 name: "CarDialerApp",
46 //模块对应的源码路径
47 srcs: ["src/**/*.java"],
48 //资源配置路径,color,layout等
49 resource_dirs: ["res"],
50
//指定 sdk version,与当前系统的保持一致
51 sdk_version: "system_current",
52
//在编译这个模块前,先编译 allowed_privapp_com.android.car.dialer
53 required: ["allowed_privapp_com.android.car.dialer"],
54
//platform 签名
55 certificate: "platform",
56
//应该类似于 LOCAL_OVERRIDES_PACKAGES,也即覆盖掉原生的 Dialer,使其不编译
57 overrides: ["Dialer"],
58
//依赖的库,这里用了变量,稍后讲
59 libs: common_libs,
60
//依赖的静态库,使用了运算符 "+" 和变量,稍后讲
61 static_libs: [
62 "car-dialer-framework-dep",
63 ] + common_static_libs,
64
//声明用到的注解
65 plugins: [
66 "androidx.room_room-compiler-plugin",
67 ],
68
//不太确定,应该是某种优化
69 optimize: {
70 enabled: false,
71 },
72
//特权应用
73 privileged: true,
74
//dex preopt优化选项
75 dex_preopt: {
76 enabled: false,
77 },
84 }
3.2 实例 2:模块引用
/frameworks/base/services/Android.bp 。
使用模块引用语法 “: ” 来引用生成源文件的其他模块的输出,常用的如 genrule 和 filegroup。
模块 1
10 filegroup {
//1、定义 filegroup 模块 services.core-sources-am-wm
11 name: "services.core-sources-am-wm",
12 srcs: [
13 "java/com/android/server/am/**/*.java",
15 ],
16 path: "java",
17 visibility: ["//frameworks/base/services"],
18 }
模块 2
20 filegroup {
21 name: "services.core-sources",
22 srcs: ["java/**/*.java"],
23 exclude_srcs: [
//2、引用在 1 中定义的模块 services.core-sources-am-wm
24 ":services.core-sources-am-wm",
25 ],
26 path: "java",
27 visibility: [
28 "//frameworks/base/services",
30 ],
31 }
模块 3
33 genrule {
//3、定义 genrule 模块 services.core.protologsrc
34 name: "services.core.protologsrc",
35 srcs: [
//4、引用在 1 中定义的模块 services.core-sources-am-wm
37 ":services.core-sources-am-wm",
38 ],
39 tools: ["protologtool"],
40 cmd: "$(location protologtool) transform-protolog-calls " +
47 "$(locations :services.core-sources-am-wm)",
48 out: ["services.core.protolog.srcjar"],
49 }
模块 4
91 java_library_static {
92 name: "services.core.unboosted",
93 defaults: ["platform_service_defaults"],
94 srcs: [
//5、引用在 3 中定义的模块 services.core.protologsrc
97 ":services.core.protologsrc",
114 ],
166 }
上面的代码里总共定义了 4 个模块。 在模块 1, filegroup 中,定义了 services.core-sources; 在模块 2,另一个 filegroup 中,引用了 services.core-sources; 在模块 3,genrule 中,定义了 services.core.protologsrc,同时也引用了 services.core-sources; 在模块 4,java_library_static 中,引用了模块 3 定义的 services.core.protologsrc。
4 变量和运算符
4.1 定义
我直接复制官方的话吧,比我总结的更官方。
变量
变量和属性是强类型,变量根据第一项赋值动态变化,属性由模块类型静态设置。支持的类型为:
- 布尔值(true 或 false)
- 整数 (int)
- 字符串 ("string")
- 字符串列表 (["string1", "string2"])
- 映射 ({key1: "value1", key2: ["value2"]})
映射可以包含任何类型的值,包括嵌套映射。列表和映射可能在最后一个值后面有终止逗号。
运算符 +
概括就是 附加 和 求和 。
可以使用 + 运算符附加字符串、字符串列表和映射。可以使用 + 运算符对整数求和。附加映射会生成两个映射中键的并集,并附加在两个映射中都存在的所有键的值。
4.2 继续看实例 1
我把实例 1 中用到的变量,也取了过来,源码如下。common_libs 和 common_static_libs 显然都是字符串列表,运算符 + 的使用在第 61 行。
20 common_libs = ["android.car-system-stubs"]
22 common_static_libs = [
23 "car-apps-common",
24 "car-arch-common",
25 "car-telephony-common",
26 "car-ui-lib",
27 "car-uxr-client-lib",
28 "guava",
29 "glide-prebuilt",
30 "hilt_android",
31 "libphonenumber",
32 "androidx-constraintlayout_constraintlayout",
33 "androidx-constraintlayout_constraintlayout-solver",
34 "androidx.cardview_cardview",
35 "androidx.legacy_legacy-support-v4",
36 "androidx.lifecycle_lifecycle-extensions",
37 "androidx.preference_preference",
38 "androidx.recyclerview_recyclerview",
39 "androidx.room_room-runtime",
40 "androidx.sqlite_sqlite",
41 "androidx.sqlite_sqlite-framework",
42 ]
44 android_app {
//依赖的库,这里用到了定义的 common_libs
59 libs: common_libs,
60
//依赖的静态库,使用了运算符 "+" 来附加之前定义的 common_static_libs
61 static_libs: [
62 "car-dialer-framework-dep",
63 ] + common_static_libs,
84 }
最后,附上一篇 文章,它作了 android.bp 和 android.mk 中的一些属性的对应关系,有需要可查看。
|