4.3、Android Studio突破64K方法限制
当应用代码和库代码代码超过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 21
buildToolsVersion "21.1.0"
defaultConfig {
...
minSdkVersion 14
targetSdkVersion 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 true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
本文作者:宋志辉
个人微博:点击进入
4.3、Android Studio突破64K方法限制的更多相关文章
- 【转】 Android Studio SVN 使用方法
Android Studio SVN 使用方法 如何安装配置SVN 请直接参考<SVN在Android Studio中的配置> http://www.cnblogs.com/songmen ...
- 【转】Android studio 解决64K超出链接数限制问题
http://my.oschina.net/gabriel1215/blog/602608 目录[-] 使用MultiDex支持库 注意事项 结论 如果你是一个android开发者,你至少听说过的Da ...
- Android Studio更新升级方法
自从2013 Google I/O大会之后,笔者就将android ide开发工具从eclipse迁移到Android Studio了,android studio一直在更新完善,为了与时俱进,我们当 ...
- Android studio 加速编译方法
JRebel for Android 是一个Android Studio的插件,可以大大加速Android Studio的编译速度,对于小项目来说或许不明显:但是当项目达到一定的规模时,它对于Andr ...
- Android Studio更新升级方法(转)
自从2013 Google I/O大会之后,笔者就将android ide开发工具从eclipse迁移到Android Studio了,android studio一直在更新完善,为了与时俱进,我们当 ...
- mac os下提高android studio运行速度终极方法
/Users/hangliao/ 删除(.android .gradle)两个文件夹 android studio恢复所有设置到初始化状态,这样会删除已创建的模拟器,所以需从创建一下模拟器 mac ...
- android studio gradle 更新方法。
Android studio更新 第一步:在你所在项目文件夹下:你项目根目录gradlewrapper gradle-wrapper.properties (只要在打开项目的时候选OK,这个文件就 ...
- Android Studio Gradle优化方法
第一步:打开AS安装所在的位置,用记事本打开"红色框"选中的文件. 如图: 第二步:打开"studio64.exe.vmoptions"文件后修改里面的值,修改 ...
- Android studio的调试方法
1. DDMS DDMS 全称 Dalvik Debug Monitor Service, dalvik虚拟机调试监控服务. 可以进行的操作有:为测试设备截屏,查看特定行程中正在运行的线程以及堆信息. ...
随机推荐
- AtCoder Grand Contest 021 D - Reversed LCS
Description Takahashi has decided to give a string to his mother. The value of a string T is the len ...
- Codeforces Round#432 简要题解
来自FallDream的博客,未经允许,请勿转载,谢谢. Div2A 小判断题 Div2B 小判断题,合法的条件是|AB|=|BC|且三点不共线 Div1A 类比二维.三维空间,可以猜测n太大的时候没 ...
- ESLint规范
配置如下:{ // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser":true, " ...
- Python的IO编程
原文传送门:请点击 原文传送门:请点击
- [坑]Spring利用注解@Value获取properties属性为null
今天在项目中想使用@Value来获取Springboot中properties中属性值. 场景:定义了一个工具类,想要获取一些配置参数,使用了@value来获取,但是死活也获取不到. 如何解决:在使用 ...
- 数组的遍历你都会用了,那Promise版本的呢
这里指的遍历方法包括:map.reduce.reduceRight.forEach.filter.some.every因为最近要进行了一些数据汇总,node版本已经是8.11.1了,所以直接写了个as ...
- Go 处理yaml类型的配置文件
先说一下,这里用到了很多关于反射类型的功能,可能刚开始看代码,如果对反射不熟悉的可能会不是非常清晰,但是同时也是为了更好的理解golang中的反射,同时如果后面想在代码中可以直接从我的git地址get ...
- opencv 3.1.0 访问像素值的三种方法(C++)
三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访 ...
- Python中capitalize()与title()的区别
capitalize()与title()都可以实现字符串首字母大写.主要区别在于:capitalize(): 字符串第一个字母大写title(): 字符串内的所有单词的首字母大写 例如: >&g ...
- python学习之路网络编程篇(第二篇)
新课程知识的引入:python作用域 #python中无块级别作用域 if 1 == 1 : name = 'alex' print(name) for i in range(10): name = ...