Android方法引用超过65535的解决方式

业无高卑志当坚,男儿有求安得闲?这篇文章主要讲述Android方法引用超过65535的解决方式相关的知识,希望能为你提供帮助。

//在app/build.gradleandroid { compileSdkVersion 24 buildToolsVersion "24.0.1"defaultConfig { ... minSdkVersion 14 targetSdkVersion 24 ...// 设置支持multidex multiDexEnabled true } ... }dependencies { compile \'com.android.support:multidex:1.0.1\' }

在application的子类(如果你需要子类的话)
package com.example; import android.app.Application; import android.content.Context; /** * */ public class MyApplication extends Application {@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }

如果你不需要application的子类直接继承multiDexApplication
package com.example; import android.support.multidex.MultiDexApplication; import android.content.Context; /** * Extended MultiDexApplication */ public class MyApplication extends MultiDexApplication {// 不需要重写attachBaseContext()//.......... }

dex是Android的java代码编译的一种文件格式,早期的Android直接在Dalvik虚拟机中加载和执行二进制的dex文件,Android4,4以后添加一种新的应用运行模式叫ART,他会在程序运行前即安装的时候进行一次预编译,将dex文件转换成机器代码存在本地,
【Android方法引用超过65535的解决方式】这种文件格式的缺点就是Android代码的方法数量参照的单一二进制,因为文件格式的很大一部分存储的数字是两个字节的长度,即方法的最大数目是65535,如果一个应用的方法引用超过这个数字编译就会失败;
Google已经提供了一种方式叫Multidex; 它包含编译时和运行时两个部分,从名字上可以看出来,在编译时它会将代码分成两个或更多的dex文件,在运行时,它会告诉类加载器怎样从这些dex文件中找到对应的类文件,但是这种方式也有一定的缺陷,它会增大程序启动的时间并且在老的机器上能造成程序无响应; 应该怎样避免呢?
如果你的方法达到640000或以上,那你就应该设法减少你代码的方法引用或是类库中个的方法引用,怎么做呢如下: 
1,看一下程序的直接和间接的依赖关系:添加一个大型的依赖库比你把相关的代码导入到程序中要更好, 
2,使用ProGuard工具减少你不使用的代码
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile(‘proguard-android.txt\'), \'proguard-rules.pro\' } } }

minifyEnabled true : The getDefaultProguardFile(‘proguard-android.txt\') 默认的规则 The proguard-rules.可以自定义规则

 
Android引入第三方SDK混淆报错shrinkDebugMultiDexComponents的解决方案
 
项目工程中,引用了一个第三方的SDK,它的jar包是已经混淆过的。在IDE下代码编译没问题,但是运行在手机上就报错。
Error:Execution failed for task ‘:app:shrinkDebugMultiDexComponents’. 
java.io.IOException: Can’t read [src\\app\\build\\intermediates\\multi-dex\\debug\\allclasses.jar] (Can’t process class [com/dvrcam/DvrCamSDK/a$d.class] (Unknown verification type [255] in stack map frame))
大致意思是jar包目录com/dvrcam/DvrCamSDK/a/下的内部类d.class混淆失败。
解决方案在工程的根目录下创建一个文件夹proguard,放入proguard.jar文件,下载地址:proguard.jar
Android方法引用超过65535的解决方式

文章图片

在根目录的build.gradle文件中加入 
flatDir { dirs ‘proguard’ }  和  classpath ‘proguard.io:proguard:5.2.1’
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { flatDir { dirs \'proguard\' }//1.依赖库类目录 jcenter() } dependencies { classpath \'com.android.tools.build:gradle:1.2.3\' classpath \'proguard.io:proguard:5.2.1\'//2.依赖的库类 } }allprojects { repositories { jcenter() } }

按照以上步骤操作,就能运行成功!

    推荐阅读