当前位置: 首页 > news >正文

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'
}

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

相关文章:

  • Java集合源码分析(二)ArrayList
  • 性能测试基础知识
  • [PHP内核探索]PHP中的哈希表
  • 前端学习路线(转自知乎)
  • 【我的《冒号课堂》学习笔记】设计原则(1)间接原则
  • 将字符串中的首字母大写
  • koan重新安装系统
  • mysql JDBC URL格式
  • 李洪强iOS开发之OC[015]#pragma mark的使用
  • QCon旧金山2016大会,议题发布及研讨会一瞥
  • 回到顶部
  • Maven更新子模块的版本号
  • 如何提高网页的加载速度
  • asp.net 如何引用dll
  • java 单例
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • C++11: atomic 头文件
  • css选择器
  • Docker: 容器互访的三种方式
  • mysql常用命令汇总
  • 笨办法学C 练习34:动态数组
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 给github项目添加CI badge
  • 构建二叉树进行数值数组的去重及优化
  • 构建工具 - 收藏集 - 掘金
  • 缓存与缓冲
  • 基于遗传算法的优化问题求解
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 试着探索高并发下的系统架构面貌
  • 小试R空间处理新库sf
  • 学习笔记:对象,原型和继承(1)
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #NOIP 2014# day.1 T2 联合权值
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $.ajax,axios,fetch三种ajax请求的区别
  • (arch)linux 转换文件编码格式
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (笔试题)合法字符串
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (译)计算距离、方位和更多经纬度之间的点
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET中两种OCR方式对比
  • .pop ----remove 删除
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [20171113]修改表结构删除列相关问题4.txt
  • [20190416]完善shared latch测试脚本2.txt