1K 等于 1024,65536 刚好是 64K,为了便于称呼和使用,就将这个限制规则统称为 64K 方法数的引用限制。...为了解决 64K 方法数限制的问题,我们可以在项目中使用 multidex 配置,当项目中的方法数(包括:Android framework,library 和我们自己写的代码)超过 64K 时,编译系统会自动编译出多个...DEX字节码文件,这也是以前为什么安卓手机用户总是诟病Android系统比iOS系统运行卡顿的原因),限制每个APK文件只能包含一个 DEX 文件(即 classes.dex)。...但Instant Run仅仅作用于debug版本,我们依然需要给release版本配置multidex来避开64K方法数的限制。...strings 数量限制与 method 数量限制非常相似,但是如果项目方法数超过 64K, 我们还是需要使用 multidex 来解决,注意区分。
这错误的意思是说,你的应用中的Dex文件方法数超过了最大值 65536的上限值,简单来说, 超过了应用内的方法数限制, 在Android系统中,一个App的所有代码都在一个Dex文件里面。...Dex是一个类似Jar的存储了多有Java编译字节码的归档文件。...当Android系统启动一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。...这个过程会生成一个ODEX文件,即Optimised Dex。执行ODex的效率会比直接执行Dex文件的效率要高很多。...尽管在新版本的Android系统中,DexOpt修复了这个问题,但是我们仍然需要对低版本的Android系统做兼容 这种问题官方也关注到了,为了解决这一问题,提出了通过multidex包进行多dex编译的方法
虽然Google解决了应用总方法数限制的问题,但并不意味着开发者可以任意扩大项目规模。...Multidex仍有一些限制: DEX文件安装到设备的过程非常复杂,如果第二个DEX文件太大,可能导致应用无响应。此时应该使用ProGuard减小DEX文件的大小。...同样因为Dalvik linearAlloc的限制,如果请求大量内存可能导致崩溃。Dalvik linearAlloc是一个固定大小的缓冲区。...Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或16MB。当方法数量过多导致超出缓冲区大小时,会造成dexopt崩溃。...通常开发者自己的代码很难达到这样的方法数量限制,但随着第三方类库的加入,方法数就会迅速膨胀。因此选择合适的类库对Android开发者来说尤为重要。
,比如66345等,从这个提示看,和Dex方法超过64K的限制一样,应该是同一个问题。...不过App已经解决了这个64K方法的问题,怎么还会提示呢。 从提上看,是一个non-jumbo,让我想到了Dex的jumbo模式,这是一个用来配置制定该Dex是不是一个巨大的Dex的。...那么以前为什么不会出现这个问题呢,我们从git提交的历史来看,发现昨天的需求新增了一个第三方包,导致该模块的方法变多,超过了限制,所以今天就有了这个错误的提示。。 既然知道了原因,那么就很好解决了。...使用Gradle构建的,在模块的build.gradle里配置: android { dexOptions { jumboMode true } } 如果是使用Eclipse+Ant...关于超过64K方法分Dex的解决办法可以参考官方的Configure Apps with Over 64K Methods这篇文章。
当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt。DexOpt的执行过程是在第一次加载Dex文件的时候执行的。...使用Multidex突破64K方法数限制原理解析 简单地来说,MultiDex 做的事情就是: 解压得到 dex 并进行 dexOpt ; 把主dex文件除外的 dex 文件都追加到 PathClassLoader...尽管 Android 4.0(API 级别 14)提高了分配限制,但在 Android 5.0(API 级别 21)之前的 Android 版本上,应用仍有可能遭遇这一限制。...Reference 配置方法数超过 64K 的应用 类加载机制系列3——MultiDex原理解析 Android使用Multidex突破64K方法数限制原理解析 其实你不知道MultiDex到底有多坑...Android Dex分包最全总结:含Facebook解决方案
本文目标 通过Dalvik 可执行文件分包的应用配置来越过65536限制,俗称65k Android 64k引用限制原因 Android 应用 (APK) 文件包含 Dalvik Executable...由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”,但是现在大多数的时候,我们都称之为Android 65k问题。...由于 Instant Run 仅适用于调试版本的应用,我们仍需配置发布构建进行 Dalvik 可执行文件分包,以规避 64K 限制。...规避 64K 限制前提 在将应用配置为支持使用 64K 或更多方法引用之前,我们应该采取措施减少应用代码调用的引用总数,包括由应用代码或包含的库定义的方法。...尽管 Android 4.0(API 级别 14)提高了分配限制,但在 Android 5.0(API 级别 21)之前的 Android 版本上,应用仍有可能遭遇这一限制。
超过最大方法数限制的问题,是由于Dex文件格式限制,一个Dex文件中method个数采用使用原生类型short来索引文件中的方法,4个字节共计最多表达65536个method,field/class的个数也均有此限制...生成Dex文件的过程,是将工程所需全部class文件合并且压缩到一个Dex文件期间,也就是Android打包的Dex过程中, 单个Dex文件可被引用的方法总数(自己开发的代码以及所引用的Android框架...、类库的代码)被限制为65536; 但是这种小问题怎么能难倒程序猿哥哥呢,相信大家或多或少都听说过Multidex:Google官方对64K方法数问题的一种补救措施,通俗的讲就是:既然你的代码这么多,...这是由于dexopt的LinearAlloc限制引起的,在Android版本不同分别经历了4M/5M/8M/16M限制,4.2.x系统上可能都已到16M, 在Gingerbread或者以下系统LinearAllocHdr...dexopt使用LinearAlloc来存储应用的方法信息。Android 2.2和2.3的缓冲区只有5MB,Android 4.x提高到了8MB或16MB。
对于Android大型程序来说,64k方法数与线性内存的限制都是必须要考虑的问题。...事实上,解决64K方法限制的唯一方法是拆分多dex,不同方案的差异在于需指定哪些类必须在主dex,这与我们期待的效果以及加载方式相关。...解决安装过程线性内存的方法是限制主dex的linearalloc大小,这里经验值为3355444(2.2以上,如何计算?)。对于运行过程的线性内存限制可参考Facebook。...以线性内存3355444(限制5m,给系统预留部分)、方法数64K为限制,即当满足任意一个条件时,将拆分dex。...这是因为一来觉得以Android的推广速度,5.0用户增长应该是遥遥无期的,二来加载Dex的代码,传进去的是zip,在加载前我们需要验证MD5,确保所加载的Dex没有被篡改(Android官方没有验证,
的 classLoader 在加载 APK 的时候限制了class.dex 包含的 Java 方法数,其总数不能超过65535(64K,不要再说成 65K 了,1K = 2^10 = 1024 , 64...参考资料:Configure Apps with Over 64K Methods 可能遇到的问题 NoClassDefFoundError Android SDK Build Tools 21.1...或者更高版本中的 Gradle Android 插件有对 multidex 的支持。...这个插件使用 Proguard 来分析你的项目并在 [buildDir]/intermediates/multi-dex/[buildType]/maindexlist.txt 文件中生成一个 app...参考资料和推荐阅读: Android Multidex 遇到的问题 (推荐此文) Android的multidex带来的性能问题-减慢app启动速度 ClassNotFoundException 总结
,提示“File is loaded in the wrong encoding: 'UTF-8'” 解决办法:打开Windows的记事本,把该文件另存为UTF8编码的格式。...编译jni代码的mk文件,如果文件格式是“UTF带BOM”,就无法正常编译jni代码。 解决办法:使用UEStudio等文本编辑软件,把文件另存为“UTF无BOM”的格式。...关于重复引用jar包或依赖库的问题 如果发现打包时报错“com.android.dex.DexException: Multiple dex files define Landroid/support...2、关于方法数超出64K上限的问题 如果发现打包时报错“Error:The number of method references in a .dex file cannot exceed 64K.”...因此必须拆分打包生成的dex文件,把一个文件拆为两个甚至更多,以规避65536个数的限制,主要步骤如下: a.
目前将项目中的leancloud的即时通讯改为环信的即时通讯。当引入easeui的时候 出现方法数超过上限的问题。 搜索一下问题,解决方法很简单。 ...一、解决方法数超过64k的问题 问题描述: Error:The number of method references in a .dex file cannot exceed 64K..... > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException...最终解决办法 app目录下的build.gradle文件的android{} 中添加 dexOptions { incremental true javaMaxHeapSize..."4g" } 另外一个提高编译速度的方法: 在app目录下的build.gradle文件的android{}中添加 tasks.whenTaskAdded { task ->
0xffff]: 65536 超过最大方法数限制的问题,是由于DEX文件格式限制,一个DEX文件中method个数采用使用原生类型short来索引文件中的方法,也就是2个字节共计最多表达65536个method...Google官方:配置方法数超过 64K 的应用 Android 5.0 之前版本的 Dalvik 可执行文件分包支持 Android 5.0(API 级别 21)之前的平台版本使用 Dalvik 运行时来执行应用代码...默认情况下,Dalvik 限制应用的每个 APK 只能使用单个 classes.dex 字节码文件。...要想绕过这一限制,您可以使用multidex,然后管理对其他 DEX 文件及其所包含代码的访问。...,在运行时可能导致程序的崩溃,这个主要是因为Dalvik linearAlloc 的一个限制,这个限制在 Android 4.0 (API level 14)已经增加了, 应用也有可能在低于 Android
去年发布的 Android P上引入了针对非公开API的限制,对开发者来说,这绝对是有史以来最重大的变化之一。...去年我给出了一种绕过Android P对非SDK接口限制的简单方法,经验证,这办法在 Android Q 的 Beta 版上依然能正常使用。...而且据我所知,有若干用户量不少的 APP 在线上使用了我提供的 FreeReflection 库,想来应该也是没有问题的吧。 不过今天,我打算给出另外一种绕过限制的办法。...上次分析系统是如何施加这个限制 的时候,我们提到了几种方式,最终给出了一种修改 runtime flag 的办法;其中我们提到,系统有一个 fn_caller_is_trusted 条件:如果调用者是系统类...我们知道,对APP来说,所谓的系统类就是被 BootstrapClassLoader 加载的类,这个 ClassLoader 并非普通的 DexClassLoader,因此我们无法通过插入 dex path
本文是对 Analyze Your Build with APK Analyzer 的翻译。 Android Studio 2.2包含了APK Analyzer,通过它我们能够直观地看到APK的组成。...图3:翻译的字符串资源预览 查看DEX文件 APK Analyzer的DEX文件浏览器让你能够快速了解DEX文件的信息。...我们能看到类、包、总的引用和声明个数,这些信息能够帮助我们决定是否使用multi-dex或者移除依赖使得满足64K方法数限制。 图4展示了一个中等大小的APP(方法数接近64K)。...Referenced Method列是DEX文件中引用的全部方法,它包含了你定义的方法、依赖的library、定义在标准Java和Android包中的方法。...---- 作者简介:damonxia(夏正冬),天天P图Android工程师
Android Studio 2.2包含了APK Analyzer,通过它我们能够直观地看到APK的组成。使用APK Analyzer不仅能够减少你花在debug上的时间,而且还能减少你的APK大小。...(译注:新版APK和旧版APK之间文件大小的差异) 这里有3种方法访问APK Analyzer: 拖拽APK到Android Studio的编辑窗口。 切换到Project视图,并且双击APK文件。...图4:翻译的字符串资源预览 查看DEX文件 APK Analyzer的DEX文件浏览器让你能够快速了解DEX文件的信息。...我们能看到类、包、总的引用和声明个数,这些信息能够帮助我们决定是否使用multi-dex或者移除依赖使得满足64K方法数限制。 图5展示了一个中等大小的APP(方法数接近64K)。...Referenced Method列是DEX文件中引用的全部方法,它包含了你定义的方法、依赖的library、定义在标准Java和Android包中的方法。
,分别是: Dex:.class 文件处理后的产物,Android 系统的可执行文件 Resource:资源文件,主要包括 layout、drawable、animator,通过 R.XXX.id 引用...① Android Studio 自带的 APK 分析器 通过 APK 分析器,我们可以完成这些操作: 查看 APK 中文件(如 DEX 和 Android 资源文件)的绝对大小和相对大小 了解 DEX...1.2 Dex 知识点拓展 当我们在 Android 查看一个 APK 的时候,可以看到右上角有 Defined Methods 和 Referenced Methods,但大多数人可能不知道这两者的区别...Android 有 64K 引用限制,当 type_ids、method_ids 或者 field_ids 超过 65536(64 * 1024)的时候,需要进行 dex 分包,为了 Dex 的数量尽可能少...Dex 信息有效率 = Defined Methods 数量 / Referenced Methods 数量 二、 构建源码导读 当我们用 Android Studio 进行安装包构建的时候,会发现其实是运行了一连串的
classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。 AndroidManifest.xml:包含核心Android清单文件。...单个的 classes.dex 文件可以容纳大约 64K 方法。如果你达到了这个限制,你必须要在你的工程中启用 multidexing。...这将会创建另一个 classes1.dex 文件去存储剩下的方法。所以 classes.dex 文件数目由你的方法数而定。...它包括相同的 ProGuard 规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。...(Native.java:16) ... 5 more 我们也是有办法应对的,可以参见这个开源项目ReLinker
classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。 AndroidManifest.xml:包含核心Android清单文件。...单个的 classes.dex 文件可以容纳大约 64K 方法。如果你达到了这个限制,你必须要在你的工程中启用 multidexing。...这将会创建另一个 classes1.dex 文件去存储剩下的方法。所以 classes.dex 文件数目由你的方法数而定。...它包括相同的 ProGuard 规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。...(Native.java:16) ... 5 more 我们也是有办法应对的,可以参见这个开源项目ReLinker 另外关于SO的优化我会单独拿出来讲一讲。
领取专属 10元无门槛券
手把手带您无忧上云