2017-07-16 237 views
1

我试图通过makefile构建一个Android应用程序(该应用程序在完成时由Android Studio构建)。在Android Makefile项目中包含aar

我遇到了使用的.aar模块的问题。 make完成成功,但.apk大小是可笑的小(500kb而不是80mb)。 .aar在./libs中包含多个.so文件,以及./assets,但两者似乎都未包含在内。

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文件就可以打包,但我甚至dpn't知道这是不是这样做的正确方法:

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的资产没有打包?我如何解决它?

回答

1

在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) 
+0

我尝试使用LOCAL_USE_AAPT2:=真实的,但没有奏效。不记得是什么确切的结果.. – Ysch

+0

@ysch我使用这个解决方案解决了我的问题。我在答案中添加了一个示例,您可以再次尝试,如果您解决了此问题,欢迎分享您的方法。 –