我正在开发一个Android库,并希望导出一个JAR文件,我可以分发给其他人在他们的应用程序中使用。我不想分发源代码,因为它包含有关发布到我的Web服务器的详细信息。
我尝试使用在bin目录中创建的JAR文件,并将jar文件复制到我的项目并在我的项目中引用它并勾选导出按钮。
当我尝试运行我的项目引用我复制的库时,我的应用程序会引发NoClassDefFoundError
的异常。我做了一些谷歌搜索,我发现的一切都表明你必须提供源代码,让用户导入他们的IDE,然后将该项目引入他们的应用程序,我不想这样做。它必须是可能的,因为其他公司为可以包含的库提供JAR文件。
感谢您的帮助。
答案 0 :(得分:6)
我不想分发源代码,因为它包含有关发布到我的Web服务器的详细信息。
请记住,任何想要的人都可以从JAR中获取数据。
必须有可能,因为其他公司为可以包含的库提供JAR文件。
AFAIK,这个配方仍然有效:
创建一个包含源代码,资源等的Android库项目,并使其正常运行
编译Java源代码(例如,通过Ant)并将其转换为JAR文件
创建原始Android库项目的副本,作为分发Android库项目
将步骤#2中编译好的JAR放入步骤3中的分发库项目的libs/
。
删除分发库项目src/
中的所有内容(但保留现在为空的src/
目录)
分发分发库项目(例如,将其压缩)
这有效地为您提供了Play Services SDK所看到的内容 - 一个没有源代码的库项目,而是libs/
中的JAR,以及资源等。
我将在明天重新开始这个食谱,如果我发现它需要调整当前的工具,我会尽量记住更新这个答案。
新的基于Gradle的构建系统支持用于分发库等的AAR包,尽管我还没有使用它。
<强>更新强>
只要库项目本身不依赖于另一个JAR或库项目,此配方就可以工作。在这些情况下,事情似乎在构建过程中搞砸了 - 一切都可以编译,但依赖项中的类引用无法在运行时解析。
答案 1 :(得分:0)
您是否尝试将jar文件放在libs文件夹中?如果您要为android导出jar库,请确保它没有 / res 文件夹。如你所知,你不能从jar引用你的res文件夹,因此你必须使用库项目来引用你的res文件夹(drawable,xml等等)另一方面你不能让你的代码安全(部分你说关于发布到你的网络服务)通过使用它作为jar,因为它很容易通过逆向工程检索。你最好使用一些编码(比如base64或bouncycastle提供的任何算法)