[Android soong构建系统]实例:定制化编译某个模块
背景描述:
假设有一个Android15系统在维护,HAL层为共仓,device有高低配各对应一个分支。那么如何实现共仓HAL根据device仓实现对应的高低配置版本编译打包呢?
这里我们引入一个定制化soong变量用于标识device是高配版本还是低配版本,通过这个soong定制变量HAL层判断按高配版本编译打包还是按低配编译打包,最终实现差异化编译打包。
这里引入的定制化soong变量类似于soong系统默认定义的arch变量。
思路描述:
具体思路如下,
1.Camera HAL Android.bp中自定义一个string类型soong变量,假设变量名为oo_target,取值为:oo_high(高配),oo_low(低配)。
2.Camera HAL Android.bp中自定义一个模块类型,这个自定义模块类型根据自定义oo_target变量取值情况来设置模块的属性,假设这里设置cflags,srcs,shared_libs。
3.device仓打包脚本device.mk中设置这个定义变量oo_target为不同的值,高配产品将oo_target设置为oo_high,低配产品将oo_target设置为oo_low。
4.Camera HAL Android.bp和源码中整合公共部分和差异部分进行编译和打包。
具体实现:
这里基于google参考实现。
1.定义soong变量
//hardware/google/camera/device/EmulatedCamera/hwl/Android.bp
soong_config_string_variable {name: "oo_target",values: ["oo_high", "oo_low"],
}
2.定义自定义模块类型,根据取值设置模块属性
//hardware/google/camera/device/EmulatedCamera/hwl/Android.bp
soong_config_module_type {name: "oocamerahal",module_type: "cc_defaults",config_namespace: "oocamerahal",variables: ["oo_target",],properties: ["srcs","cflags","shared_libs",],
}oocamerahal {name: "camerahwl_nodes",defaults: ["camerahwl_nodes_common"],proprietary: true,soong_config_variables: {oo_target: {oo_high: {srcs: [feature/featureA.cppfeature/featureB.cpp],cflags: ["-DFeatureA","-DFeatureB",],shared_libs: ["libFeatureADep","libFeatureBDep",],},oo_low: {},},}
}
3.设置自定义变量oo_target
//device/xx/oo/device.mk
$(call soong_config_set, oocamerahal, oo_target, oo_high)
4.整合公共部分和差异部分
源码中使用#ifdef FeatureA和FeatureB的定义情况,选择性编译。
Android.bp中通过defaults属性实现对公共部分的"继承",如下:
//hardware/google/camera/device/EmulatedCamera/hwl/Android.bp
cc_defaults {name: "liboocamerahwl_impl_defaults",owner: "oo_oo",proprietary: true,defaults: ["camerahwl_nodes"],srcs: ["CameraProviderHWLImpl.cpp","CameraDeviceInfo.cpp","CameraDeviceHWLImpl.cpp","CameraDeviceSessionHWLImpl.cpp","LogicalRequestState.cpp","RequestProcessor.cpp","RequestState.cpp","TorchState.cpp","GrallocSensorBuffer.cpp",],cflags: ["-Werror","-Wextra","-Wall",],shared_libs: [...],...
}