Я пытаюсь включить библиотеку ( LeakCanary ) при создании приложения с помощью Make, но я сталкиваюсь с несколькими различными проблемами в зависимости от того, как я собираю и включаю ее.
Вот файл make, который я использую для сборки LeakCanary:
# 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_LIBRARIES
и LOCAL_STATIC_JAVA_AAR_LIBRARIES
и которую я должен использовать здесь.
Исходя из того, что я видел, кажется, что LOCAL_STATIC_JAVA_AAR_LIBRARIES
включает и объединяет манифесты, но не включает ресурсы, если они не указаны с LOCAL_RESOURCE_DIR
.С другой стороны, LOCAL_STATIC_ANDROID_LIBRARIES
включает ресурсы без указания LOCAL_RESOURCE_DIR
, но не объединяет манифесты.
Я ищу какой-нибудь способ заставить слияние манифеста и ресурса включить в работу, без необходимости явно добавлять ресурсы к LOCAL_RESOURCE_DIR
.
Любые идеи о том, что я могусделать, чтобы эта работа?Я хотел бы сделать LeakCanary доступным и для других приложений, поэтому я пытаюсь создать его как модуль.Мой последний вариант (на мой взгляд), которого я пытаюсь избежать, - позволить всем приложениям собираться и включать зависимости LeakCanary в свои файлы make.