Android开发小结:分包及包重复

包重复引用编译失败
签名打包时,一直提示出错:出错如下类似:
> 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'
}
}
}

以上是我个人在android开发中遇到的问题和解决方法,在此记录,希望能帮大家解决相应的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值