Could not find com.android.support:multidex;java.util.ZipException;UNEXPECTED TOP-LEVEL等异常解决;

ZipException

这个是打包的时候抛出的异常,这个异常也是Multidex 引发的,具体的异常信息在studio的messages面板看到

异常

这个异常具体引起的原因:由于维护的是老项目,开始时项目中引用Multidex是这样的

dependencies {
    compile 'com.android.support:multidex:'
    }

当我的studio从2.2.2升级到2.3.3,这样的引用不起作用了,在messages面板上同样可以看到错误信息
这里写图片描述

说的是我的Multidex引用失败,经过一番折腾,也没能解决,最后我试着把

compile 'com.android.support:multidex:'

这个依赖注释掉,换成了jar包,直接依赖jar包

dependencies {
       compile files('libs/android-support-multidex.jar')
}

有惊喜,真机上居然跑起来了,经测试,功能一切正常,当我以为就这样结束的时候,然后我点build–>build apk ,抛出了ZipException,没办法,解决吧,说的是Multidex重复,那到处找找看看哪里重复,删掉一个不就好了,在我的D:\sdk\extras\android\support\multidex下真的发现了有两个Multidex的jar包,我以为删掉一个就搞定了,然并卵….

  • 解决

    最终还是回到了最原始的状态,删掉项目中libs里面的jar包,依赖系统的Multidex,偶尔我看到在项目中External Libraries中看到如图
    这里写图片描述
    然后我把依赖换成了和External Libraries一样的版本号,两个问题都解决了,虽然就么简单,但碰到了上面两个异常也令人头疼.

dependencies {
    compile 'com.android.support:multidex:1.0.1'

UNEXPECTED TOP-LEVEL EXCEPTION

遇到这个异常,说明项目中的方法已经爆棚了,具体的异常信息
这里写图片描述
在android5.0之前,每一个android应用中只会含有一个dex文件,但是因为Android系统本身的BUG,使得这个dex的方法数量被限制在65535之内,这就是著名的”64K(64*1024)”事件。为了解决这个问题,Google官方推出了这个类似于补丁一样的support-library。接下来我们一起看怎么使用Multidex来解决这个问题

Multidex的使用

    1. 依赖
dependencies {
    compile 'com.android.support:multidex:1.0.1'
  • 2.MultiDex的build.gradle配置
apply plugin: 'com.android.application'

android {
    // productFlavors是为了避免每次运行都把DEX重新加载一遍而设置的两套运行配置
    productFlavors {
        dev {
            minSdkVersion 21
        }
        prod {
            minSdkVersion 14
        }

    defaultConfig {
       ...

        // 设置MultiDex可用
        multiDexEnabled true
    }

       // 保证其他的lib没有被preDex
    dexOptions {
        preDexLibraries = false
    }
}

其实只需简单这样配置即可


    defaultConfig {
       ...

        // 设置MultiDex可用
        multiDexEnabled true
    }
  • 3.Application文件中注入MultiDex
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        // 将MultiDex注入到项目中
        MultiDex.install(this);
    }
}

或者直接使我们的MyApplication继承MultiDexApplication, 其实MultiDexApplication也只是注入了Multidex

public class MultiDexApplication extends Application {
    public MultiDexApplication() {
    }

    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

至此我们的Multidex 配置完成,再也不用担心方法爆棚了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值