美文网首页
安卓多分包-multidex的使用

安卓多分包-multidex的使用

作者: czins | 来源:发表于2016-09-22 19:25 被阅读1457次

    当每个dex包超过65535个方法的时候,程序在运行时会报:NoClassDefFoundError

    1 在build.grade中配置defaultConfig:

    defaultConfig {
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
    

    2 在build.grade中配置dependencies:

    dependencies {
        compile 'com.android.support:multidex:1.0.1'
    }
    

    3 使用MultiDexApplication取代Application:

    ① 如果没有自定义Application,那么在AndroidManifest.xml中指定MultiDexApplication即可。
    ② 如果有自定义的MyApplaction extends Application,那么改成MyApplaction extends MultiDexApplication。
    ③ 如果有自定义的MyApplaction继承了一个不能修改的XApplication,那么覆盖attachBaseContext()方法,在其中调用一下MultiDex.install(this)也可以。

    4 实现主要的页面编译在主 classes.dex 中,其它的页面编译到 classes1.dex中。

    android studio 留了个坑,在 build.gradle 中提供了下面这种方式在项目的app目录下放入 multidex-keep.txt 文件,文件内容是保留在 maindex 的类名列表。

    // 格式如下:
    com/edo/sample/mutildex_demo/MyApplication.class
    com/edo/sample/mutildex_demo/MainActivity.class
    
    defaultConfig {
        ...
        // multidex-keep.txt
         multiDexKeepFile file('multidex-keep.txt')
    }
    

    然而现实是这种方式并无卵用,实现不了我们的需求,(不太确定是否还有其它配置)。

    大家都知道,将 class 打包成 classes.dex 使用的是 build-tools 下的 dx.bat 命令,所以可以从这里下手。
    Note: 要在 cmd 中直接使用 dx 命令需要将其加入环境变量。

    // 需要将下面的路径加入到环境变量中。
    ANDROID_SDK\build-tools\25.0.2\
    
     dx --dex [--debug] [--verbose] [--positions=<style>] [--no-locals]
      [--no-optimize] [--statistics] [--[no-]optimize-list=<file>] [--no-strict]
      [--keep-classes] [--output=<file>] [--dump-to=<file>] [--dump-width=<n>]
      [--dump-method=<name>[*]] [--verbose-dump] [--no-files] [--core-library]
      [--num-threads=<n>] [--incremental] [--force-jumbo] [--no-warning]
      [--multi-dex [--main-dex-list=<file> [--minimal-main-dex]]
      [--input-list=<file>]
      [<file>.class | <file>.{zip,jar,apk} | <directory>]
    

    使用其中的 --multi-dex --main-dex-list= multidex-keep.txt --minimal-main-dex 参数可以实现设置哪些类包含在maindex (classes.dex) 中。

    // 进入项目生成的class文件所在的目录
    cd project\app\build\intermediates\classes\release
    dx --dex --multi-dex --main-dex-list=multidex-keep.txt --minimal-main-dex --output ../release ../release
    

    android studio 中也提供了配置dex参数的方式:

    android {
        ...
        dexOptions {
                additionalParameters '--multi-dex', '--main-dex-list=' + file('multidex-config.txt').absolutePath, '--minimal-main-dex'
            }
    }
    

    Note:基于dex2jar和jd-gui写了个小工具可以双击直接反编译 classes.dex,猛戳下载

    相关文章

      网友评论

          本文标题:安卓多分包-multidex的使用

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