如何在AOSP中使用android.mk引入.aar文件

4
我需要在AOSP构建树中使用android.mk来构建一个应用程序。 我有一个自定义的.aar库,它位于以下文件夹中:apps/libs/mylib.aar。
请问如何将aar包含到Android AOSP构建中呢? 我已经尝试了这里描述的方法:Stackoverflow链接,用于带有.aar库的AOSP构建 Android.mk看起来像这样:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS  := optional
LOCAL_PACKAGE_NAME := sample
LOCAL_CERTIFICATE  := platform

# SRC files
#=====================================================================
LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/aidl
LOCAL_SRC_FILES := $(call all-java-files-under, src) \
                   $(call all-Iaidl-files-under, aidl)

# RES files
#=====================================================================
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_RESOURCE_DIR +=prebuilts/sdk/current/extras/constraint-layout/res
LOCAL_RESOURCE_DIR +=frameworks/support/v7/appcompat/res
LOCAL_RESOURCE_DIR +=frameworks/support/design/res
LOCAL_RESOURCE_DIR +=frameworks/support-v4/res

LOCAL_MANIFEST_FILE :=AndroidManifest.xml
LOCAL_USE_AAPT2 := true
LOCAL_PROGUARD_ENABLED := disabled

# static .aar files
#=====================================================================
LOCAL_STATIC_JAVA_AAR_LIBRARIES:= mylib.aar

#Adding aapt packages
#=====================================================================
LOCAL_AAPT_FLAGS := --auto-add-overlay

LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat 
LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.recyclerview
LOCAL_AAPT_FLAGS += --extra-packages android.support.annotations
LOCAL_AAPT_FLAGS += --extra-packages android.support.v4
LOCAL_AAPT_FLAGS += --extra-packages android.support.design
LOCAL_AAPT_FLAGS += --extra-packages com.sample.mylib

#Include Static libraries
#=====================================================================
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-appcompat
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-recyclerview
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v7-gridlayout
LOCAL_STATIC_JAVA_LIBRARIES += android-support-annotations
LOCAL_STATIC_JAVA_LIBRARIES += android-support-design
LOCAL_STATIC_JAVA_LIBRARIES += gson
LOCAL_STATIC_JAVA_LIBRARIES += zxing
LOCAL_STATIC_JAVA_LIBRARIES += picasso

#Set out path
#=====================================================================
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_APPS)

#For build the application package
#=====================================================================
include $(BUILD_PACKAGE)

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := mylib:libs/mylib.aar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += gson:libs/gson-2.8.1.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += zxing:libs/core-3.3.3.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += picasso:libs/picasso.jar

include $(BUILD_MULTI_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))

我查看了不同的方法来构建相同的内容。


你使用的是哪个Android版本?因为我记得我曾经遇到过同样的问题,而我的版本中还没有引入“LOCAL_STATIC_JAVA_AAR_LIBRARIES”。 - IIIIIIIIIIIIIIIIIIIIII
我正在使用Android SDK 26。 - Midhun PM
请问您能否提供您所遇到的构建错误? - IIIIIIIIIIIIIIIIIIIIII
你确定路径 mylib.aar 是正确的吗?你的描述似乎有些不同。 - IIIIIIIIIIIIIIIIIIIIII
@MidhunPM,你解决了吗?我也遇到了同样的问题。 - D.J
@MidhunPM。你能解决这个问题吗?我也遇到了同样的问题。如果我在 packages/app/<app_dir> 中执行 mm 命令,.AAR 将会被构建,但是当我在根目录下执行 make 命令时,只有 apk 文件生成,而没有库文件位于 out/target/product/<device>/obj/JAVA_LIBRARIES/ 文件夹下。 - Abhishek Dwarakanath
1个回答

5
我知道我来晚了,但仍然值得分享这个信息。在某些时候,AAPT2的LOCAL_STATIC_JAVA_AAR_LIBRARIES支持已经损坏。因此,即使您按上述方式添加库,来自aar的资源也不会被链接。
来自AOSP git历史记录: 2014年10月30日,添加对预构建AAR的支持。 Aars被解压到out/.../intermediates*目录中,并链接到aosp模块。

2015年12月5日支持使用AAPT2进行构建 如您在core/android_manifest.mk:26中所见,不再需要链接未打包的aars,因为AAPT2支持直接链接到数组中。

但不幸的是它们没有被正确添加为--extra-packages

该错误已在android-p-preview-5中修复。

如果您仍在为Android 8或8.1开发,请手动添加这些更改或在您的树中挑选它们。对我来说完美地工作了。
更新2018-11-28:
确切的步骤来修复Android 8.1及更早版本:
1)从aosp中挑选修复 Dec 5, 2015 Support to build with AAPT2 2)在build/core/prebuilt_internal.mk:593中添加参数--auto-add-overlay
$(my_res_package): PRIVATE_AAPT_FLAGS := --static-lib --no-static-lib-packages --auto-add-overlay

3) 由于RenderScript是在较晚时候重构的,因此您必须明确定义aar模块:

include $(CLEAR_VARS)
LOCAL_MODULE := my-library-module
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := my-library-module.aar
# Provide resources directory in order to compile them, enable AAPT2 for this module
LOCAL_RESOURCE_DIR := $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE),,COMMON)/aar/res)
LOCAL_USE_AAPT2 := true
# if LOCAL_RENDERSCRIPT_TARGET_API >= 21, resources won't get compiled. Shouldn't affect anything else
LOCAL_RENDERSCRIPT_TARGET_API := 20
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
LOCAL_BUILT_MODULE_STEM := javalib.jar
LOCAL_UNINSTALLABLE_MODULE := true
include $(BUILD_PREBUILT)

免责声明:这是一个比较hacky的解决方法,适用于我个人。由于时间紧迫和支持旧客户端版本的紧急需求,可能会忽略一些使用情况。


你链接的12月5日提交需要授权才能查看。 - Matt
已修复。不便之处请谅解。 - Amaksoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接