在集成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文件。