2

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

...
LOCAL_MODULE:= com.zzz.ui
include $(BUILD_JAVA_LIBRARY)
...

但这样做的缺点是我不能使用任何资源,并且所有的 ui 自定义和布局安排都必须以编程方式完成。

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

4

3 回答 3

1

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

  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 文件进行任何更改。

于 2019-05-16T08:16:04.427 回答
0

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

虽然这个答案是草率的,但是从这个我能够弄清楚我可以使用以下步骤从我想要的任何模块构建 AAR:

  1. 在您的模块中提供 LOCAL_RESOURCE_DIR 定义;这里的问题是工具链会自动尝试编译/合并其中的所有 xml 文件,因此如果确实在其中找到任何 xml(具有有效的 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

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

笔记:

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

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

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

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

于 2017-07-21T16:06:59.063 回答
0

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

假设您要创建名为xyz.aar的库,其包名为com.xyz.xyz,并且在内部您的库正在使用其他名为aar且包名为com.abc.abc的 aar,则 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 库名称

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

> 制作 xyz 出/target/common/obj/JAVA_LIBRARIES/xyz_intermediates/xyz.aar

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

于 2017-11-17T13:33:43.403 回答