android - 在 android Makefile 项目中包含 aar

标签 android makefile

我正在尝试通过 makefile 构建一个 Android 应用程序(该应用程序在由 Android Studio 构建时运行完美)。

我在使用 .aar 模块时遇到问题。 make 成功完成,但 .apk 大小小得离谱(500kb 而不是 80mb)。 .aar 在./libs 和./assets 中有多个.so 文件,但似乎都没有包括在内。

Android.mk:

LOCAL_SHARED_LIBRARIES := libnativelib
LOCAL_STATIC_JAVA_LIBRARIES:= aarmodulename
...
...
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES:=aarmodulename:libs/aarmodulename.aar
include $(BUILD_MULTI_PREBUILT)

我也尝试过强制打包 .so 文件,但我什至不知道这是否是正确的方法:

include $(CLEAR_VARS)
LOCAL_MODULE := libnativelib
LOCAL_SRC_FILES := libs/so/libnativelib.so
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := .so 
LOCAL_MODULE_CLASS := SHARED_LIBRARIES 
include $(BUILD_PREBUILT)

为什么不打包 *.so 文件和 aar 的 Assets ?我该如何解决?

最佳答案

遇到同样的问题,看了AOSP中的static_java_library.mk,基本找到答案了。

要解决此问题,您应该在您的项目 Android.mk 文件中定义 LOCAL_USE_AAPT2 := true

以下是static_java_library.mk中的部分代码:

# Hack to build static Java library with Android resource
# See bug 5714516
all_resources :=
need_compile_res :=
# A static Java library needs to explicily set LOCAL_RESOURCE_DIR.
ifdef LOCAL_RESOURCE_DIR
    need_compile_res := true
    LOCAL_RESOURCE_DIR := $(foreach d,$(LOCAL_RESOURCE_DIR),$(call clean-path,$(d)))
endif
ifdef LOCAL_USE_AAPT2
    ifneq ($(LOCAL_STATIC_ANDROID_LIBRARIES),)
         need_compile_res := true
    endif
endif
ifeq ($(need_compile_res),true)
all_resources := $(strip \
    $(foreach dir, $(LOCAL_RESOURCE_DIR), \
        $(addprefix $(dir)/, \
        $(patsubst res/%,%, \
        $(call find-subdir-assets,$(dir)) \
    ) \
  ) \
))

下面是一个示例:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional

ifeq ($(TARGET_BUILD_APPS),)
    # Use AAPT2 only when TARGET_BUILD_APPS is empty because AAPT2 is not compatible with the current
    # setup of prebuilt support libs used in unbundled builds. b/29836407
    LOCAL_USE_AAPT2 := true
endif

# SRC files
LOCAL_SRC_FILES := \
    $(call all-java-files-under, src)

LOCAL_RESOURCE_DIR := \
    res

# JAR 
LOCAL_STATIC_JAVA_LIBRARIES := \

ifdef LOCAL_USE_AAPT2
    LOCAL_SHARED_ANDROID_LIBRARIES := \
        android-support-annotations \
        android-support-compat \
        android-support-core-ui \
        android-support-v7-appcompat \
        android-support-v7-recyclerview
else
    LOCAL_AAPT_FLAGS := --auto-add-overlay \
        --extra-packages android.support.compat \
        --extra-packages android.support.v7.appcompat \
        --extra-packages android.support.v7.recyclerview

    LOCAL_RESOURCE_DIR += \
        frameworks/support/compat/res \
        frameworks/support/v7/appcompat/res \
        frameworks/support/v7/recyclerview/res

    LOCAL_JAVA_LIBRARIES := \
        android-support-annotations \
        android-support-compat \
        android-support-core-ui \
        android-support-v7-appcompat \
        android-support-v7-recyclerview

    # OR define 
    LOCAL_STATIC_ANDROID_LIBRARIES := \
endif

LOCAL_MANIFEST_FILE := main/AndroidManifest.xml
LOCAL_PACKAGE_NAME := PACKAGE_NAME
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_PROGUARD_FLAG_FILES := proguard.flags

# Comment for now unitl all private API dependencies are removed
# LOCAL_SDK_VERSION := system_current

include $(BUILD_PACKAGE)

关于android - 在 android Makefile 项目中包含 aar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45126551/

相关文章:

Android:在启动时挂载不同的用户数据分区

java - 如何在appium中打开和访问导航侧抽屉?我在appium中使用java语言进行自动化

Android 工具栏标题样式

linux - 从哪里获取 iostream.h

c - 在其 makefile 中引用 C 代码定义的宏

c++ - 为什么 'make'改了一个文件就重新编译了几个文件?

android - 从已弃用的 jcenter 迁移 - Google Places 库的问题

android - main.dart 中的脚手架未编译

c - 在 Xcode 4 中运行外部可执行文件以将其用作调试器

linux - 交叉编译 glibc 导致构建错误