//在app/build.gradle

android {
compileSdkVersion
buildToolsVersion "24.0.1" defaultConfig {
...
minSdkVersion
targetSdkVersion
... // 设置支持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,如果一个应用的方法引用超过这个数字编译就会失败;

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

在根目录的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()
}
}

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

Android方法引用超过65535的解决方式的更多相关文章

  1. Android加载图片OOM错误解决方式

    前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片. SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一 ...

  2. Android方法引用数超过65535优雅解决

    随着应用不断迭代更新,业务线的扩展,应用越来越大(比如:集成了各种第三方SDK或者公共开源的Library文件.jar文件)这样一来,项目耦合性就很高,重复作用的类就越来越多了,SO:问题就来了.相信 ...

  3. Android工程方法数超过65535的解决办法

    Error:Execution failed for task ':ttt:transformClassesWithDexForDebug'.com.android.build.api.transfo ...

  4. 如何处理 android 方法总数超过 65536 . the number of method references in a .dex file exceed 64k

    一:问题描述:     应用中的Dex 文件方法数超过了最大值65536的上限,简单来说,应用爆棚了. 二.解决方案:      方案1:使用插件化框架  比如: https://github.com ...

  5. Android自己主动化測试解决方式

    如今,已经有大量的Android自己主动化測试架构或工具可供我们使用,当中包含:Activity Instrumentation, MonkeyRunner, Robotium, 以及Robolect ...

  6. Google Android API官网封杀了,没法查android技术资料的3种解决方式

    1.从uhdesk上訪问简化版android api在线文档(反应速度极快) http://www.uhdesk.com/simpleandroidoc/index.html   2.下载chm本地文 ...

  7. SafeNet推出行业首款白盒password软件保护解决方式

    数据保护领域的全球率先企业SafeNet公司日前宣布,推出行业首款採用白盒安全技术的的软件保护方案.SafeNet 圣天诺 软件授权与保护解决方式如今纳入了新的功能,可在"白盒" ...

  8. 解决Android单个dex文件不能超过65535个方法问题

    一.找坑:谷歌规定单个dex文件中的方法不能超过65536的限制 我们编写项目过程中在工程的lib文件夹下引用的第三方插件jar包太多或者项目过大,编译运行时就有可能报出com.android.dex ...

  9. Building Apps with Over 65K Methods(解决APP引用方法总数超过65536)

    本文翻译自http://developer.android.com/intl/zh-cn/tools/building/multidex.html#about.主要介绍当我们Android App中函 ...

随机推荐

  1. decode函数解决oracle报错"除数为0"的问题

    公司的网站在运行的时候突然报错打不开了,打开一看发现报了一个错:ORA-01476:除数为0. 网上一搜发现还是挺多人遇到这个问题的,解决办法就是用decode函数. decode是oracle内置的 ...

  2. SecureCRT常见配置

    不自动断开连接 颜色设置 然后再在/etc/bash.bashrc中加入这句话alias ls='ls --color',其实意思就是以后所有的ls命令,就是ls –color命令

  3. Linux安装mysql5.7

    mysql安装排坑,不同版本可能会使用命令不同,这里需要谨慎查阅. 1. 按照需求在mysql官网下载对应linux版本. 2.创建mysql目录,将下载的安装包安装到目录下mkdir /usr/lo ...

  4. SQL SEVER 开窗函数总结

    作为一名刚刚入门的开发人员,要学的东西很多很多,有些无从下手.秉着“问题是病.技术是药.对症下药”的原则,将工作中遇到的问题所需的技术进行梳理.归纳和总结. 一.什么是开窗函数 首先,什么是开窗函数, ...

  5. postman安装

    安装包下载下来,解压缩到你喜欢的位置. 打开 Chrome 浏览器的「扩展程序」 点击「加载已解压的扩展程序...」按钮,找到你刚刚下载的安装包的位置,点击确定. 你去看看 Windows 的开始菜单 ...

  6. 一位资深Java架构师的晋级心得

    架构师是什么? 是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物.一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清 ...

  7. 洛谷1196【NOI2002】题解

    题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶 ...

  8. Python-接口自动化(四)

    python基础知识(四) (四)处理文件 a.文件的格式主要有txt.html.xml,接下来主要讲的是txt格式的文件处理 对文件进行读写等操作会用到的函数是open(),第一个参数file是指传 ...

  9. C# 应用程序单例(禁止多开) 获取.net版本号 以及 管理员权限

    Mutex不仅提供跨线程的服务,还提供跨进程的服务.当在构造函数中为Mutex指定名称时,则会创建一个命名了的Mutex.其他线程创建Mutex时,如果指定的名称相同,则返回同一个互斥体,不论该线程位 ...

  10. 异常java.lang.NumberFormatException解决

    原因一:超出了int类型的取值范围 项目中要把十六进制字符串转化为十进制, 用到了到了Integer.parseInt(str1.trim(), 16):这个是不是后抛出java.lang.Numbe ...