早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp。
Android 7.0引入ninja和kati
Android 8.0使用Android.bp来替换Android.mk,引入Soong
Android 9.0强制使用Android.bp
1.1 模绝枣块
定义一个模块从模块的类型开始,模块有不同的类型,如前面例子中的cc_library_shared,当然类型还有很多种,譬如cc_binary android_app cc_library_static等等。模块包含一些属性格式为“property-name:property-value”,其备梁中name属性必须指定,其属性值必须是并滚拆全局唯一的。
srcs 属性以字符串列表的形式指定用于编译模块的源文件。您可以使用模块引用语法 “:” 来引用生成源文件的其他模块的输出,如 genrule 或 filegroup。
1.2 变量
变量范围限定为声明它们的文件的其余部分,可以使用 “=” 号赋值, 但是不能使用 “:=” 赋值。变量是不可变的,但有一个例外它们可以附上+= 赋值,但仅在变量被引用之前。
1.3 注释
Android.bp使用单行注释//和多行注释/* */两种方式。
1.4类型
具体支持以下几种类型:
1.5 *** 作符
String类型、字符串列表类型和Map类型支持 *** 作符“+”。
1.6 支持模块类型
Android.bp可以支持android_app、cc_binary、cc_binary_host等多种类型,具体定义在Android源码的build/soong/androidmk/cmd/androidmk/android.go
1.7 支持预编译类型
1.8 条件式编译
背景:
不少APP在P上是Android.mk,在10上变成Android.bp,我们在MK的时候需要对其进行转换。
转换方法亏伏:
利用Android自带的工具进行转换
使用自带工具前提:
1.Source full build 过(最好)
2.在out/soong/咐绝host/linux-x86/bin/目录下存在衡空姿androidmk文件。
如果不存在androidmk文件,使用m -j blueprint_tools命令生成
具体转换方法:
1.cd out/soong/host/linux-x86/bin/
2.执行命令:androidmk <android.mk文件>><android.bp文件>
例子:
1.cd out/soong/host/linux-x86/bin/
2.androidmk ./mk2bp/Android.mk >./mk2bp/Android.bp
例子中step2说明:
由于out/soong/host/linux-x86/bin/路径下文件太多,不好识别转换后的文件,所以自己建了个mk2bp文件夹,放要转换的Android.mk。方便查看而已
至于放Android.mk放哪,随便。
如果遇到内容复杂一点的Android.mk,可能工具转换会出错。待进一步研究。
注意 :关于Android.bp的权威解释可以参见 android.bp权威文档
Google官方语法文档 https://android.googlesource.com/platform/build/soong
从前面的列子可以看出定义一个模块从模块的类型开始,模块有不同的类型,如前面例子中的cc_library_shared,当然类型还有很多种,譬如 cc_binary、android_app 、cc_library_static 等等。模块包含一些属性格式为“property-name:property-value”,其中name属性必须指定,其属性值必须是全局唯一的。
其中默认模块可用于在多个模块中重复相同的属性
srcs 属性以字符串列表的形式指定用于编译模块的源文件。您可以使用模块引用语法 “:” 来引用生成弊衫雀源文件的其他模块的输出,如 genrule 或 filegroup。
实例说明:
我们知道Android.mk中可以定义变量,当然作为新编译系统中替代Android.mk的Android.bp也是一定存在,更加何况Android.mk还可以一定条件的转换成Android.bp。
变量范围限定为声明它们的文件的其余部分,可以使用 “=” 号赋值, 但是不能使用 “:=” 赋值。变量是不可变的,但有一个例外它们可以附上+= 赋值,但仅在变量被引用之前。
下面我们看一下正确使用变量的列子:
我们知道Android.mk中可以进行注释,当然Android.bp里面也可以,塌态Android.mk中使用 # 然后添加注释,Android.bp使用单行注释 // 和多行注释 /* */ 两种方式。
具体支持以下几种类型:
String类型、字符串列表类型和Map类型支持 *** 作符 + 。
Android.bp可以支持android_app、cc_binary、cc_binary_host等多种类型,具体定义在Android源码的 build/soong/androidmk/cmd/androidmk/android.go 可以查看,具体如下:
Android.bp可以支持多种预编译类型,具体定义在Android源码的 build/soong/androidmk/cmd/androidmk/android.go 可以查看,如下图所示:
例如: system/core/libusbhost/Android.bp aosp9.0开始
Android.bp是一门实战性的东西,光说不练没有啥用,说再多不如直接开练来得舒服。那就直接开始手撕实例了,租早让我们开战吗!
下面几种库编译类型:
2.1 动态库类型
最终编译为so包
**2.2 java库类型: **
最终编译为jar包
2.3 Andorid应用类型
最终编译为apk包
转自: https://blog.csdn.net/tkwxty/article/details/104395820
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)