IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android.bp 使用 -> 正文阅读

[移动开发]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 中的一些属性的对应关系,有需要可查看。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:40:22  更:2022-09-21 00:41:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:20:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码