//在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. 小T牛 绿色版 18.08.0100

    百度网盘 链接:https://pan.baidu.com/s/1g2PIMBR8YAdz5skH5ogFhw 密码:3o4k 小T牛 小T牛 绿色版 18.08.0100 意见反馈:qq(邮箱):6 ...

  2. springboot使用fastjson中文乱码解决方法 【转载】

    以前使用fastjson替换jackson时,没有直接在页面打印过json,都是js使用没有出现乱码,偶然 打印出来出现了中文乱码 之前使用的配置方式 @Configuration public cl ...

  3. css常用的属性

    CSS------属性值篇 display: none | block | inline(默认值) | inline-block(css2新增) | inherit none :此元素不会再显示 {注 ...

  4. Git 忽略特定文件或文件夹

    在代码编译过程中,可能会生成一些目标文件或其他我们不希望提交到服务器的文件或文件夹, 但是因为是生成出来的文件/文件夹,在每次使用git status 查看状态的时候git系统总会提示这些 文件或文件 ...

  5. ES6笔记(二)

    一.字符串的扩展1. 用于从码点返回到对应字符. String.fromCodePoint(xx)2. for...of可以遍历字符串3. includes():返回布尔值,表示是否找到了参数字符串. ...

  6. Rhino模型制作——京东狗(练习网格切割)

    我最近做了一个京东狗的模型,我先把渲染好的模型给大家看一下. 别看这个模型很复杂,其实京东狗的模型是网上找的,我只是做了一个上面的洞.不过我告诉大家Rhino的下载地址:http://www.xuex ...

  7. taotao商城遇到的问题

    1,在进行测试的时候,访问:http://localhost:8080/taotao-manager-web/ 可以出现首页 2,做了mybatis逆向工程之后,整合了spring,mybatis,测 ...

  8. 关于Boost在工程下的配置

    http://blog.csdn.net/u012333003/article/details/38078655# 视图->属性页(VS2013在这才能找到相关的属性配置栏)->C/C++ ...

  9. Judy Beta 阶段整体计划

    Judy Beta 总体规划 经过Alpha阶段的人员变动,Judy组成员如下:Manli Shu, Yuechen Wang, Zhiqi Lin, Yu Xing. 前Alpha阶段PM离职. 人 ...

  10. php实现遍历目录

    用递归方法实现目录的遍历: <?php header("Content-type: text/html; charset=utf-8"); date_default_time ...