作者:HW-LXL
Android.bp为安卓新增加的模块编译makefile,由blueprint和soong框架支撑,用来替代gnu make格式的Android.mk。Blueprint主要负责编译逻辑,而Soong主要负责分析编译脚本。
Blueprint和Soong由Go语言书写,可在本地搭建Go语言环境调试。
相同点:
常见的编译类型、关键字,具有一一对应的关系。如果已经熟悉Android.mk,再了解关键字的对应关系,理解Android.bp将比较容易。
差异点:
1.Android.bp内部不支持判断语句。
2.Android.mk中简化了同一模块,支持host、target,动态、静态编译的书写方法。
3.Android.bp所控制的模块的编译逻辑现在不由build/core/中的makefile控制,而由blueprint接管,如果要修改编译逻辑,则需要修改blueprint源码。
收益:
1.保证了Android.bp之间的完全解耦。之前的Android.mk实际上是没有完全解耦的。
2.增强了单模块编译功能。之前的单模块编译(mm)经常失败,而Android.bp的相关编译逻辑是完全闭环和解耦的,可保证用最小代价执行单模块编译。
3.简化了Android.mk。之前Android.mk为GNU make的一部分,经常会插入一些不合解耦规范,无法复用的功能。Android.bp将消除这一现象。
参考资料:
1.谷歌官方readme文件(见附件)。
2.$OUT_DIR/soong/.bootstrap/docs/soong_build.html
3.
4.
拿例子来说明,是最容易被大家接受的,下面以例子作为引导,逐步探讨新编译系统的特性。
reboot这个bin的bp文件在system/core/reboot/Android.bp,其内容为:
特性1:模块编译类型cc_binary放在了最前,并将整个模块的编译参数使用{}括起来了。
cc_binary对应旧版的$(BUILD_EXECUTABLE)
特性2:模块的编译参数的赋值方法支持以下格式:
特性3:编译参数,Android.bp和Android.mk有对应关系:
LOCAL_SRC_FILES对应srcs,LOCAL_SHARED_LIBRARIES对应shared_libs。
LOCAL_MODULE对应name,LOCAL_CFLAGS对应cflag。
对应的Android.mk如下。其它关键字的对应关系请关注本文最后部分的内容。
特性4:注释
注释有两种类型,“//”和“/* .. */”,其使用方法与C语言完全一致
文件位于system/core/libcutils/Android.bp,为了突出重点,这里简化部分内容。
特性5:同名的多种编译类型的模块,现在可以写在同一个模块之内了,而不需要反复写好几个模块的Makefile,如旧版本的Android.mk:
文件位于system/libhidl/transport/base/1.0/Android.bp,该类型的文件可以自动生成,这里的目的为解释一下这类文件的含义。
1.hidl-gen将会解析system/libhidl/transport/base/1.0/IBase.hal,自动生成对应的源文件和头文件。
2.第一个genrule,描述了源文件BaseAll.cpp将会生成到out/soong/.intermediates内的android.hidl.base@1.0_genc++文件夹内。
3.第二个genrule,描述了头文件IBase.h等将会生成到out/soong/.intermediates内的android.hidl.base@1.0_genc++_headers文件夹内
4.第三个cc_library_shared,描述了android.hidl.base@1.0将由以上目录的源文件和头文件生成出来。
其它内容都比较明显,这里不再详述。
还有一些其它内容,比如如何使用androidmk程序,将Android.mk转化为Android.bp,可以参考我之前写的博客:
这里将其中最重要的两个表格列出来,描述了部分关键的Android.bp和Android.mk的关键字的对应关系:





































苏公安网备 32011402010933号