Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
现象:
电池服务模块healthd定期在kernel中打印log:
healthd: battery l=1 v=0 t=0.0 h=4 st=3 chg= 2017-01-06 21:48:18.379961678 UTC
由于项目用的是其他电池模块,所以想拿掉这条log,在
BatteryMonitor.cpp
bool BatteryMonitor::update(void) {
logthis = !healthd_board_battery_update(&props);
if (logthis) {
//print log
}
}
healthd_board_battery_update()在system/core/healthd/Healthd_board_default.cpp
int healthd_board_battery_update(struct android::BatteryProperties*)
{
//Kris, 170119, Don't print log.
#if 0
return 0;
#else
return 1;
#endif
}
修改之后发现无效,搜索发现对应使用的文件是在device/rockchip/common/health/healthd-rockchip.cpp
因此引出本文想讨论的静态库被覆盖使用的方法。
静态库覆盖过程:
Healthd_board_default.cpp和healthd-rockchip.cpp都被编译到静态库里:
前者Android.mk
include $(CLEAR_VARS)
LOCAL_SRC_FILES := healthd_board_default.cpp
LOCAL_MODULE := libhealthd.default
LOCAL_CFLAGS := -Werror
include $(BUILD_STATIC_LIBRARY)
最终生成libhealthd.default.a
后者Android.mk
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := system/core/healthd
LOCAL_CFLAGS += -DFEATURE_SAVE_CAPACITY
LOCAL_SRC_FILES := \
healthd-rockchip.cpp \
bat_cap.cpp
LOCAL_MODULE := libhealthd.$(TARGET_PRODUCT)
LOCAL_MODULE_TAGS := optional
include $(BUILD_STATIC_LIBRARY)
最终生成libhealthd.rk3288.a
而healthd的规则(system/core/healthd/Android.mk)有这么一句:
LOCAL_HAL_STATIC_LIBRARIES := libhealthd
LOCAL_HAL_STATIC_LIBRARIES定义在build/core/binary.mk
# Add static HAL libraries
ifdef LOCAL_HAL_STATIC_LIBRARIES
$(foreach lib, $(LOCAL_HAL_STATIC_LIBRARIES), \
$(eval b_lib := $(filter $(lib).%,$(BOARD_HAL_STATIC_LIBRARIES)))\
$(if $(b_lib), $(eval my_static_libraries += $(b_lib)),\
$(eval my_static_libraries += $(lib).default)))
b_lib :=
endif
也就是说当静态库名字一样时,先加载(lib).(BOARD_HAL_STATIC_LIBRARIES)的,然后才是$(lib).default的静态库,那么BOARD_HAL_STATIC_LIBRARIES有没有定义呢?
搜索BOARD_HAL_STATIC_LIBRARIES定义是在
./common/BoardConfig.mk:79:BOARD_HAL_STATIC_LIBRARIES ?= libdumpstate.$(TARGET_PRODUCT) libhealthd.$(TARGET_PRODUCT)
其中libhealthd.$(TARGET_PRODUCT)就是前面编译的libhealthd.rk3288.a
因此my_static_libraries的值就是(只关注healthd部分)
my_static_libraries = libhealthd.rk3288.a libhealthd.default.a
优先使用前者