Android Studio打包时报错,如下
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/crashlytics/android/BuildConfig;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/crashlytics/android/ndk/BuildConfig;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/crashlytics/android/beta/BuildConfig;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/crashlytics/android/answers/BuildConfig;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/crashlytics/android/core/BuildConfig;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lio/fabric/sdk/android/BuildConfig;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lorg/apache/commons/lang/ArrayUtils;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lorg/apache/commons/lang/BitField;","sources":[{}]}
AGPBI: {"kind":"error","text":"Uncaught translation error: java.lang.IllegalArgumentException: already added: Lorg/apache/commons/lang/BooleanUtils;","sources":[{}]}
一般情况下发生already added很容易就能联想到是重复依赖导致的问题,比如上面错误中org/apache/commons/lang的几个错,经过排查时在两个module中引用了一样的jar包导致的,这个很好解决,删一个留一个就好了。
但是前面6个crashlytics相关的错误,经过排查,并没有重复引用,也没有相同的jar包,折腾了好久。
最后发现其实是因为Android Studio在打包的时候,对于依赖的module会打包成aar文件来引用。module打包成aar文件的过程中,会根据module的manifest.xml中的package生成一个BuildConfig.class文件。如果module本身引用的jar包中已经有BuildConfig类并且路径一样的话,两者冲突就会导致如上的报错。
解决方法有两种
1、改manifest.xml中的package,但是不确定会不会引起别的问题。
2、删掉jar包中的BuildConfig。这个不会引起别的问题,不过要注意不要破坏jar包的格式。
命令行删除jar包中文件方法如下:
jar -xvf com-crashlytics-sdk-android_beta-classes //解压jar包
rm -rf com/crashlytics/android/beta/BuildConfig.class //删除BuildConfig
rm -rf com-crashlytics-sdk-android_beta-classes.jar //删除原来的jar包
jar -cvf com-crashlytics-sdk-android_beta-classes.jar ./ //打包新的jar包
完成