美文网首页Android开发发布Android进阶之路
Android Multidex正确使用方式(你可能也会遇到的坑

Android Multidex正确使用方式(你可能也会遇到的坑

作者: Sky_Blue | 来源:发表于2018-11-10 10:49 被阅读49次
    一、概述

    Android 应用 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,其中包含用来运行您的应用的已编译代码。Dalvik Executable 规范将可在单个 DEX 文件内可引用的方法总数限制在 65,536,其中包括 Android 框架方法、库方法以及您自己代码中的方法。在计算机科学领域内,术语千(简称 K)表示 1024(或 2^10)。由于 65,536 等于 64 X 1024,因此这一限制也称为“64K 引用限制”,详细介参考谷歌官方配置文档。
    谷歌官方配置使用文档

    二、Multidex使用简单配置
    // 1. Gralde 配置
    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 28
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.3'
    }
    
    // 2. 清单配置
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp">
        <application
                android:name="com.xxx.MyApplication" >
            ...
        </application>
    </manifest>
    
    // 3. Application初始化
    public class MyApplication extends SomeOtherApplication {
      @Override
      protected void attachBaseContext(Context base) {
         super.attachBaseContext(base);
         MultiDex.install(this);
      }
    }
    

    如果就这么简单我写这个也没什么意义,最主要看下面的高配置,和我所遇到的坑。

    四、高级配置,multiDexKeepFile 属性

    如果APP安装失败,调试日志出现 NoClassDefFoundErrorClassNotFoundExceptionNoSuchMethodException等异常,就需要将这些找不到的类,配置到主的DEX 文件中,以至于在APP初始化的时候能找到这些类。
    配置方法:

    1. 在build.gradle文件同级目录下创建一个multidex-config.txt(这里随便命名)配置文件。

    2. 在文件中添加找不到的类,如下所示:
      com/example/MyClass.class// 普通类配置方式
      com/example/MyOtherClass$InnerClass.class// 内部类配置方式

    3. 在配置multidex-config.txt前,先release一遍,找到app/build/intermediates/multi-dex/release/maindexlist.txt这个文件的所有内容复制到multidex-config.txt文件中。maindexlist.txt里面的内容是通过一系统列方法算出APP启动所关联的类。

      maindexlist文件目录.jpg
    4. 在build.gradle文件配置

    android {
        buildTypes {
            release {
                multiDexKeepFile file ('multidex-config.txt')// 小括号记得要加上,官方文档没有
                ...
            }
        }
    }
    
    1. 每个包内方法数上限配置(对低端机型很重要)
    dexOptions {
        javaMaxHeapSize "4048M"
        additionalParameters = [//dex参数详见 dx --help
              '--multi-dex',//多分包
               '--set-max-idx-number=28000'//每个包内方法数上限(根据实际项目配置这个数,来适配4.0-4.4一些低端机型,因为拆分的dex太大,这些低端机型加载不了dex)
        ]
    }
    

    注意:每个dex(claasses.dex、claasses1.dex、claasses2.dex...)内方法数上限(根据实际项目配置这个数,来适配4.0-4.4一些低端机型,因为拆分的dex太大,这些低端机型加载不了dex),这个数也不能太小,最多能分7个DEX。

    三、高级配置,multiDexKeepProguard 属性
    1. 目的是怕上面那些配置的类混淆导致APP启动失败,所配置,如果APP本来就没有混淆,就不用管这个配置了。
    2. 在build.gradle文件同级目录下创建一个multidex-config.pro(这里随便命名)配置文件。
    3. 配置内容如下所示(和混淆其实是一样):
      -keep class com.example.MyClass // 保持这个类不混淆
      -keep class com.example.** { *; }//保持这个包下的所有类不混淆
    4. build.gradle文件中配置
    android {
        buildTypes {
            release {
                multiDexKeepProguard ('multidex-config.pro')
                ...
            }
        }
    }
    
    五、总结
    1. Multidex使用有很多坑,尽量将自己的APP去三方平台做云真机兼容性测试。如阿里移动测试、testin云测试等,推荐去云测试上去做真机调试,调试完有调试日志。
    2. 在三方平台用真机调试一些不能过的机型,调试运行失败后,下载调试日志,就可以找到上面我讲的那几个错误。
    3. 如果没有类找不到那些异常,对于下面这些错误:
      DexOpt: --- END 'cn.xxx.xxx-1.apk.classes4.zip' --- status=0x000e, process failed
      MultiDex installation failure
      java.io.IOException: unable to open DEX file
      是Dex太大,在低端机型加载失败所致。如果你的Dex不能在小了,你就放弃这些机型吧(没办法了,如果有好的方法请告诉我)。
    4. 看一下我的测试成果,其实还是有些机型不行的,但对我们APP的用户来讲,应该是没什么影响的了。


      测试成果.jpg

    相关文章

      网友评论

      • CaptainJno:你好,请教一下,我在未配置multiDexKeepFile的情况下,只单独配置了包内方法数上限,打出来的包,dex方法数还是超过了设的上限,配置似乎没有生效。请问是为什么呢
        Sky_Blue:'--set-max-idx-number=50000'这个值改大一些

      本文标题:Android Multidex正确使用方式(你可能也会遇到的坑

      本文链接:https://www.haomeiwen.com/subject/dnfzxqtx.html