如何使用Android Make在应用程序中包含AAR?

时间:2018-10-09 07:28:08

标签: android makefile android-manifest aar leakcanary

使用Make构建应用程序时,我试图包括一个库(LeakCanary),但是根据我的构建和添加方式,我遇到了两个不同的问题。

这是我用来构建LeakCanary的make文件:

# Build LeakCanary aar
#=========================

include $(CLEAR_VARS)
LOCAL_MODULE := LeakCanary
LOCAL_MODULE_TAGS := optional
LOCAL_MANIFEST_FILE := ./leakcanary/leakcanary-android/src/main/AndroidManifest.xml
LOCAL_SRC_FILES := $(call all-java-files-under, leakcanary/leakcanary-android/src/main/java)
LOCAL_SRC_FILES += $(call all-java-files-under, leakcanary/leakcanary-analyzer/src/main/java)
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/leakcanary/leakcanary-android/src/main/res
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4
LOCAL_JAVACFLAGS := -encoding UTF-8
LOCAL_USE_AAPT2 := true
LOCAL_SDK_VERSION := current
LOCAL_JAR_EXCLUDE_FILES := none
LOCAL_STATIC_JAVA_LIBRARIES += \
    haha \
    leakcanary_watcher \
    trove4j

include $(BUILD_STATIC_JAVA_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := haha
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := leakcanary/libs/haha-2.0.4.jar
LOCAL_UNINSTALLABLE_MODULE := true
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)

LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := leakcanary_watcher
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := leakcanary/libs/leakcanary-watcher-1.6.1.jar
LOCAL_UNINSTALLABLE_MODULE := true
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)

LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := trove4j
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := leakcanary/libs/trove4j-20160824.jar
LOCAL_UNINSTALLABLE_MODULE := true
include $(BUILD_PREBUILT)

include $(CLEAR_VARS)

然后我将库添加到应用中:

LOCAL_STATIC_ANDROID_LIBRARIES += \
    LeakCanary

如果我以这种方式构建它,则应用APK将包含LeakCanary的所有资源,但清单 不合并。 LeakCanary的清单文件声明了一个活动,然后在运行时找不到该活动。

如果我改为这样做:

make LeakCanary /usr/build/out/p/target/common/obj/JAVA_LIBRARIES/LeakCanary_intermediates/javalib.aar

然后将其复制到应用中,并包含以下内容:

LOCAL_STATIC_JAVA_AAR_LIBRARIES += \
    leakcanary

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += \
    leakcanary:libs/leakcanary.aar

清单似乎已合并,但还不包括库资源:

FAILED: /usr/build/out/p/target/product/platform/obj/APPS/app_intermediates/package-res.apk /usr/build/out/p/target/common/obj/APPS/app_intermediates/aapt2.srcjar /usr/build/out/p/target/common/obj/APPS/app_intermediates/extra_packages /usr/build/out/p/target/common/obj/APPS/app_intermediates/src/R.stamp /usr/build/out/p/target/common/obj/APPS/app_intermediates/proguard_options 
/bin/bash /usr/build/out/p/target/product/platform/obj/APPS/app_intermediates/package-res.apk.rsp
warn: ignoring density 'mdpi-v4' for -c option.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:139: error: resource xml/leak_canary_file_paths (aka com.company.app:xml/leak_canary_file_paths) not found.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:144: error: resource mipmap/leak_canary_icon (aka com.company.app:mipmap/leak_canary_icon) not found.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:144: error: resource string/leak_canary_display_activity_label (aka com.company.app:string/leak_canary_display_activity_label) not found.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:144: error: resource style/leak_canary_LeakCanary.Base (aka com.company.app:style/leak_canary_LeakCanary.Base) not found.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:158: error: resource mipmap/leak_canary_icon (aka com.company.app:mipmap/leak_canary_icon) not found.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:158: error: resource string/leak_canary_storage_permission_activity_label (aka com.company.app:string/leak_canary_storage_permission_activity_label) not found.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:158: error: resource mipmap/leak_canary_icon (aka com.company.app:mipmap/leak_canary_icon) not found.
/usr/build/out/p/target/common/obj/APPS/app_intermediates/AndroidManifest.xml:158: error: resource style/leak_canary_Theme.Transparent (aka com.company.app:style/leak_canary_Theme.Transparent) not found.
error: failed processing manifest.

但是,如果我随后包含这样的LeakCanary资源,则该构建有效:

LOCAL_RESOURCE_DIR += \
  $(LOCAL_PATH)/leakcanary/leakcanary-android/src/main/res

我对LOCAL_STATIC_ANDROID_LIBRARIESLOCAL_STATIC_JAVA_AAR_LIBRARIES之间的区别感到迷茫,我应该 在这里使用。

根据我所见,LOCAL_STATIC_JAVA_AAR_LIBRARIES似乎包含并合并清单,但不包含资源,除非使用LOCAL_RESOURCE_DIR指定了它们。另一方面,LOCAL_STATIC_ANDROID_LIBRARIES包含资源而不必指定LOCAL_RESOURCE_DIR,但是它不合并清单。

我正在寻找一种方法来使清单合并和资源包含一起工作,而不必将资源显式添加到LOCAL_RESOURCE_DIR

关于我可以做些什么的任何想法?我也想使LeakCanary也可用于其他应用程序,这就是为什么我试图将其构建为模块。 我要避免的最后一个选择(如我所见)是让所有应用程序构建并在其make文件中包括LeakCanary依赖项。

1 个答案:

答案 0 :(得分:0)

我能够通过构建两个模块LeakCanary和LeakCanary-res来解决这个问题。

LOCAL_MODULE := LeakCanary-res
LOCAL_MODULE_TAGS := optional
LOCAL_MANIFEST_FILE := leakcanary-android/src/main/AndroidManifest.xml
LOCAL_RESOURCE_DIR += $(LOCAL_PATH)/leakcanary-android/src/main/res
LOCAL_USE_AAPT2 := true
LOCAL_SDK_VERSION := current

include $(BUILD_STATIC_JAVA_LIBRARY)

然后像这样包含它们:

LOCAL_STATIC_ANDROID_LIBRARIES += \
    LeakCanary-res

LOCAL_STATIC_JAVA_AAR_LIBRARIES += \
    LeakCanary-prebuilt