为分发创建一个Android Jar库

160

我知道Android库项目,可以创建一个共享源代码项目,根据需要将其拉到Android应用程序中。然而,这需要提供源代码。

我正在寻找一种方式来构建和分发闭源库,以像传统的JAR文件一样在其他Android项目中使用。这将需要使用Android编译器,因此它不是一个普通的Java JAR文件。顺便说一下,我不需要在JAR文件中嵌入资源/布局。

我看过http://andparcel.com/,但感觉它只是一种变通方法,我宁愿使用Google“官方支持”的解决方案。此外,我需要确保构建的JAR与旧/新版Android SDK兼容(即,我需要一种设置目标平台版本等的方式)。

最新的Android工具集是否允许创建/使用JAR二进制文件?您能指出如何进行操作的文档吗?


你有得到你问题的答案吗?我有类似的需求。你是如何创建jar文件的? - Krishnabhadra
要为Android分发一个.jar文件,您不需要Android dx编译器,普通的Java编译器就可以。如果您分发一个jar文件,当应用程序构建时,它会被转换为dx字节码。 - ThomasW
11个回答

49

如果您创建一个没有任何资源的Android库项目,则ADT(首次在r16中注意到)将在“bin”文件夹中创建与该项目同名的.jar文件。


请查看此问题:https://dev59.com/EmnWa4cB1Zd3GeqP4M2y - vnshetty
1
这让我得到了jar文件,但我是否仍然需要分发resources文件夹?尝试将actionbar sherlock打包成jar文件,但我的项目无法编译,因为它们找不到actionbar资源。 - Nathan Schwermann
1
@schwiz 这仅适用于非资源项目(如我在答案中所述)。否则,您需要将其导入为标准的Android库项目。 - Freddroid
1
这还是真的吗?我在/bin文件夹中没有看到myapp.jar。有一个classes.jar,但那不是它,对吧? - garbagecollector
我正在运行最新的ADT,但是我仍然在我的/bin文件夹中得到一个<项目名称>.jar。但是如果您的项目依赖于资源,则不好,并且需要将该项目作为库项目包含(尽管您仍然会得到一个.jar)。 - Freddroid
@DumpHole 我已经得到了bin/myapp.jar和bin/classes.jar。一个是通过ADT IDE获取的,另一个是通过命令行构建工具获取的。它们的大小几乎相同但不完全相同。可能两者都可以?#祈祷 - akauppi

23

Android没有提供特殊类型的Android-JAR。但是你可以在项目中添加build.xml文件,然后使用ant来构建JAR。

我的build.xml看起来像这样:

<project name="MyAndroidLib" default="dist" basedir=".">
  <description>
This is my Android lib
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src" />
  <property name="bin" location="bin" />

  <target name="jar">
    <jar destfile="MyAndroidLib.jar" basedir="bin/classes/">
      <!-- replace 'com' by what ever you are using -->
      <!-- as first part of the package name -->
      <!-- e.g. de, org, ... -->
      <!-- the ** is important to include the directory recursively -->
      <include name="com/**" />
    </jar>
  </target>
</project>

在项目的主文件夹中运行ant jar,以构建JAR文件。


尝试过这个方法后,能够构建一个JAR文件,但是大小很奇怪(只有343字节),与将库导出到JAR时相比。有什么想法是缺少了哪些标志吗? - Shane Oliver
您可以使用存档程序(JAR 是 ZIP)检查 JAR 的内容,查看缺少什么并添加它们。您可以在此处找到更多信息:http://ant.apache.org/manual/Tasks/jar.html - white_gecko
5
使用最新的Android SDK,Java文件被编译到bin/classes目录下,因此<jar destfile="MyAndroidLib.jar" basedir="bin/"> 应改为 <jar destfile="MyAndroidLib.jar" basedir="bin/classes/"> - Theo

17

您可以创建一个“普通”的Java项目,并从那里导入Android.jar。然后,您将可以访问SDK中的每个组件。接下来,您可以将项目导出为jar文件...并从您的Android应用程序中加载它。这种方法非常好,似乎是一种非常简单的方法。


1
在这种情况下,如何声明库的组件,例如服务、活动、广播接收器和意图过滤器。客户端应用程序是否需要在清单中持有所有这些声明? - Ron
@ferostar 我该如何将android.jar导入到Java项目中? - Krishnabhadra
如果库有资源,如何生成R.java并将其添加到JAR中。 - user5395084

15

只需转到您想要制作jar文件的项目属性。点击Android选项卡并勾选“Is Library”复选框。现在,您可以在bin文件夹中看到.jar文件。将其用于您想要使用的地方。


2
如果LibraryProject没有资源,这似乎可以工作。有什么办法可以让它与资源一起工作吗? - Nathan Schwermann
这个答案并不好,如果你的库项目依赖于其他项目。那些引用将不会被捕捉到。 - stevebot

11
在最新版本的Android Studio 1.2中,创建JAR库变得非常简单,只需点一下即可完成。
操作步骤:
1. 转到“文件”->“新建”->“新建模块” enter image description here 2. 在选项列表末尾选择“Java Library” enter image description here 3. 输入JAR库名称和其中类的名称,然后单击“完成”按钮 enter image description here 4. 就这样!
下一步是将您的Jar库添加为应用程序的依赖项。
方法如下:
1. 转到“文件”->“项目结构”->选择“app”->选择“依赖项” 2. 在底部选择“+”->选择“模块依赖项” enter image description here 3. 选择您刚刚创建的Jar库模块 enter image description here enter image description here 4. 选择“确定”,就这样!
...或者您可以仅将以下行添加到App gradle文件中。
dependencies {
      compile fileTree(dir: 'libs', include: ['*.jar']) // Default Gradle Task, should be already present
      compile 'com.android.support:appcompat-v7:21.0.3' // Default Gradle Task, should be already present

      compile project(':nameOfYourJarLibraryModule') // This is your jar library module
 }

尽管JAR支持已经重新引入到Android Studio中,但Google仍在推广Android Archive(AAR)。要了解AAR和JAR之间的区别,请参考此链接


我不明白这是如何创建一个新的jar文件的。看起来你只是在创建一个新的模块,该模块将作为库在你的Android项目中使用。 - Jejefcgb
什么?!你从零开始创建新的jar文件? - Ewoks
@Ewoks:在创建模块之后,您必须将类添加到其中。完成后,将其作为依赖项添加。 - Nishant Srivastava
2
问题是:有一个已经实现的带源代码的库。如何制作它的jar文件,以便在另一个项目中只使用jar文件而不是整个库源代码。或者我错过了什么? - Ewoks
我解释了如何创建一个Java库模块。一旦创建,您可以将所有类文件复制到同一模块中,同步Gradle,然后在您的Java lib模块文件夹/构建/输出文件夹下获得一个jar文件。 - Nishant Srivastava
2
@Nishant。对我有用!谢谢! - ramires.cabral

10

谷歌唯一“官方支持”的解决方案是 Library 项目,这需要分发源代码。您可以按照常规方式创建 JAR 文件,但不能在其中包含或引用资源。

不幸的是,我认为也无法在 Library 项目中包含打包好的 JAR 文件,以此来规避源代码要求。


您可以按照常规方式创建JAR文件,但是无法在其中包含或引用资源。如果我引用了Android类或使用了Android编译器,它似乎在Eclipse中无法正常工作。有什么提示可以帮助我解决这个问题吗? - psychotik
5
我只是在Eclipse中创建了一个普通的Java项目,将android.jar添加到构建路径中,然后选择导出 - Java - Jar文件。 - Jeff Gilfelt
@JeffGilfelt,如果您在示例中包含android-13 sdk目录的android.jar,那么您是否仍然能够在更高的API级别的项目中使用您的jar库? - Fran Marzoa

6
尝试以下方法:这个可以解决问题。
1)通过取消IsLibrary标志,使您的库项目成为普通项目。
2)将您的项目作为Android应用程序执行。(不会显示任何错误)
3)在bin文件夹中与.apk一起找到一个.jar文件。
4)将您的.jar文件给想要使用您的库的人。
5)告诉他们只需将外部jar导入构建路径即可。
这样做对所有资源都有效。祝你好运。

1
我需要更正这篇文章:JAR文件只能包含代码,没有Android资源。如果需要包含或使用任何资源,我们必须保持库项目的开放状态,不能仅仅使用简单的JAR文件。 - cody
@cody:我们如何生成包含资源的jar文件并在另一个项目中使用它? - Mahantesh M Ambi

1
ADT会创建一个bin文件夹,其中包含项目中所有匹配的源文件和目录的类文件。您可以使用jar命令创建一个jar归档文件,其中包含这些类文件和目录以及您的库,但是当然,类文件平台级别只针对当前项目构建的级别,您需要为每个平台级别使用不同的jar文件;然而,这个伟大的事情是R.class文件包含在项目目录树中,因此您可以访问其资源。我不知道这是否是在Android中完成任务的官方方式,但它对我有效。

0
在我们的项目中,我们正在创建一个apk(使用apkbuilder),该apk安装在/system/framework中,并将此apk添加到默认类路径中。为了编译使用jar的应用程序,我们正在创建一个jar文件(使用jar c)。
注意:我们的库中没有任何资源。

0

步骤:

1)打开文件project.properties

2)添加值android.library=true

3)保存文件

4)从Eclipse项目菜单中,选择自动构建,然后选择清理

结果: 全新的jar文件已经创建在bin目录下。


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