我正在尝试构建一个自定义Android系统,为此我想使用一个单独的库来包含一些自定义视图。为此,我使用
创建了一个Java库...
LOCAL_MODULE:= com.zzz.ui
include $(BUILD_JAVA_LIBRARY)
...
但缺点是我无法使用任何资源,所有ui自定义和布局安排都必须以编程方式完成。
现在我想更改它并创建一个Android库,生成一个* .aar,我可以在其中添加资源并直接从布局文件和一些drawable扩展视图。我怎样才能做到这一点?
答案 0 :(得分:0)
经过我的调查,我发现了这样的事情。 http://thread.gmane.org/gmane.comp.handhelds.android.building/1020
虽然这个答案很糟糕,但是从这一点开始,我能够发现我可以使用以下步骤从字面上构建任何模块的AAR:
在您的模块中提供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>
(至少有一个有效的资源名称定义是必不可少的)
为模块/项目提供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>
更改Android.mk,使其包含静态Java库 目标makefile并指向资源目录
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res include
$(BUILD_STATIC_JAVA_LIBRARY)
现在执行构建。对于那个稍微不同的方法是 需要比使用mmm(必须在最高级别启动) AOSP源代码树):
make out/target/common/obj/JAVA_LIBRARIES/<module-name>_intermediates/javalib.aar
然后将在out/target/common/obj/JAVA_LIBRARIES/<module-name>_intermediates/javalib.aar
生成aar。
注意:
创建aar需要javac而不是jack。因此,这也将在out / target / common / obj / JAVA_LIBRARIES / _intermediates / aar中生成classes.jar(因为它是前M工具链),其中包含适合在外部项目编译外部使用的javac编译类。
您可以修改工具链文件@ 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)
结果非常简单。 只需运行以下命令:
make out/target/common/obj/JAVA_LIBRARIES/YourLibName_intermediates/javalib.jar
此命令将生成classes.jar,classes-full-debug.jar和其他构建AAR软件包所需的文件。make out/target/common/obj/JAVA_LIBRARIES/YourLibName_intermediates/javalib.aar
注意:
如果有任何有关丢失的“ R.txt”文件的消息,只需从“ out / target / common / obj / JAVA_LIBRARIES / YourLibName_intermediates /”的src目录中复制它即可。
您无需在Android.mk文件中进行任何更改。