阅读:9701回复:2
Android.bp文件说明论坛排版和内容受限,可以下载帖子尾部的pdf文档,内容更加完善 可以关注我的CSDN博客: 一、 Android.bp文件是什么? Android.bp文件首先是Android系统的一种编译配置文件,是用来代替原来的Android.mk文件的。在Android7.0以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。在Android7.0开始,Google引入了ninja和kati来编译,为啥引入ninja?因为随着Android越来越庞大,module越来越多,编译时间也越来越久,而使用ninja在编译的并发处理上较make有很大的提升。Ninja的配置文件就是Android.bp,Android系统使用Blueprint和Soong工具来解析Android.bp转换生成ninja文件。为了兼容老的mk配置文件,Android当初也开发了Kati 工具来转换mk文件生成ninja,目前Android Q里边,还是支持Android.mk方式的。相信在将来的版本中,会彻底让mk文件废弃,同时Kati也就淘汰了,只保留bp配置方式,所以我们要提前学习bp。Blueprint和Soong工具的源码在Android/build/目录下,我们可以通过查阅相关代码来学习! 图片:fUFNnm_看图王.jpg 二、 Android.bp文件配置规则 【模块和属性】 Android.bp描述的编译对象都是以模块为组织单位的,定义一个模块从模块的类型开始,模块有不同的类型,模块包含一些属性,下面举一个例子来具体说明: cc_binary { 上面例子中的cc_binary就是模块类型,表示该模块目标为二进制可执行文件。如果要编译一个APP,那么就使用android_app模块,要编译一个动态库,那么就使用cc_library_shared.soong工具支持的模块类型在android/build/soong/androidmk/cmd/androidmk/android.go中可以查到,有以下: 图片:111.png ●模块类型后面用大括号“{}”将模块的所有属性包裹起来。 ●每个属性的名字和值用中间用冒号连接起来,属性值要用双引号””包裹起来(如果属性值是变量,变量不需要加双引号):name: ”avbctl”表示模块name属性的值为avbctl,就是类比Android.mk中的LOCAL_MODULE := avbctl。模块的name属性是必须的,内容必须是独一无二的。如果属性被定义为数组,需要用中括号“[]”将数组的各元素包裹起来,每个元素中间用逗号“,”连接,一般常用的属性有name,srcs,cflags, cppflags, shared_libs,static_libs。 ●查看全部支持的模块和各个模块支持的属性定义,请查看这个网址:https://ci.android.com/builds/submitted/6504066/linux/latest/view/soong_build.html。 ●cc_defaults模块比较特殊,它表示该模块的属性可以被其他模块重复引用,类似于我们的头文件被其他cpp文件引用,举例: cc_defaults { ●属性可以使用列表数组的形式,也可以使用unix通配符,例如:”*.java” ●每一条完整的属性定义语句加上逗号“,”表示结束 ●每一个完整的模块结束加上逗号“,”表示结束 ●注释包括单行注释//和多行注释/**/ ●最重要的一点:bp中依赖的目标,例如动态库静态库目标,如果库是源代码的形式存在的,那么库的编译脚本必须也是通过bp文件编译才能被找到,否则用mk文件编译库,bp会提示找不到依赖的库目标。 更多的说明可以在android/build/soong/README.md文件中查找。如果找不到想要的,可以在官网找:https://ci.android.com/builds/submitted/6504066/linux/latest/view/soong_build.html 【变量】 变量可以直接定义,使用“=”号赋值,例如: avbctl_srcs = [“tools/avbctl/avbctl.cc”], 【条件编译】 例如我们的mk文件中包括条件判断: LOCAL_PATH := $(call my-dir) 我们先分析下上面两个条件的意思,如果变量ENABLE_USER2ENG的值为true,那么追加这两个编译参数,否则不追加。第二个条件是说如果存在paxdroid/external/libethtool这个目录,那么就添加libethtool这个动态库,否则不添加。 要转换为bp写法,就需要我们通过go语言写一个新文件,新建一个自定义类型的模块,来判断这些条件,比如我的修改是在system/core/fs_mgr/Android.bp,那么要在添加 system/core/fs_mgr/fs_mgr.go, //这是申明当前的包名,就是你在哪个文件夹下,就写啥package fs_mgr//导入android的soong工具目录 go脚本写完了,相应的再Android.bp文件引用,如下: // 这些个必须添加,编译刚刚写的那个go脚本需要的一些依赖 【操作符】 String类型、字符串列表类型和Map类型支持操作符“+”,例如: binder_src_files = ["lib/libsystool_client/binder.c"], 三、 Androidmk自动转换工具 另外对于现成的Android.mk文件,也可以尝试使用androidmk工具自动将mk文件转换成bp文件,进入android/out/soong/host/linux-x86/bin/androidmk目录下,输入命令: androidmk Android.mk > Android.bp即可将当前目录下的Android.mk文件自动转换成Android.bp(部分复杂的mk文件可能会提示错误,需要手动书写)。 自己动手再写一个 编译一个可执行文件,目录结构如下: .├── Android.bp├── testbin.go└── test.c bootstrap_go_package { name:"soong-testbin", pkgPath:"android/soong/testbin", deps:[ "blueprint", "soong", "soong-android", "soong-cc", "soong-genrule", ], srcs: [ "testbin.go", ], pluginFor: ["soong_build"],}testbin_condition{ name:"testbin_defaults",}cc_binary{ name: "testbin", defaults: [ "testbin_defaults", ], srcs:[ "test.c", ],} testbin.go文件内容: package testbin import ( "android/soong/android" "android/soong/cc" "fmt") func init(){ fmt.Println("init start test") android.RegisterModuleType("testbin_condition",testbinDefaultFactory)} func testbinDefaultFactory()(android.Module){ module := cc.DefaultsFactory() android.AddLoadHook(module,testbinDefault) return module} func testbinDefault(ctx android.LoadHookContext){ type props struct { Proprietary *bool } p := &props{} var proprietary bool proprietary = getProprietary(ctx) p.Proprietary = &proprietary ctx.AppendProperties(p)} func getProprietary(ctx android.LoadHookContext)(bool){ if(ctx.AConfig().Getenv("BUILD_VENDOR") == "yes"){ fmt.Println("BUILD_VENDOR============= yes") return true }else{ fmt.Println("BUILD_VENDOR============= no") return false }}上面代码的功能是根据编译的环境变量【BUILD_VENDOR】的值,确定testbin二进制目标编译生成的位置在system/bin还是在vendor/bin目录下。以上例程需要注意的两点是: 1、 proprietary这个属性定义的时候本来是小写的,但是在go语言中,首字母大写意味着可以被别的文件引用。所以红色部分,不管啥属性本来定义的名称是什么,都应该大写字母开头。 2、 通常情况下我们的属性是字符串数组类型[]string,如果碰到了是bool型的属性来根据条件编写的话,应该定义为指针【*bool】切记!!! |
|
|
沙发#
发布于:2020-04-29 19:48
不错不错 可以可以 666
|
|
|
板凳#
发布于:2020-04-29 19:53
|
|
|