赞
踩
没有繁杂的理论,单纯分享如何为我们的模块写 bp 文件,或者说如何将我们添加的模块加入到 bp 文件中。
这是首先要确定下来的,我们需要把源代码编译成什么类型的?常见的模块类型有:
android_app
:app,就是编写一个 apk
cc_binary
:可执行文件
cc_library_shared
:native 动态库
cc_library_static
:native 静态库
java_library
:java 库
java_library_shared
:java 动态库
还有好多模块类型,再列举也没啥意义了,当然,我也列举不出了。
比如我现在要编写一个名为 DuoDuo 的 apk,最基本的必须写下面两行,指定模块源码路径和编译后的模块名称,要注意,每项结束后都有 ,
。
android_app {
//编译后的模块名称
name: "DuoDuo",
//该模块对应的源码路径,是相对与 bp 文件所在目录的路径
srcs: ["src/**/*.java"],
}
但其实我们编写过程中肯定会用到各种库,不可能这么简单就完事了,下面就拿 anroid 源码举几个例子。
/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 }
/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。
我直接复制官方的话吧,比我总结的更官方。
变量和属性是强类型,变量根据第一项赋值动态变化,属性由模块类型静态设置。支持的类型为:
- 布尔值(true 或 false)
- 整数 (int)
- 字符串 ("string")
- 字符串列表 (["string1", "string2"])
- 映射 ({key1: "value1", key2: ["value2"]})
映射可以包含任何类型的值,包括嵌套映射。列表和映射可能在最后一个值后面有终止逗号。
概括就是 附加
和 求和
。
可以使用 + 运算符附加字符串、字符串列表和映射。可以使用 + 运算符对整数求和。附加映射会生成两个映射中键的并集,并附加在两个映射中都存在的所有键的值。
我把实例 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 中的一些属性的对应关系,有需要可查看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。