当应用代码和库代码代码超过64K限制时,早期版本的构建系统会出现如下提示:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

最近版本的构建系统会出现如下提示,指出同样的错误:

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

其实都是相同的问题,只是提示方式不一样。

关于64K限制
APK文件包含由DEX文件组成的可执行的字节码文件,包含运行app编译后的代码。DEX文件有一个65535个方法的限制,如果超过这个限制,会在构建的时候报错。这些方法包含Android Framework方法,库方法和你自己写的方法。因为65535=64*1024,所以这个限制又被称为64K限制。

Android5.0之前的版本的多dex支持
在Android5.0之前,使用Dalvik运行时来执行应用代码。默认情况下,在每个APK中,Dalvik限制一个classes.dex 字节码文件。为了突破这个限制,你可以使用multidex support library。
注意:如果你的项目配置多dex的最小SDK版本为20甚至更低,Android Stuido将禁用Instant Run。

Android5.0及以上的版本的多dex支持
Android5.0(API level 21)或更高的版本,使用ART运行时在执行应用代码。原生的支持从APK文件中直接载入多个dex文件。

避免64K限制
下面的方法可以帮助你减少dex方法的限制:
1、 查看你的app的直接的或间接的依赖:
尽量减少不必要的依赖的引用。
2、 通过ProGuard来减少未使用的代码:
通过配置ProGuard来启用ProGuard,确保你在发布版本的时候启用了压缩。

用Gradle来配置你的应用的多dex
在Android SDK Build Toos 21.1或更高的版本中,Android的Gradle插件在你的构建配置中提供了multidex的支持。在尝试配置你的multidex之前,确保你的Android SDK Build Tools和Android Support Repository升级到最新版本。

设置你的开发的app使用multidex,你需要对你的开发项目作出一些改动,遵循如下几步:
1、 更改你的Gradle构建配置来启用multidex。
2、 更改你的manifest来添加MultiDexApplication类。

更改你的build.gradle文件配置来添加支持库并且启用multidex输出,如下:

android {compileSdkVersion 21buildToolsVersion "21.1.0"defaultConfig {...minSdkVersion 14targetSdkVersion 21...// Enabling multidex support.multiDexEnabled true}...
}
dependencies {compile 'com.android.support:multidex:1.0.0'
}
在AndroidManifest.xml中,添加MultiDexApplication类:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.android.multidex.myapplication"><application...android:name="android.support.multidex.MultiDexApplication">...</application>
</manifest>

当你添加如上配置到你的app中,Android 构建工具生成一个主要的dex文件(classes.dex)和支持多个(classes2.dex,classes3.dex)。构建系统将它们打包到一个APK中发布。

多Dex支持库的局限
Multidex支持库有一些你需要了解的局限:
1、 在某种情况下可能会导致ANR问题,如果第二个dex文件过大的话。为了防止这个问题发生,你需要使用ProGuard来进行压缩。
2、 在Android4.0极其早期版本中会遇到一些问题。
3、 应用的multidex配置会需要更大的内存分配,这在Dalvik虚拟机中会导致崩溃。
4、 其他复杂的情形。

优化Multidex开发构建
Multidex配置会显著的增加构建时间,因为构建系统必须来衡量将那些类放到住Dex文件中,那些类放到第二个dex文件中。这就意味着会拖慢开发进程。

为了有效减缓构建multidex输出的时间,你需要使用Android 插件创建两个variantion:
一个开发flavor和一个生产flavor。

如下:

android {productFlavors {// Define separate dev and prod product flavors.dev {// dev utilizes minSDKVersion = 21 to allow the Android gradle plugin// to pre-dex each module and produce an APK that can be tested on// Android Lollipop without time consuming dex merging processes.minSdkVersion 21}prod {// The actual minSdkVersion for the application.minSdkVersion 14}}...buildTypes {release {runProguard trueproguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}}
}
dependencies {compile 'com.android.support:multidex:1.0.0'
}

本文作者:宋志辉
个人微博:点击进入

4.3、Android Studio突破64K方法限制相关推荐

  1. android studio 如何提示方法的用法

    方法/步骤1在 Eclipse中鼠标放上去就可以提示方法的用法,实际上Android Studio也可以设置的.如图 Preferences > Editor >Generan> S ...

  2. android studio安装教程完整,Android Studio 安装配置方法完整教程【小白秒懂】

    1.安装包下载 安装包我们可以在官网下载,但为了让大家更方便,点击链接直接保存就好啦!! 2.Android Studio 安装- 打开安装包,点next - 点next - 这步要注意了,这里填安装 ...

  3. 关闭Android Studio自动折叠方法

    关闭Android Studio自动折叠方法 方法自动折叠是这个样子 取消自动折叠,取消Method bodies的勾选即可

  4. 如何在Android Studio中查看方法信息?

    本文翻译自:How can I view method information in Android Studio? In Eclipse, when you hover your mouse ove ...

  5. android studio 优化提速方法,Android Studio速度慢(如何加速)?

    我最近从Eclipse升级到Android Studio,但我并不喜欢这种体验. 我将它们与具有16GB内存的Windows 7 64位旗舰版和运行NVidia Geforce 780的Intel i ...

  6. android studio怎么设置,android studio快捷键如何设置 android studio快捷键设置方法

    Android studio的快捷键是一个很方便的存在,在编程的时候,我们都更习惯使用键盘,快捷键的操作可以提高编程效率,那么android studio快捷键如何设置呢,下面来看看设置方法. 快捷键 ...

  7. Android Studio模拟器联网方法

    android studio的模拟器的默认不能上网. DNS默认为10.0.2.3,无法上网 解决方法: 1.添加环境变量: 将sdk目录下的platfrom-tools添加到环境变量中,因为需要使用 ...

  8. Android Studio AAR集成方法和使用

    集成方法 1把application注释掉,添加 library如下 //apply plugin: 'com.android.application' apply plugin: 'com.andr ...

  9. Android Studio Gradle优化方法

    第一步:打开AS安装所在的位置,用记事本打开"红色框"选中的文件. 如图: 第二步:打开"studio64.exe.vmoptions"文件后修改里面的值,修改 ...

最新文章

  1. 2022-2028年中国基因工程药物产业市场研究及前瞻分析报告
  2. ZooKeeper和Diamond有什么不同
  3. 2017前端框架何去何从
  4. python程序开发模块化_python-17-Python文件两种用途、模块化程序开发
  5. 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系
  6. gpa-user-guide-for-ubuntu-host
  7. 关于static变量的定义及性质的深层介绍
  8. 前端学习(3262):js高级教程(5)数据变量和内存
  9. android判断是否被点击方法,android 中有没有判断imageview是否以被单击的函数方法?...
  10. MySQL 聚合索引实例_1:mysql 聚合索引
  11. 经济学有必要学python吗_学习经济学用啥软件
  12. 海康威视网络摄像头管理员登录密码重置
  13. 从零开始学习html(十)CSS格式化排版——下
  14. 倾斜摄影技术发展与应用前景
  15. Java实现图片转化为pdf
  16. 时下常用有效的rss源
  17. 函数参数三种传递方式的区别
  18. WPF开发(1)——建立WPF工程
  19. Windows 下TSI721数据采集软件
  20. iPad上支持手柄的游戏推荐 - PUSDN

热门文章

  1. 2022最新可用网页百度分享按钮安装教程【网站添加百度分享按钮代码】
  2. 嵌入式系统概论-考试总结
  3. Tableau 中多张表的联接
  4. 如何添加共享计算机用户,局域网共享,教您局域网共享怎么设置
  5. 计算机指令包括哪2部分,机器指令分为哪几部分
  6. 滞回比较器 万字形状
  7. 5月语言排行榜:R 跌出前二十,Python 紧咬 C++
  8. js入门篇--制作简单闪烁图片
  9. 解决 eclipse 上 Keystore was tampered with, or password was incorrect
  10. 毕设:基于CNN卷积神经网络的猫狗识别、狗品种识别(Tensorflow、Keras、Kaggle竞赛)