深入浅出Android makefile(4)--LOCAL_STATIC_LIBRARIES

本文详细探讨了Android构建系统中LOCAL_STATIC_LIBRARIES的使用,揭示了它如何帮助链接静态库到Android应用或库项目中。通过实例解析,解释了配置LOCAL_STATIC_LIBRARIES的过程及其在构建过程中的作用,为Android开发者提供了深入的指导。

 

上文我们讲完LOCAL_SRC_FILES,下面我们就一步步来梳理下LOCAL_STATIC_LIBRARIES。

一、 初识LOCAL_STATIC_LIBRARIES
我们首先看看该变量在NDK文档中的定义:
LOCAL_STATIC_LIBRARIES
     应该链接到这个模块的静态库列表(使用 BUILD_STATIC_LIBRARY 生成),这仅仅对共享库模块才有意义。
    The list of static libraries modules (built with BUILD_STATIC_LIBRARY) that should be linked to this module. This only makes sense in shared library modules.
最后一句“这仅仅对共享库模块才有意义”我们先不管,从上述定义中我们知道,LOCAL_STATIC_LIBRARIES肯定是描述了编译当前模块需要的静态库。

在acp模块的编译文件Android.mk中有LOCAL_STATIC_LIBRARIES的定义:LOCAL_STATIC_LIBRARIES := libhost,也就是描述了要编译本模块,必须已经先编译了libhost.a静态库。
但是如果我没有编译出libhost.a静态库,为什么会报*** No rule to make target `out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a', needed by `out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp'.  Stop .这个错误?它又是如何知道,或者说它就是去out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/目录下查找libhost.a呢?

二、 built_static_libraries
我们先从找一下在何处使用到了LOCAL_STATIC_LIBRARIES这个变量入手,通过查找,我们发现build/core/binary.mk文件中定义built_static_libraries变量时使用到LOCAL_STATIC_LIBRARIES。
built_static_libraries的定义如下:
built_static_libraries := \
    $(foreach lib,$(LOCAL_STATIC_LIBRARIES), \
      $(call intermediates-dir-for, \
        STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix)) 
我们猜测,编译系统是通过这个变量将LOCAL_STATIC_LIBRARIES中定义的libhost转换为完整的host静态库的地址,下面看我们猜测的对不对。

built_static_libraries 主要调用了foreach函数,取出LOCAL_STATIC_LIBRARIES列表中的每项,然后执行后面的函数并返回最后的结果:
 $(foreach lib,$(LOCAL_STATIC_LIBRARIES), funcX)
具体执行的函数则是 $(call intermediates-dir-for, STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix)
注意,此处是先执行$(call intermediates-dir-for, STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE)) 函数,然后再添加上/$(lib)$(a_suffix) 后缀

其实 intermediates-dir-for这个函数我们之前已经详细分析过,它就是根据$(1) target class, $(2) target name, $(3) HOST or TARGET以及$(4) COMMON or not这4个参数,返回这个组装的路径,在本例中,返回的是out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates。其中out/*/linux-x86/obj/*/*_intermediates这个是根据初始参数形成的框架,
host部分 ,根据$(LOCAL_IS_HOST_MODULE)来确定,此处为什么是$(LOCAL_IS_HOST_MODULE)返回true,原因还是include $(BUILD_HOST_EXECUTABLE)中明确说明,这个模块编译的是HOST,当然$(LOCAL_IS_HOST_MODULE)为true,需要的静态库肯定也是在out/host目录下面。
STATIC_LIBRARIES部分 ,intermediates-dir-for函数第一个参数应明确指出这是个静态库。
libhost部分 ,在本例中$(LOCAL_STATIC_LIBRARIES)只描述一个静态库LOCAL_STATIC_LIBRARIES := libhost

因此,整个built_static_libraries 变量的通过展开会返回out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a 字符串,即编译本模块时所需要的静态库全路径。
如果使用mmm build/tools/acp/直接编译acp,out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/目录下查找libhost.a文件失败,所以会报如下错误:
*** No rule to make target `out/host/linux-x86/obj/STATIC_LIBRARIES/libhost_intermediates/libhost.a', needed by `out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp'.  Stop.

 

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/src/aidl LOCAL_AIDL_FILES := $(call all-aidl-files-under, $(LOCAL_PATH)/src/aidl) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_PACKAGE_NAME := FactoryMode LOCAL_PRIVATE_PLATFORM_APIS := false LOCAL_PRIVILEGED_MODULE := true LOCAL_CERTIFICATE := platform LOCAL_USE_AAPT2 := true LOCAL_PROGUARD_ENABLED := disabled LOCAL_DEX_PREOPT := false LOCAL_STATIC_ANDROID_LIBRARIES += \ android-support-constraint-layout \ android-support-compat \ android-support-v4 \ android-support-v13 \ android-support-v7-appcompat \ android-support-v7-cardview \ android-support-v7-preference \ android-support-v14-preference \ androidx.recyclerview_recyclerview \ LOCAL_STATIC_JAVA_LIBRARIES += upgradeProxy \ zxing \ someip \ clusterKit \ wayto-annotation \ wayto-base \ mshi \ jwriter \ okio-jvm \ kotlin \ sshd-sftp \ sshd-core \ sshd-common \ slf4j-simple \ slf4j-api \ testsftp-client \ gson-jar \ lifecycle-jar \ LOCAL_JAVA_LIBRARIES += android.car #LOCAL_JNI_SHARED_LIBRARIES := jni include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += upgradeProxy:libs/upgradeProxy.jar \ zxing:libs/zxing.jar \ someip:libs/someip.jar \ clusterKit:libs/ClusterKit-debug.aar \ wayto-annotation:libs/wayto-annotation.jar \ wayto-base:libs/wayto-base-debug.aar \ mshi:libs/moshi-1.15.0.jar \ jwriter:libs/javawriter-2.1.1.jar \ moshi:libs/moshi-1.15.0.jar \ okio-jvm:libs/okio-jvm-2.10.0.jar \ kotlin:libs/kotlin-stdlib-1.9.24.jar \ sshd-sftp:libs/sshd-sftp-2.7.0.jar \ sshd-core:libs/sshd-core-2.7.0.jar \ sshd-common:libs/sshd-common-2.7.0.jar \ slf4j-simple:libs/slf4j-simple-2.0.7.jar \ slf4j-api:libs/slf4j-api-2.0.7.jar \ testsftp-client:libs/jsch-0.1.55.jar \ gson-jar:libs/gson-2.8.9.jar \ lifecycle-jar:libs/lifecycle-common-2.6.1.jar \ include $(BUILD_MULTI_PREBUILT) include $(call all-makefiles-under, $(LOCAL_PATH))
07-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值