从我的理解,apklib
包含代码+资源共享Maven
.
aar
文件分发Gradle
.
在aar
从apklib在一个主要方式不同:类被编译并包含在AAR的根classes.jar.而apklib
不能包含已编译的类文件或jar.
1有人可以解释apklib
vs aar
文件之间的主要区别吗?
2可以Maven
用aar
吗?可以Gradle
用apklib
?
3哪种格式"更好"?
android apklib android-maven-plugin android-gradle-plugin aar
我已经下载了第三方Android库项目,该项目不包含java类文件,而是包含文件夹下的jar文件libs/
:
libs/
- CustomService.jar
res/
-…
pom.xml
Run Code Online (Sandbox Code Playgroud)
这个库项目可以构建为apklib存档.我构建了它并且我已将此存档安装到我的本地maven存储库中.
然后在我自己的Android项目中,我添加了这个apklib项目的依赖项:
<dependency>
<groupId>com.custom.service</groupId>
<artifactId>custom-service</artifactId>
<type>apklib</type>
<version>1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在我的Java代码中,我使用了CustomService.jar中的类,但是当我maven构建我的项目时,我经常遇到以下错误:
[ERROR] package com.custom.service.user does not exist
[ERROR] location: class com.my.app.MyClass
[ERROR] /Users/Johon/MyApp/src/main/java/com/my/app/MyClass.java:[34,17] cannot find symbol
[ERROR] symbol: variable UserService
Run Code Online (Sandbox Code Playgroud)
上面的错误抱怨它无法UserService
从库apklib存档中找到该类.然后,我通过命令检查了库jar文件的内容:
jar tf CustomService.jar
我看到该类位于库项目的CustomService.jar中
com/custom/service/user/UserService.class
Run Code Online (Sandbox Code Playgroud)
这个类在jar中,为什么我得到错误然后????
我正在关注这个问题,但它并没有完全回答我的问题.
apk的apklib的真正优势是什么?
可能答案:
但我也可以轻松地将资源放到jar文件中
但如果我打开apklib
我没有看到dex
或其他与android有关的东西.更多我看到里面的简单来源.
那么以apklib
格式保存/分发库的真正目的是什么?
我发现了这个错误并且没有找到错误消息的命中,所以我想我会分享我想出的解决方案来解决其他任何面临重复工作问题的人.
在编写用于(大型)应用程序的新Android库(apklib)时,当我将新项目添加为依赖项时,我在dexing期间收到以下错误:
写输出有问题:字段引用太多:70185; max是65536.
您可以尝试使用--multi-dex选项.
按包引用:
<...包含字段数的包的长列表...>
它失败的特定构建步骤是:
java -jar $ANDROID_SDK/build-tools/19.0.3/lib/dx.jar --dex \
--output=$PROJECT_HOME/target/classes.dex \
<... long list of apklib and jar dependencies elided ...>
Run Code Online (Sandbox Code Playgroud)
使用--multi-dex
错误消息的建议可能是一个解决方案,但我不是应用程序项目的所有者,它已经有一个大型复杂的构建过程,我会毫不犹豫地改变.
我可以使用没有字段的无操作测试库项目重现此问题,但在错误输出中它被列为具有6000+字段.在错误输出中列出的包中,有少数具有类似的6k +字段计数,但绝大多数具有更合理的<1k字段计数.
这个问题类似于Facebook着名的"太多方法"问题.FB解决方案看起来很疯狂,我发现的唯一其他解决方案(例如,这个Android错误票,或者这个,这个SO答案,这个其他SO答案)都涉及更改主应用程序的代码,这远远超出了我想做的事.
还有其他解决方案吗?