如何为 Android 库项目创建 jar
Posted
技术标签:
【中文标题】如何为 Android 库项目创建 jar【英文标题】:How to create jar for Android Library Project 【发布时间】:2013-06-08 11:12:00 【问题描述】:我必须创建一个库,我将在 jar 文件中导出到客户端。有没有办法创建一个包含资源的 jar?
Google adMob 有这样一个 jar,其中包含 R$layout.class 等资源文件。 This page 描述了一些方法来做到这一点,但我无法准确理解我应该如何使用上述方法将库项目导入应用程序。
【问题讨论】:
【参考方案1】:这是你能得到的最接近的:
第 1 步:创建一个常规的 android 库项目,并让它工作。
第 2 步:将该 Android 库项目复制到另一个目录中。
第 3 步:从原始 Android 库项目中编译的 Java 类创建一个 JAR,并将该 JAR 放入您在第 2 步中创建的副本的libs/
目录中。你应该可以在这个 JAR 上手动运行 ProGuard,虽然我还没有尝试过。
第 4 步:删除复制的库项目的 src/
目录中的所有内容,留下并清空 src/
目录。
第 5 步:压缩或以其他方式分发复制的 Android 库项目。
这将为您提供一个类似于 Play Services 的 Android 库项目,其中资源可用,但源代码不可用。
更新:现在更好的方法是将您的库项目打包为 AAR,这是 Android 从编译代码和所需资源创建可重用工件的本机方式。目前(2014 年 7 月),Gradle for Android、Android Studio 和 android-maven-plugin
可以创建和使用 AAR。
【讨论】:
库项目与标准 Android 应用程序项目的不同之处在于您不能将其直接编译为自己的 .apk 并在 Android 设备上运行。同样,您不能将库项目导出到自包含的 JAR 文件,就像对真正的库所做的那样。相反,您必须通过在依赖应用程序中引用库并构建该应用程序来间接编译库。我猜这个来自 doc 的引用支持你的回答 @CommonsWare 如果 ProGuard 不在 JAR 上运行,您的大纲工作得很好。如果您确实(手动)将 ProGuard 应用于 JAR,那么所有依赖项目都会抱怨所有引用的符号“无法解析”。我刚试过,这就是我收到的。我错过了什么吗? @stumpped:您需要设置 ProGuard 配置文件,以免混淆依赖项目所需的公共内容的名称。 @CommonsWare 引用官方指南:注意:您需要 SDK Tools r14 或更高版本才能使用将每个库项目生成到自己的 JAR 文件中的新库项目功能。 @ 987654321@ 但在同一页面上:您不能将库项目导出到 JAR 文件库不能作为二进制文件(例如 JAR 文件)分发。这将在 SDK 工具的未来版本中添加。【参考方案2】:这行得通!
-
取消选择 IsLibrary 标志,使您的库项目成为普通项目。
将您的项目作为 Android 应用程序执行。 (它不会显示任何错误)
您会在 bin 文件夹中找到一个 .jar 文件以及 .apk。
给你想要使用你的库的 .jar。
告诉他们只需将外部 jar 导入构建路径。
这适用于所有资源。谢谢大家。为你的回应
【讨论】:
执行此操作时,我的 bin/ 目录中没有生成 .jar 文件? 只有在我确实检查了“Is Library”时才会得到 .jar。但是,当我将其添加到我的依赖项目时,资源不起作用。 如果您希望资源正常工作,请检查:***.com/a/17064024/1779907。如果您有一个没有任何资源的库,我在回答中解释的方法有效。如果您也想保护您的资源,请在 java 中对它们进行硬编码(就像我使用 base64 编码将我的图像直接保存在 java 接口中一样),然后您可以使用我的回答中解释的方法(如果您的资源较少,效果会更好) . 查看我的回答 here 以获得更简单的方法 - 顺便说一句,您的回答让我走上了正轨;) 这不适用于资源!那个 jar,里面甚至没有 res 库,你可能忽略了使用该库的项目的属性!。【参考方案3】:按照以下步骤获取库的可分发 jar(已针对没有外部依赖项的库项目进行验证):
-
创建您的库项目。打扫。您将在 bin 文件夹中获得一个 libraryProjectName.jar 文件。 (确保 "is Library" 在库项目中被选中。
将 .jar 文件复制到 目标应用程序的 libs 文件夹中
刷新您的工作区并按
Ctr+Shift+O
(在 Windwows/Linux 上)或 Cmd+Shift+O
(在 Mac 上)以解决添加的库中的任何导入依赖项。
如果遇到任何问题,请发表评论。
【讨论】:
这是迄今为止从库项目创建 JAR 的最简单方法,但是...它不包含res
和 assets
文件夹。我错过了什么吗?
@ripopenid 这些不能在 JAR 中。这就是您需要引用库项目的原因。
@MarcoW., 只有res
是可能的,即使引用也不允许我们使用assets
,请参阅developer.android.com/tools/projects/index.html#LibraryProjects :“应用程序使用的任何资产资源都必须存储在assets/ 应用程序项目本身的目录”。
没错。一个 JAR 为您提供 src
目录。此外,图书馆项目还为您提供res
。更多是不可能的。【参考方案4】:
您不能将资源文件打包到 jar 中。您可以将项目导出为库项目。
您将不引用 android 中资源的实用程序类(即纯 java 类)导出为 jar 文件。
查看下面的链接
http://developer.android.com/tools/projects/index.html
使您的项目成为库项目
右键单击您的项目。转到属性。选择安卓。确保选中 Is Library。
在你的android项目中引用库项目
右键单击您的项目。转到属性。选择安卓。单击添加。浏览和库项目。
引用自文档
库项目与标准 Android 应用程序项目的不同之处在于,您不能将其直接编译为自己的 .apk 并在 Android 设备上运行。同样,您不能将库项目导出到自包含的 JAR 文件,就像对真正的库所做的那样。相反,您必须通过在依赖应用程序中引用库并构建该应用程序来间接编译库。
【讨论】:
库不能作为二进制文件(例如 JAR 文件)分发。这将在 SDK 工具的未来版本中添加。引用developer.android.com/tools/projects/index.html 在新的Gradle build system 中,您将有可能创建一个所谓的 aar 文件(Android 存档),这正是您想要的。它基本上就像一个仅用于库的 APK(包含资源、清单等)。因此,如果您需要适当的支持,请切换到 Gradle。 我没有投反对票(分数不够),但我可以猜到,您没有回答 How 为 Android 库项目创建 jar,而是回答说这是不可能的。所有其他答案实际上都显示了创建此类 jar 的(工作)方式。【参考方案5】:使用 adt 22.2.1 测试
-
创建您的库项目
创建空项目
将库项目添加到您的空项目中
构建项目
在 /gen 文件夹中,您将找到库项目的类,这将包含您的库项目资源。
导出 JAR(仅从 /gen 文件夹中选择此类 ...)
从您的 lib 项目中导出 JAR
将导出的文件重命名为 zip 并合并内容
将最终文件重命名为 JAR 并将其添加到项目中。
【讨论】:
您是否尝试将 Proguard 应用于 JAR?如果是这样,它是如何工作的?有什么困难或并发症吗? 第 6 步将使您的方法成为@CommonsWare 方法的更好的更新替代方案,但如果该库的用户(即应用程序项目)定义了自己的资源,则它实际上不起作用。所以看起来 CommonsWare 的方法仍然是最好的。 这将不包括资源,这通常是 Android 库项目背后的点。【参考方案6】:这是使用 ant 的一种简单方法,可在 Volley 源代码中找到。将以下代码添加到 custom_rules.xml 中,然后使用 ant jar
构建
<?xml version="1.0" encoding="UTF-8"?>
<project name="volley-rules" default="help">
<!-- A rule to generate the JAR for inclusion in an Android
application. Output file will be bin/volley.jar -->
<target name="jar" depends="-compile">
<jar destfile="bin/volley.jar"
basedir="bin/classes" />
</target>
</project>
【讨论】:
不错,使用ant的想法,但是如果将.class一个一个添加到xml中会很困难【参考方案7】:根据最新的 Android Studio v1.2,它就像吃蛋糕一样简单。 已经在this link上用截图回答了完整的解决方案
【讨论】:
【参考方案8】:使用 Eclipse ADT v22.6.2,您可以通过单击 File->Export->Java->Jar File 导出 jar,选择要保存的目录和目标。
【讨论】:
这将不包括资源,这通常是 Android 库项目背后的点。 使用eclipse只创建jar是不完整的,我认为直接在android studio中使用更好。以上是关于如何为 Android 库项目创建 jar的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Xamarin 库项目(iOS 和 Android)运行单元测试?