Android 65535 问题与 MultiDex分包

 

Android Multidex 遇到的问题 
http://blog.csdn.net/wangbaochu/article/details/51178881

Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚 
http://blog.csdn.net/t12x3456/article/details/40837287

apply plugin: 'com.android.application'
 //设置编译android项目的参数
android {
  compileSdkVersion 22
  buildToolsVersion "22.0.1"
  defaultConfig {
    // 应用的包名
    applicationId "me.storm.niaa"
    minSdkVersion 9
    // maxSdkVersion 23
    targetSdkVersion 22
    //versionCode 229
    //versionName "2.2.9"
    // versionCode rootProject.ext.versionCode
    // versionName rootProject.ext.versionName
    multiDexEnabled true
  }

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = []
        }
        dx.additionalParameters += '--multi-dex' // enable multidex
    }
}

dexOptions {
  javaMaxHeapSize "4g"    //java虚拟机堆内存最大值设为4g,避免oom
  preDexLibraries = false //设置对第三方lib不做preDex处理
  additionalParameters =  //每个dex包方法数限制在4000以内
        ['--multi-dex',
        '--set-max-idx-number=40000']
}

  

1.配置您的应用进行Dalvik 可执行文件分包


将您的应用项目设置为使用 Dalvik 可执行文件分包配置需要对您的应用项目进行以下修改,具体取决于应用支持的最低 Android 版本。

1.1 如果您的 minSdkVersion 设置为 21 或更高值,您只需在模块级 build.gradle 文件中将 multiDexEnabled 设置为 true,如此处所示:

android {
    defaultConfig {
        ...
        minSdkVersion 21
        targetSdkVersion 25
        multiDexEnabled true
    }
    ...
}

但是,如果您的 minSdkVersion 设置为 20 或更低值,则您必须按如下方式使用 Dalvik 可执行文件分包支持库

  • 修改模块级 build.gradle 文件以启用 Dalvik 可执行文件分包,并将 Dalvik 可执行文件分包库添加为依赖项,如此处所示:

    android {
        defaultConfig {
            ...
            minSdkVersion 15
            targetSdkVersion 25
            multiDexEnabled true
        }
        ...
    }

    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
  • 1.2 根据是否要替换 Application 类,执行以下操作之一:
    • 如果您没有替换 Application 类,请编辑清单文件,按如下方式设置 <application> 标记中的 android:name

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapp">
          <application
                  android:name="android.support.multidex.MultiDexApplication" >
              ...
          </application>
      </manifest>
    • 如果您替换了 Application 类,请按如下方式对其进行更改以扩展 MultiDexApplication(如果可能):

      public class MyApplication extends MultiDexApplication { ... }
    • 或者,如果您替换了 Application 类,但无法更改基本类,则可以改为替换 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包:

      public class MyApplication extends SomeOtherApplication {
        @Override
        protected void attachBaseContext(Context base) {
           super.attachBaseContext(context);
           Multidex.install(this);
        }
      }

构建应用后,Android 构建工具会根据需要构建主 DEX 文件 (classes.dex) 和辅助 DEX 文件(classes2.dex 和 classes3.dex 等)。然后,构建系统会将所有 DEX 文件打包到您的 APK 中。

运行时,Dalvik 可执行文件分包 API 使用特殊的类加载器来搜索适用于您的方法的所有 DEX 文件(而不是仅在主 classes.dex 文件中搜索)。

 

2.测试 Dalvik 可执行文件分包应用


编写面向 Dalvik 可执行文件分包应用的仪器测试时,无需进行其他配置。AndroidJUnitRunner 直接支持 Dalvik 可执行文件分包,前提是您使用MultiDexApplication 或替换您的自定义 Application 对象中的 attachBaseContext() 方法,并调用 MultiDex.install(this) 以启用 Dalvik 可执行文件分包。

或者,您可以替换 AndroidJUnitRunner 中的 onCreate() 方法:

public void onCreate(Bundle arguments) {
    MultiDex.install(getTargetContext());
    super.onCreate(arguments);
    ...
}

:目前不支持使用 Dalvik 可执行文件分包来创建测试 APK。

ref:

配置方法数超过 64K 的应用 | Android Studio
https://developer.android.com/studio/build/multidex.html、

Android 解决65535的限制 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
http://blog.csdn.net/x_i_a_o_h_a_i/article/details/46544341

原文地址:https://www.cnblogs.com/bluestorm/p/6744330.html