如何从Android.mk创建AAR存档文件

时间:2017-02-06 14:27:30

标签: android android-source android-library ndk-build android.mk

我正在尝试构建一个自定义Android系统,为此我想使用一个单独的库来包含一些自定义视图。为此,我使用

创建了一个Java库
...
LOCAL_MODULE:= com.zzz.ui
include $(BUILD_JAVA_LIBRARY)
...

但缺点是我无法使用任何资源,所有ui自定义和布局安排都必须以编程方式完成。

现在我想更改它并创建一个Android库,生成一个* .aar,我可以在其中添加资源并直接从布局文件和一些drawable扩展视图。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

经过我的调查,我发现了这样的事情。 http://thread.gmane.org/gmane.comp.handhelds.android.building/1020

虽然这个答案很糟糕,但是从这一点开始,我能够发现我可以使用以下步骤从字面上构建任何模块的AAR:

  1. 在您的模块中提供LOCAL_RESOURCE_DIR定义;问题在这里 是工具链自动尝试编译/合并所有 其中的xml文件,如果它确实找到任何xmls(有效 它会引发一个错误,即android res文件夹结构和命名。至 解决方法,你可以放在给定的res文件夹中 'values'文件夹然后在其中放入一个非空的dummy.xml,用于 示例

    <?xml version="1.0" encoding="utf-8"?> <resources> <integer name="dummy">09</integer> </resources>

    (至少有一个有效的资源名称定义是必不可少的)

  2. 为模块/项目提供AndroidManifest.xml。一个空的 清单会做什么

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" package="com.android.car.vehiclenetwork" > </manifest>

  3. 更改Android.mk,使其包含静态Java库 目标makefile并指向资源目录

    LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res include $(BUILD_STATIC_JAVA_LIBRARY)

  4. 现在执行构建。对于那个稍微不同的方法是 需要比使用mmm(必须在最高级别启动) AOSP源代码树):

    make out/target/common/obj/JAVA_LIBRARIES/<module-name>_intermediates/javalib.aar

  5. 然后将在out/target/common/obj/JAVA_LIBRARIES/<module-name>_intermediates/javalib.aar生成aar。

    注意:

    1. 创建aar需要javac而不是jack。因此,这也将在out / target / common / obj / JAVA_LIBRARIES / _intermediates / aar中生成classes.jar(因为它是前M工具链),其中包含适合在外部项目编译外部使用的javac编译类。

    2. 您可以修改工具链文件@ build / core / static_java_library.mk - 在行前加上$(警告$(built_aar))

      built_aar := $(intermediates.COMMON)/javalib.aar

      当调用AOSP代码树的topdir makefile时,这将显示适合构建自己的所有模块。

答案 1 :(得分:0)

要从AOSP构建系统构建.aar,您需要为库创建make文件,

假设您要创建名为 xyz.aar 的lib,其包名称为 com.xyz.xyz ,并且您的lib内部使用其他名为 abc的aar .aar 包名为 com.abc.abc ,然后make文件可能如下所示: -

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

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := xyz

LOCAL_STATIC_JAVA_LIBRARIES :=android-common \
    android-support-v4 \
    android-support-design \
    android-support-v7-appcompat \
    android-support-design-res \
    android-support-v7-cardview

LOCAL_STATIC_JAVA_AAR_LIBRARIES:= abc

LOCAL_SRC_FILES := $(call all-java-files-under, java)

res_dirs := res \

LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs)) \
    prebuilts/sdk/current/support/v7/cardview/res \
    prebuilts/sdk/current/support/v7/appcompat/res \
    prebuilts/sdk/current/support/design/res \

LOCAL_AAPT_FLAGS := \
    --auto-add-overlay \
    --extra-packages android.support.v7.cardview \
    --extra-packages android.support.v7.appcompat \
    --extra-packages android.support.design \
    --extra-packages com.abc.abc


LOCAL_JACK_ENABLED := disabled 
LOCAL_PROGUARD_ENABLED := disabled 

include $(BUILD_STATIC_JAVA_LIBRARY)

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := all_static_libs

include $(BUILD_MULTI_PREBUILT)

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

在上面的make文件中,而不是使用 include $(BUILD_STATIC_AAR_LIBRARY)使用 include $(BUILD_STATIC_JAVA_LIBRARY)并在变量LOCAL_MODULE中设置aar lib名称

要编译make文件,请使用以下命令

&GT; make xyz out / target / common / obj / JAVA_LIBRARIES / xyz_intermediates / xyz.aar

您的xyz.aar将位于out / target / common / obj / JAVA_LIBRARIES / xyz_intermediates / xyz.aar

答案 2 :(得分:0)

结果非常简单。 只需运行以下命令:

  1. 首先构建JAR make out/target/common/obj/JAVA_LIBRARIES/YourLibName_intermediates/javalib.jar 此命令将生成classes.jar,classes-full-debug.jar和其他构建AAR软件包所需的文件。
  2. 然后进行AAR make out/target/common/obj/JAVA_LIBRARIES/YourLibName_intermediates/javalib.aar

注意:

  1. 如果有任何有关丢失的“ R.txt”文件的消息,只需从“ out / target / common / obj / JAVA_LIBRARIES / YourLibName_intermediates /”的src目录中复制它即可。

  2. 您无需在Android.mk文件中进行任何更改。