包重复引用编译失败
签名打包时,一直提示出错:出错如下类似:
> com.android.build.api.transform.TransformException:java.util.zip.ZipException: duplicate entry: ....
当看到这个时,那是因为出现重复的包名。可能情况是lib引入一个包,自己项目也引入了相同的包。在run的时候AndroidStudio是可以智能剔除,但是在打签名包时,就不能智能剔除了。对此需要开发者自己剔除。通常删除这条包的引用既可以。
但是如果在多个lib里面同时引入了同一个包,如:
compile 'com.google.code.gson:gson:2.8.0'
此时多个lib都需要使用gson,那不能直接删除。需要在自己的项目里面添加剔除gson的语句,如下:
compile(
'cn.bingoogolapple:bga-refreshlayout:1.1.6'
) {
exclude
group
:
'com.google.code.gson'
}
上面是去除一个gosn,那假如去除多个包,则如下:
compile(
'cn.bingoogolapple:bga-refreshlayout:1.1.6'
) {
exclude
group
:
'com.nineoldandroids',group
:
'com.google.code.gson'
}
注:
'com.nineoldandroids'
这个包是属性动画兼容库,很多项目都引用这个。如果出现重复也一样需要移除。此外还有support-v4、support-v7等常见包会出现引入。So当编译时遇到
java.util.zip.ZipException
异常时,多半是重复引用包导致,需要检查自己的引用,移除重复包。
但是本人建议在lib中添加support-v4这类包时,使用如下方法:
provided
'com.android.support:support-v4:23.4.0'
provided表示仅使用,不参与编译,即不会将包编译进aar文件中,那么项目中就不需要移除这个应用包了。
分包
Android手机在安装程序时,会对程序优化安装,从apk包中读取所有的方法。但是方法的数量不能超过65535。这是因为记录方法索引数使用short来储存的,short最大值是65535。具体情况有待研究。但是为解决这类情况,Google提供了multidex分包方案。操作如下:
1.添加 multiDexEnabled true ,位置如下:
buildTypes {
release {
minifyEnabled
false
proguardFiles getDefaultProguardFile(
'proguard-android.txt'
),
'proguard-rules.pro'
multiDexEnabled
true
}
}
2.引入包
compile
'com.android.support:multidex:1.0.0'
此处需要
谨慎
,引入包不能是
compile
'com.google.android:multidex:0.1'
。com.android.support:multidex 中的任何版本都不能使用。使用后在编译时会出现异常,如下:
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: android/support/multidex/BuildConfig.class
异常说此处
BuildConfig
类重复,但是不要尝试移除,直接换包。
3.修改Application,在当中添加如下代码
protected void
attachBaseContext(Context base) {
super
.attachBaseContext(base);
MultiDex.
install
(
this
);
}
或
Application 继承 MultiDexApplication
或
在 AndroidManifest.xml中直接使用,如:
<
application
android
:name=
"android.support.multidex.MultiDexApplication"
..../>
4.添加分包优化,(可选)。在build.gradle中添加如下:
afterEvaluate {
tasks.matching {
it.name.startsWith(
'dex'
)
}.each { dx ->
if
(project.android.defaultConfig.multiDexEnabled) {
if
(dx.additionalParameters ==
null
) {
dx.additionalParameters = []
}
dx.additionalParameters +=
'--minimal-main-dex'
// for test multidex dex , here set max idx 10000, this apk total methods is about 22251.
dx.additionalParameters +=
'--set-max-idx-number=10000'
dx.additionalParameters +=
'--multi-dex'
}
}
}