【问题标题】:Android Java - How to prevent multiple dex definitions?Android Java - 如何防止多个 dex 定义?
【发布时间】:2014-08-15 03:54:14
【问题描述】:

基本上,我的产品是一个 jar 文件,我希望我的客户将其解压并将 .class 文件打包到他们的 jar 文件中,然后将他们的 jar 文件分发给他们的应用程序客户端。

因此,一个应用程序最终可能会使用两个包含相同类定义的不同 jar 文件。因此java编译器(或android上的dex)会报错。

为了说明更多:

  1. client1 获取我的 jar ==> 解压缩 ==> 将 .class 文件打包到 jar1 中
  2. client2 获取我的 jar ==> 解压缩 ==> 将 .class 文件打包到 jar2 中
  3. 应用程序占用 jar1 和 jar2 ==> 问题!类的多个定义。

如何防止这种情况发生?

【问题讨论】:

  • 如何拿到别人的罐子?我的意思是 jar1 用于 client1 而 jar2 用于 client2 ,我看不出他们的产品是如何组合在一起的。

标签: java android compiler-construction jar multiple-definition-error


【解决方案1】:

这里有几种方法:

1) 不要这样做!通常依赖项不会以这种方式重新打包。相反,client1 会将您的 jar(带有版本号)和您的 jar 交付给他们的客户。客户端 2 也一样。现在,如果 client3 正在使用 client1 和 client2,他可以查看他们期望的软件版本是否匹配。如果没有,他们就有麻烦了。

2) 为每个客户端重新打包 jar 文件中的类。那就是当您将 jar 给 client1 时,将所有类放在 com.my.package.client1 中,然后再将其提供给它们,并在访问您的 jar 时让它们从该包中工作。这意味着使用 client1 和 client2 的 client3 可能存在重复代码,但您的软件的多个版本可以共存。

3) 让 client1 和 client2 在分发之前使用 proguard 重新打包 jar 中的所有类。这与答案 2 基本相同,只是由 proguard 自动进行重写。这还有一个额外的好处,就是让人们更难对他们(和你的)代码进行逆向工程。

【讨论】:

  • 谢谢尼克!很好的建议。我会向我的客户推荐 option1。 Option3 似乎也很有吸引力,因为它增加了安全性。我会对其进行测试并提供更多反馈。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2010-10-14
  • 1970-01-01
相关资源
最近更新 更多