我正在开发一个Android项目,在他的构建路径中有一个Android库项目。 这两个项目的libs文件夹和Build Path都有AdWhirl SDK库。
现在,由于将android sdk工具更新到r15,主项目的ant构建在以下异常时失败:
[dx] UNEXPECTED TOP-LEVEL EXCEPTION:
[dx] java.lang.IllegalArgumentException: already added: Lcom/adwhirl/AdWhirlLayout$AdWhirlInterface;
[dx] at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
[dx] at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
[dx] at com.android.dx.command.dexer.Main.processClass(Main.java:486)
[dx] at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455)
[dx] at com.android.dx.command.dexer.Main.access$400(Main.java:67)
[dx] at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
[dx] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
[dx] at com.android.dx.command.dexer.Main.processOne(Main.java:418)
[dx] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329)
[dx] at com.android.dx.command.dexer.Main.run(Main.java:206)
[dx] at com.android.dx.command.dexer.Main.main(Main.java:174)
[dx] at com.android.dx.command.Main.main(Main.java:95)
[dx] 1 error; aborting
现在我尝试从主项目中删除AdWhirl SDK lib并从Library项目中导出它。现在ant构建工作,但是当在任何Android设备上从eclipse启动应用程序时,会抛出一些ClassNotFoundExceptions。
实际上我可以选择在eclipse中使用ant或debug进行构建,但我需要两种变体。
答案 0 :(得分:2)
从我的角度来看,Android Library Project从一开始就没有精心设计,但是,这对于消费者开发者来说不是一个真正的问题,只要它保持这样,并且每个行为都完全相同SDK升级。
但事实并非如此,Android开发团队在最近几次发布期间(可能是从r14开始)开始改进整个事情,并向我们承诺在下一个版本中提供终极解决方案。这使得我们目前在一个极不稳定的阶段不断发展,我不会在我的项目中使用ant,但在每次SDK升级期间使用Maven管理库更改时会遇到类似的问题。看起来Android开发团队甚至难以完全从他们的官方ADT插件管理变更(查看此blog),更不用说像Ant或Maven这样的非官方支持的构建工具。
我已经为你做了一些搜索,在Android JIRA系统中发布了一个与你的情况非常相似的线程,并附带了一些解决方法(ant脚本中的脏修复),请查看comments 16 by chris,看看这是否有助于你。
答案 1 :(得分:1)
尝试将此jar添加到libs目录。
答案 2 :(得分:0)
升级到最新的adk后,我收到一条消息,告诉我运行adb refresh
来重建ant脚本。在最新版本的adk中,构建过程中进行了优化。我假设其中一个优化是构建路径。
[dx] java.lang.IllegalArgumentException: already added: Lcom/adwhirl/AdWhirlLayout$AdWhirlInterface;
意味着AdWhirlLayout$AdWhirlInterface
被添加两次。尝试从其中一个项目中删除AdWhirl SDK。我会尝试从您的Android项目中删除它。
"Android Project" imports "Android Library Project" imports "AdWhirl SDK"
而不是
"Android Project" imports "Adwhirl SDK" imports "Android Library Project" imports "AdWhirl SDK"