[RK3288][Android6.0] 调试笔记 --- 静态库编译覆盖使用方法

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
优先使用前者

你可能感兴趣的:(子类__Android)