为了降低工作量以及考虑到产品的可维护性,大部分手机厂商采用了同一套android代码对应多个产品,编译时根据配置参数选择性编译不同模块的代码。
1、 Android.mk时代选择性编译
最初android的编译脚本为 Android.mk,采用了Makefile的语言
为了控制编译,我们可以在不同产品的BoardConfig.mk中定义 MARCO
之后在Android.mk中,根据是否使用MARCO来确定编译选项以及编译代码块
ifeq ($(MARCO),true)
xxxx
endif
2、Android.bp时代选择性编译
随着android逐渐将编译脚本从Android.mk转换成Android.bp,这种方法不再有效,
我们需要采用一种新的方式来选择性编译,此时使用到了go语言。
假如在vendor/privateParser/ 目录下有我们自己的解析器代码,多个版本多个平台均会使用。
在 android 9.0( SDK: 28) 及之后的平台,加载解析器的方式发生了改变,
MediaExtractorFactory会从 手机的 system/lib(64)/extractor/目录下加载.so,
需要将此.so编译到 system/lib/extractors/目录下
之前的平台编译到system/lib/ 目录下
参考google的MPEG4Extractor的代码,需要在 Android.bp中增加如下语句:
relative_install_path: "extractors",
才能保证编译出的.so 位于system/lib(64)/extractor/目录下
由于我们的代码是共线的,需要保证9.0的平台有此编译选项,之前的平台没有此编译选项
由于不能通过android.bp来区分平台,我们需要增加 go 脚本,来保证此编译选项
2.1、增加go脚本
vendor/privateParser/ 目录下增加go脚本 privateparser.go, 如下:
package privateparser
import (
"android/soong/android"
"android/soong/cc"
"fmt"
)
func privateParserDefaults(ctx andro