Android Java-如何防止多个dex定义?

Android Java-如何防止多个dex定义?,java,android,compiler-construction,jar,multiple-definition-error,Java,Android,Compiler Construction,Jar,Multiple Definition Error,基本上,我的产品是一个jar文件,我希望我的客户机将其解压缩并将.class文件打包到他们的jar文件中,然后将他们的jar文件分发给他们的应用程序客户机 因此,应用程序可能最终使用两个包含相同类定义的不同jar文件。因此java编译器(或android上的dex)会抱怨 再举一个例子: client1获取我的jar==>解压缩==>jar1中的package.class文件 client2获取我的jar==>解压缩==>jar2中的package.class文件 应用程序接受jar1和jar2

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

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

再举一个例子:

  • client1获取我的jar==>解压缩==>jar1中的package.class文件
  • client2获取我的jar==>解压缩==>jar2中的package.class文件
  • 应用程序接受jar1和jar2==>问题!类的多个定义

  • 如何防止这种情况发生?

    这里有几种方法:

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

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


    3) 让client1和client2使用proguard重新打包jar中的所有类,然后再分发它们的类。这与proguard刚刚自动完成重写的答案2基本相同。这还有一个额外的好处,那就是让人们更难对他们(和你)的代码进行反向工程。

    如何获得别人的jar?我的意思是jar1是为客户1准备的,jar2是为客户2准备的,我不知道他们的产品是如何组合在一起的。谢谢尼克!很好的建议。我会向我的客户推荐选项1。选项3看起来也很有吸引力,因为它增加了安全性。我将对其进行测试并提供更多反馈。