解决打包出现Duplicate class a.a found in modules

914 阅读1分钟
  1. 解压aar(需要先命令行进入到aar级别文件夹)把a.aar解压到同级目录的名字为b的文件夹下
unzip a.aar -d b

如果没有安装unzip(需要配置环境变量) 去下载

  1. 同上解压classes.jar
unzip classes.jar -d c

classes.jar解压到同级目录的名字为c的文件夹下

  1. 修改相应的包名下面的类(替换或者删除)
  2. 使用命令重新打包成classes.jar
jar cvf classes.jar -C c/ .

c文件夹打包成classes.jar

  1. 替换上次解压arr文件里里的classes.jar 在重新打包成aar
jar cvf new.aar -C b/ .

b文件夹打包成new.aar

第二方案

下载新版本 proguard Releases · Guardsquare/proguard

  1. 解压aar,得到classes.jar
  2. 然后将classes.jar放到bin目录下
  3. 创建 convert.txt,输入如下内容
-injars 'classes.jar'  
-outjars 'classes-out.jar'  

-dontskipnonpubliclibraryclassmembers  
-dontshrink  
-dontoptimize  
-dontusemixedcaseclassnames  
# 在这里指定要转换成的包名(将a.a.a替换成的包名)  
-repackageclasses com.aa  
-dontpreverify  
-dontnote  
-dontwarn  
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod  

# 需要注意观察原始 jar 包中哪些是没有混淆的,需要保留  
-keep class com.** {*;}  
# 因为我们的目的只是替换外层包名,类内部的一些东西都不用管  
-keepclassmembers class ** {*;}  
  1. 执行sh

    ./proguard.sh @convert.txt  
    

window使用(proguard.bat @convert.txt)

  1. classes-out.jar替换aar解压后的classes.jar

  2. 使用jar cvf 重新打包aar

    jar cvf output.aar -C aar_unzip/ .