集成Tinker后的坑 , noclassdeffounderror异常

来源:互联网 发布:手机克隆软件 编辑:程序博客网 时间:2024/05/17 01:39

在集成Tinker时遇到的坑:

 

build.gradle当中为了方便在一般测试时方便给

 apply from: 'tinker.gradle'

这句代码加了判断 , 不走这行代码, Application的改造是按照Tinker集成的, 结果发现在Android5.0以下手机中运行发现在ApplicationLike类当中报noclassdeffounderror异常 .

 

为什么会在5.0以下手机才会报这个错误下面会说.

 

该项目已经方法已经超过65K需要分包, 之前也用了multidex ,所以在我将apk包解压有class.dex以及class2.dex , 第一个是主包 ,利用工具后发现主包中缺少报异常的那个类 .那个类是在第二个包当中 .至此在网上找到了将制定类分到主包当中的方法 .


如果你的主代码的父文件夹叫app

那么你需要在app目录下创建一个maindexlist.txt文件 .

并在app\build\intermediates\multi-dex\debug(如果找不到, 运行一遍就有了)目录下的maindexlist.txt当中全部复制到你自己创建的文件当中. 之后在该文档中按照你cv的格式加入指定类.

并在工程项目的build.gradle文件中加入

android{

...

dexOptions {

        preDexLibraries = false

        javaMaxHeapSize "4g"

             additionalParameters = ['--multi-dex', '--main-dex-list=' + project.rootDir.absolutePath + '/app/maindexlist.txt', '--minimal-main-dex',

                                '--set-max-idx-number=1000']

}

}

 

--multi-dex //方法数越界时则生成多个dex文件

--main-dex-list=project.rootDir.absolutePath + '/app/maindexlist.txt//指定的所有class会打包到主dex

--minimal-main-dex//指定的所有class会打包到主dex

--set-max-idx-number=1000//改变dex方法数上线为1000,超过后进行拆分

最后一个可以去掉.

 

这里只是说明强制将类分到主包当中.

 

我所遇到的问题只需将

 apply from: 'tinker.gradle'

这行加上就行了.

 

至于为什么是Android5.0以下版本才会Crash是因为如下原因:

Multidex支持Android 5.0之前的版本 
    Android5.0版本的平台之前,Android使用的是Dalvik Runtime执行的程序代码。默认情况下,限制应用到一个单一的classes.dex。

Dalvik字节码文件每APK。为了绕过这个限制,你可以使用multidex支持库,成为你的应用程序的主要部分和DEX文件进行管理,获得额外的dex文件,它们包含的代码。

Multidex支持Android 5.0及更高版本 
    Android 5.0和更高的Runtime 如art,本身就支持从应用的APK文件加载多个DEX文件。art支持预编译的应用程序在安装时扫描类(..)。Dex文件编译成一个单一的Android设备上执行.oat文件。

0 0
原创粉丝点击