在 APK 中包含具有相同包名和名称的类
Posted
技术标签:
【中文标题】在 APK 中包含具有相同包名和名称的类【英文标题】:Including classes with the same package name and name in an APK 【发布时间】:2014-08-25 04:42:42 【问题描述】:在为 android 构建 APK 时,如果您尝试两次添加相同的库并出现如下错误,则 DX 工具会失败:
意外的***异常:java.lang.IllegalArgumentException: 已添加:Lcom/google/ads/AdRequest$Gender; 在 com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:122) 在 com.android.dx.dex.file.DexFile.add(DexFile.java:161) 在 com.android.dx.command.dexer.Main.processClass(Main.java:685) 在 com.android.dx.command.dexer.Main.processFileBytes(Main.java:634) 在 com.android.dx.command.dexer.Main.access$600(Main.java:78) 在 com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572) 在 com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284) 在 com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166) 在 com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:229) 在 com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:158) 在 com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144) 在 com.android.dx.command.dexer.Main.processOne(Main.java:596) 在 com.android.dx.command.dexer.Main.processAllFiles(Main.java:498) 在 com.android.dx.command.dexer.Main.runMonoDex(Main.java:264) 在 com.android.dx.command.dexer.Main.run(Main.java:230) 在 com.android.dx.command.dexer.Main.main(Main.java:199) 在 com.android.dx.command.Main.main(Main.java:103) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:483) 在 SDKMain.main(SDKMain.java:129) 1 错误;中止
如果我有 2 个不同的库(jar),其中包含具有相同包名和名称的类,该怎么办?
如何将这些添加到我的 APK 中?有没有办法做到这一点?
【问题讨论】:
【参考方案1】:首先请注意,即使两个jar不在同一个项目中,也可能会弹出“已添加”的错误。例如:将您的项目链接到包含具有相同类的 jar 的库项目。
其次:如果您确实有两个具有相同类文件的 jar,则构建系统将简单地使用它看到的第一个。因此,如果您知道您希望运行时使用其中的哪一个,那么解决方案很简单:只需将其放在类路径的前面即可。或者从视觉上讲 - 把它放在更高的位置 订单和出口列表:
第三:如果实在没有办法,可以随时打开一个jar文件(比如使用WinRAR),删除其中的一些类文件。
【讨论】:
这与我的问题有什么关系?我想创建一个包含我的代码 + 2 个外部库的 APK。每个库都有一个以相同名称(和包)定义的类。在 DX 期间,这将失败(出现我发布的错误)。如何克服这一点?以上是关于在 APK 中包含具有相同包名和名称的类的主要内容,如果未能解决你的问题,请参考以下文章