Building Apps with Over 65K Methods

原创 2015年11月20日 18:27:22

一、起源

在Android项目中,添加了某一个第三方类库后,构建报错,提示java.lang.VerifyError

二、解决

于是google了一下,Android Doc文档给出的解释是,尝试去加载一个在验证阶段未通过的类,又看了stackoverflow上一些问题的解释,确定是APP Methods 个数超过65536导致的问题,要解决这个问题,需要使用multiDex,通过以下两步完成配置。

1.配置 multiDex构建选项

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

2.在APP的Application配置MultiDex

1>如果未自定义Application

<application
    ...
    android:name="android.support.multidex.MultiDexApplication">
    ...
</application>
2>如果自定义了Application,那么需要在Application的attachBaseContext方法中配置multiDex

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);

    MultiDex.install(this);
}

Tips:可能遇到的问题,如果只是在gradle中添加MultiDex选项,没有在Application中配置,当在项目中添加新的类时,编译不会报错,运行时,报Runntime Error Java.lang.ClassNotDefError.

三、延展

1.超长的编译时间

添加multiDex之后,编译时间超长,严重的影响了开发效率

在Android的官方网站查了下MultiDex相关的资料,找到了一些优化解决方案

1>原因:

当添加multiDex配置后,每次构建APP时,会把类分开到不同的dex文件,一个Primary Dex(classes.dex) 和多个Support Dex 文件(classes2.dex, classes3.dex),构建系统需要经过复杂的策略决定哪些类放到 Primary Dex文件,哪些类放到Support Dex中

2>优化方案

可以通过Android 的 productFlavors来优化这个问题

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'
}
在productFlavors中添加了两个变量,一个development,一个product,同步gradle之后,会生成四个构建变量 devDebug devRelease, prodDebug, prodRelease,在studio的Build Variants中配置在开发时,使用devDebug,发布时,使用prodRelease,

这样在开发的时候,设置的最低编译版本是21,发布时,使用的最低版本根据项目需要配置。

上述配置同步之后,平常开发时,构建的速度很快,只有发布Release版本时,构建才比较慢。

缺点时,debug的APK只能安装在5.0以上的机器中(推荐Genymotion的模拟器~确实非常好用)。

3>为什么能优化速度?

上述配置完成后,gradle在构建项目时:

①APP的每个module(包含依赖)被编译为单独的dex文件,作为预编译的dex文件被引用,Android 5.0使用ART作为默认方式

②APK文件只是把每个module的dex文件包含进来,不做任何改动

③最重要的一点,所有的dex文件不用再融合,这样构建系统就不用花费很长的时间去决定把哪些classes放到primary dex文件中

2.MultiDex support library的缺陷

1>APP在启动时,将dex文件安装到Data分区的过程变得复杂,如果第二个dex文件过大,可能导致ANR错误。如果出现这种情况,可以通过ProGuard来减小dex文件的大小,同时删除没有引用的代码

2>APP 不能在低于Android 4.0的版本启动

3>使用MultiDex机制的APP如果在运行时申请过大的内存,可能导致APP crash,因为Android 5.0之前的版本限制了Dalvik能够申请的内存

4>Dalvik虚拟机在运行时,对于哪些需要放在primary dex文件的class的需求时非常复杂的,有可能某些需要的类库并没有被放在primary dex文件中,导致运行时错误

四、参考资料

参考网址:

https://developer.android.com/tools/building/multidex.html#avoid

http://stackoverflow.com/questions/32205938/java-lang-noclassdeffounderror-android-support-v4-view-layoutinflatercompathc-i

http://frogermcs.github.io/MultiDex-solution-for-64k-limit-in-Dalvik/


Building Apps with Over 64K Methods

详细解决方案原文地址 https://developer.android.com/intl/zh-cn/tools/building/multidex.html,有兴趣的可以研究。 今天编译一个项...
  • WUSE123
  • WUSE123
  • 2016年05月11日 09:39
  • 2124

Android Building Apps with Over 65K Methods (Multiple DEX)

Building Apps with Over 65K Methods (Multiple DEX) From:https://developer.android.com/tools/building...
  • YaphetZhao
  • YaphetZhao
  • 2015年09月16日 13:09
  • 1008

[AndroidStudio]Building Apps with Over 64K Methods

由于项目越来越大,不可避免的引用第三方的库,造成项目方法爆棚 方法总数超过轻轻松松过64K 问题: Error:The number of method references in a ...
  • knockheart
  • knockheart
  • 2016年05月12日 14:19
  • 2402

Configure Apps with Over 64K Methods

翻译自:https://developer.android.com/studio/build/multidex.html?hl=zh-cn随着Android平台的发展,Android应用的大小也变得越...
  • weizaishouex2010
  • weizaishouex2010
  • 2016年07月31日 22:48
  • 890

Android Studio解除65K限制

由于google方面的一些原因,当你的工程导入的第三方jar或者library超过它的限制的时候,会编译通不过。那如何解决呢?在此简单整理下。-对build.gradle中加入以下东西:android...
  • u011993368
  • u011993368
  • 2015年08月31日 15:59
  • 866

(转载)Building Apps with Over 65K Methods -- 你可能会遇到的Class Not Found问题

本文转载于:罗升阳的新浪微博  http://weibo.com/p/1001603884849646685222    尊重原创,转载一定要加上原创地址!        随着功能越来越...
  • qq2603825424
  • qq2603825424
  • 2015年09月09日 10:11
  • 908

Android 突破 65K Methods

由于业务需求导入了Google Play Service 的库,编译直接报错。经查发现超出65K个方法,一个Dex已经无法包含。 开发用的Android Studio,首先在 build.gradle...
  • qduningning
  • qduningning
  • 2015年06月09日 23:52
  • 2536

跟Google 学代码:Building Apps with Graphics & Animation

引言可以右键保存我做的思维导图:Google这一章的课程共分为四大部分:我做的思维导图: 高效展示篇 OpenGl使用篇 View动画 使用动画集 考虑文章篇幅和博客内容连续性,本篇仅仅涉及B...
  • chivalrousman
  • chivalrousman
  • 2016年07月18日 20:29
  • 2229

android 4.2 安全新特性(I)

Android 4.2发布已有很长时间了。有一些安全新特性。分析一下: Application verification — Users can choose to enable “Verify...
  • u011069813
  • u011069813
  • 2013年06月26日 22:11
  • 1836

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

也可以关注我的公众号随着android平台的增长,同样你的应用也在迭代中,当你的app或者你应用的库到达一定的规模时,当我们build的时候很容易达到android的65k限制,早期build时的错误...
  • eandroidhu
  • eandroidhu
  • 2016年05月31日 10:53
  • 1946
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Building Apps with Over 65K Methods
举报原因:
原因补充:

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