android.bp 使用

没有繁杂的理论,单纯分享如何为我们的模块写 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 中的一些属性的对应关系,有需要可查看。

猜你喜欢

转载自blog.csdn.net/hejnhong/article/details/126905568