65k限制

转载 2018年04月16日 21:23:57

在 Android 开发中,有一个之前很少听说,最近偶尔江湖传闻听到过的问题,就是 65k 问题。什么是65k问题呢?其实很简单,就是 Android 有个限制,你的每个 App 中函数最多只能有 65536 个。

这个限制其实是这样的,因为在编译成 Dalvik 字节码,也就是把你的 Class 们生成打包到一个 classes.dex 中去的时候呢,编译器会给你的 App 中所有的函数方法指定一个 ID, 然后每一个 classes.dex 中 ID 的范围是 [0, 0xffff] 。 所以,你懂的,就有了那么一个 65k 的问题。

当然大部分应用程序里路上是不会遇到这个问题的,毕竟 65k 个函数也很多了,但是考虑到现在各种引入 SDK,而且尤其是大公司的程序往往会有很多匪夷所思的功能,最后代码越来越臃肿,指不定哪天就遇到了。不过还好,这个问题也不难解决,G社官方已经给出了解决方案:

multidex support library

简单翻译下,原理就是编译的时候不再是单纯编译到一个 Dex 文件中去,而是切分成多个 Dex 文件。这样每个文件都允许 65536 个函数,肯定是够用了的。下面说下具体的操作。

首先就是导入这个库,这个 Eclipse 和 Android Studio 不太一样,但是具体就不说了,因为太常见了。不过如果用的是新版本的 Android Studio 似乎已经无需导入这个库,貌似 IDE 直接支持了。只需要把配置文件中的 multiDexEnabled 设置成 true 就可以了,大概就是下面这个样子:

android {
   ...
   shitAppConfig {
     ...
     multiDexEnabled true
   }
}

然后就是让你的 Application 类继承自 MultiDexApplication 这个类 ,例如:

public class ShitApplication extends MultiDexApplication {
   ...
}

假如不方便修改继承(比如已经继承了其他的封装了的 Application)那么久稍微复杂一点,重载一下attachBaseContext,代码如下:

@Override
protected void attachBaseContext(Context base) {
   super.attachBaseContext(context);
   Multidex.install(this);
}

还有一种情况就是没有继承过 Application 类怎么办?这种最方便,打开你的 AndroidMainfest 文件,在 application tag 中加入这个:

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

到此,问题算是解决了。但是这并不完美,在 Android 5.0之前,你还需要保证你的 Activity , Service等等基本上 Dalvik需要直接找你的东西都放在第一个 dex 中,否则你的 App 就会挂掉。这部分内容说起来比较复杂,我建议直接去看 Google 官方的说明,Building Apps with Over 65K Methods 。 当然,如果你的程序只支持 Android 5.0 以后的机器,那就不用担心了,因为 ART 会把多个 dex 合并成一个 oat 文件,就不存在找不到的问题了。

当然,真遇到这个问题的时候,还是建议看看架构上面有没有可以改良的地方。实在不行把一个 App 拆两个也行啊,别总想搞个大新闻,你说是吧。

Android应用打破65K方法数限制,让你的应用不再爆棚

随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误: [java] view ...
  • luohai859
  • luohai859
  • 2016-02-26 16:45:30
  • 2035

彻底解决Android 应用方法数不能超过65K的问题

介绍了解决Android APP方法不能超过65k的两中解决方案 插件和分包,并着重介绍了两种分包机制,基于Gradle构建Android项目进行分包和基于Ant构建Android项目进行分包,分包成...
  • yuanzeyao2008
  • yuanzeyao2008
  • 2014-12-08 22:28:53
  • 28791

java文件大小限制及其解决方案

java类文件不允许超过65K,如果遇到类似情况,还有几个方法可以考虑:     1、将JSP里面的代码按逻辑分割写成java类的方法调用。     2、拆分JSP文件。     3、使用替换...
  • armybase11
  • armybase11
  • 2016-03-16 14:17:43
  • 523

Android Studio Multidex 解决方法数超65k限制

前言: 首先说下安卓项目的方法数是不能超过65k限制的,不然编译的时候就会有报错提示,这也是很大一部分使用Eclipse转向Android Studio 的原因之一,很不幸的我也中奖了,因为旧项目的...
  • zouzhigang96
  • zouzhigang96
  • 2016-09-03 23:20:08
  • 951

phpweb限制65k解决方法

  • 2016年07月12日 21:38
  • 17KB
  • 下载

解决Android 应用方法数不能超过65K的问题

Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536 如果你的应用...
  • asd2603934
  • asd2603934
  • 2016-02-16 11:25:26
  • 1165

破解PHPWEB单篇文章超过65K

  • 2013年01月25日 15:28
  • 96B
  • 下载

phpweb超过65k发文章产品限制补丁

  • 2013年09月22日 00:19
  • 7KB
  • 下载

配置android app 方法数超过65k问题

也可以关注我的公众号随着android平台的增长,同样你的应用也在迭代中,当你的app或者你应用的库到达一定的规模时,当我们build的时候很容易达到android的65k限制,早期build时的错误...
  • eandroidhu
  • eandroidhu
  • 2016-05-31 10:53:22
  • 2085

Android Studio解除65K限制

由于google方面的一些原因,当你的工程导入的第三方jar或者library超过它的限制的时候,会编译通不过。那如何解决呢?在此简单整理下。-对build.gradle中加入以下东西:android...
  • u011993368
  • u011993368
  • 2015-08-31 15:59:27
  • 883
收藏助手
不良信息举报
您举报文章:65k限制
举报原因:
原因补充:

(最多只允许输入30个字)