美文网首页
Android Dex分包,指定特定类打入主Dex

Android Dex分包,指定特定类打入主Dex

作者: 小智在不在 | 来源:发表于2020-05-27 16:47 被阅读0次

项目上线中发现报出很多FileProvider子类的java.lang.ClassNotFoundException,其中有一个特定子类报错最多,分析apk文件发现该类其实是存在dex中的,只是不在主dex中,怀疑是因为Provider加载时机很早,在Application类onCreat方法调用前就被系统初始化,但是因为某些原因不在主dex中所以报错,尝试将该类打入主dex中,但是看了很多资料发现都已经过时了,所提供的方法已经失效,根据官方文档我们应该这样做:

  1. 修改模块级 build.gradle 文件以启用多 dex 文件,并将多 dex 文件库添加为依赖项,如下所示(注意:本文所做的修改建立在假设你的应用已经支持多Dex分包的前提下):
android {
        defaultConfig {
            ...
            minSdkVersion 15
            targetSdkVersion 28
            multiDexEnabled true
            //根据官方文档描述,指定该文件可以以Proguard 格式和语法指定符合规则的类打入主dex类中,我没有使用这个,如果你不需要,可以注释或不添加,这种写法需要清单文件与build.gradle文件在同一层级,也就是该模块的根目录下。
            multiDexKeepProguard file('multiDexKeep.pro') 
            //指定一个清单文件,在清单文件中以单个文件格式添加需要打入主dex的包,这种写法需要清单文件与build.gradle文件在同一层级,也就是该模块的根目录下。
            multiDexKeepFile file('main-dex-list.txt') 
        }
        ...
    }

    dependencies {
      //注意这里使用的是Androidx的包
      implementation 'com.android.support:multidex:1.0.3'
    }

如下,我们指定的main-dex-list文件的位置:

main-dex-list文件的位置

如下,我们指定的main-dex-list文件的格式:

com/xxx/webview/extension/utils/FileProvider.class
com/sensorsdata/analytics/android/sdk/SensorsDataContentProvider.class
android/support/multidex/BuildConfig.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/ZipUtil$CentralDirectory.class
android/support/multidex/ZipUtil.class

根据我实际操作的情况,我们指定的main-dex-list最终会被合入build后生成的mainDexList,而不是和有的文章描述的那样需要把生成的mainDexList拷出来加入自己需要的类,有的文章可能会告诉你在app\build\intermediates\multi-dex\debug下可以找到这个类,但实际上新版本的Gradle中我们需要在app\build\intermediates\legacy_multidex_main_dex_list\debug\transformClassesWithMultidexlistForDebug\mainDexList.txt路径下才能找到这个文件,以及更多的和multiDex分包相关的信息,可以参阅Android开发者官网:启用多 dex 处理

相关文章

  • Android Dex分包,指定特定类打入主Dex

    项目上线中发现报出很多FileProvider子类的java.lang.ClassNotFoundExceptio...

  • Android Dex分包—Gradle方式

    上篇文章讲到了ant方式进行dex分包《Android Dex分包》,本篇文章再来看一下采用gradle方式进行d...

  • Android Dex分包

    最近项目apk方法数即将达到65536上限,虽然通过瘦身减少了一些方法数,但是随着更多sdk的接入,终究还是避免不...

  • android dex分包

    最简单的dex demo from http://blog.csdn.net/u013478336/article...

  • android dex 分包

    1、添加依赖 在module下的build.gradle文件 ,defaultConfig 节点中添加multiD...

  • Android Dex分包

    1.为什么要分包? 65536问题 导致因素随着项目apk的庞大以及加入更多的第三方库,app的方法数已经超过了6...

  • 安卓面试总结——提升

    1.热修复的几种方式 1.通过更改dex加载顺序实现热修复 热修复是基于dex分包方案,和Android虚...

  • Android Dex分包原理

    为什么要分包? 1、65536问题 导致因素随着项目apk的庞大以及加入更多的第三方库,app的方法数已经超过了6...

  • Android Dex 分包指南

    一、背景 随着业务规模发展,不断的加入新的功能,添加新的类库,app的方法数已经超过65535,这样的情况下就会遇...

  • Android dex分包方案

    当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象: 1. 生成的apk在2.3以前的机...

网友评论

      本文标题:Android Dex分包,指定特定类打入主Dex

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