//在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()
}
}

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

最新文章

  1. js立即执行函数
  2. 你知道吗?使用任何HTML5开发工具都可开发iOS、Android原生App
  3. Inline Workers--Web workers without a separate Javascript file
  4. No mapping found for HTTP request with URI [] in DispatcherServlet with name 'appServlet'
  5. LED驅動芯片最大特點
  6. FLEX 图片拷贝
  7. LintCode-不同的子序列
  8. .NET面试题系列[16] - 多线程概念(1)
  9. Java网络连接之HttpURLConnection、HttpsURLConnection
  10. vue-cli3.0怎么修改端口?
  11. 获取spring上下文的bean 工具类
  12. jsp页面的共用
  13. 框架源码系列十一:事务管理(Spring事务管理的特点、事务概念学习、Spring事务使用学习、Spring事务管理API学习、Spring事务源码学习)
  14. 第 7 章 多主机管理 - 046 - 创建 Machine
  15. 第 6 章 存储 - 042 - 用 volume container 共享数据
  16. StringBuilder 详解 (String系列之2)
  17. OpenGL ES 3.0之Shading Language(八)
  18. 【Android开发】Android应用程序目录结构
  19. 通过maven 上传jar 到nexus3,cong nexus3下载jar
  20. cd命令详解

热门文章

  1. rpm -ivh 安装与 rpm -U安装解决问题一例
  2. aop表达式
  3. Intellij 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099,端口被占用
  4. Python正则表达式的re库一些用法(上)
  5. IntelliJ IDEA入门系列
  6. for ,foreach ,map 循环的区别
  7. java往MongDB导入大量数据
  8. 各种sqlite管理工具
  9. mysql命令行下创建数据库,创建表,插入数据,查询数据
  10. Shell bash 数学运算 bc