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

来源:互联网 发布:淘宝卖家改价 编辑:程序博客网 时间:2024/06/08 19:05

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.cppLOCAL_MODULE := libhealthd.defaultLOCAL_CFLAGS := -Werrorinclude $(BUILD_STATIC_LIBRARY)

最终生成libhealthd.default.a

  • 后者Android.mk
include $(CLEAR_VARS)LOCAL_C_INCLUDES := system/core/healthdLOCAL_CFLAGS += -DFEATURE_SAVE_CAPACITYLOCAL_SRC_FILES := \    healthd-rockchip.cpp \    bat_cap.cppLOCAL_MODULE := libhealthd.$(TARGET_PRODUCT)LOCAL_MODULE_TAGS := optionalinclude $(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 librariesifdef 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
优先使用前者

阅读全文
0 0