zoukankan      html  css  js  c++  java
  • 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'
    }

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

  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/hainange/p/6153429.html
Copyright © 2011-2022 走看看