遇到问题:

应用在5.0以下的手机下运行闪退,报NoClassDefFoundError错误;

解决方的http://blog.csdn.net/sayid_des/article/details/50462261

http://www.open-open.com/lib/view/open1452264136714.html

MultiDex的产生背景:

当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是

在第一次加载Dex文件的时候执行的。这个过程会生成一个ODEX文件,即Optimised

Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。

但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面。但是这个链表的

长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。尽管在新版

本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容。

为了解决方法数超限的问题,需要将该dex文件拆成两个或多个,为此谷歌官方推出了multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能。

MultiDex的简要原理:

我们以APK中有两个dex文件为例,第二个dex文件为classes2.dex。

兼容包在Applicaion实例化之后,会检查系统版本是否支持 multidex,classes2.dex是否需要安装。

如果需要安装则会从APK中解压出classes2.dex并将其拷贝到应用的沙盒目录下。

通过反射将classes2.dex注入到当前的classloader中。

下面引入一下官方的文档。

https://developer.android.com/tools/building/multidex.html#about

构建超过65K方法的App

随着Android设备的慢慢发展,App的大小会变得越来越大。当我们在开发App的时候由于报的大小和引用库的原因,我们在编译我们项目的时候通常会遇到下面一个错误:

ConversiontoDalvikformat failed:Unabletoexecute dex:methodIDnotin[0,0xffff]:65536

当然,也有一些系统设备会出现以下log信息,不过反馈的是同一个问题:

trouble writing output:Toomany field references:131000;maxis65536.Youmaytryusing--multi-dex option.

这两个错误条件显示一个共同的数字:65536。这个数字,它表示的是你在一个dex包中的函数方法超过了65535个。

如果你已经构建了一个Android App时,并收到了这个错误,那么恭喜你,你有很多代码!

1.在AndroidManifest中

package="......."

android:name="android.support.multidex.MultiDexApplication">

2.build.gradle

dependencies中导 compile'com.android.support:multidex:1.0.1' 包

defaultConfig中加 multiDexEnabledtrue 用于启用MultiDex


3.application中重写attachBaseContext方法:

@Override

protected voidattachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);

}

转载整理

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  6. Android系统源代码目录与系统目录
  7. Manifest merger failed : Attribute application@allowBackup v
  8. Android(安卓)GridView之实现单元格合并,以及第一个item点击无响
  9. Android(安卓)N Setttings 零-壹 读源码------first part

随机推荐

  1. Android(安卓)WebView
  2. android 查看apk中资源文件
  3. android 操作sqlite数据库
  4. iOS and Android(安卓)Programming with
  5. Android虚线View
  6. android RTSP流媒体播放
  7. Android颜色值XML文件
  8. NDK With Android(安卓)Studio
  9. Android获取SDK的版本信息
  10. android 颜色选择器