欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Multidex使用,方法数超过“65536”问题的解决方式

程序员文章站 2023-08-31 13:02:13
1.使用原因 android开发中经常会遇到方法数超过“65536”问题,这个问题是在大型项目中,比如引用了众多第三方库之后,几乎不可避免的问题。 2.集成步骤 2.1第一步...

1.使用原因

android开发中经常会遇到方法数超过“65536”问题,这个问题是在大型项目中,比如引用了众多第三方库之后,几乎不可避免的问题。

2.集成步骤

2.1第一步

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

android {
 defaultconfig {
  ...
  minsdkversion 21 
  targetsdkversion 27
  multidexenabled true
 }
 ...
}

但是,如果您的 minsdkversion 设置为 20 或更低值,则您必须按如下方式使用

android {
 defaultconfig {
  ...
  minsdkversion 15 
  targetsdkversion 25
  multidexenabled true
 }
 ...
}

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

2.2第二步

如果您没有替换 application 类,请编辑清单文件,按如下方式设置 标记中的 android:name:



 
  ...
 

如果您替换了 application类,请按如下方式对其进行更改以扩展 multidexapplication:

public class myapplication extends multidexapplication { ... }

或者,如果您替换了 application 类,但无法更改基本类,则可以改为替换 attachbasecontext() 方法并调用 multidex.install(this) :

public class myapplication extends someotherapplication {
  @override
  protected void attachbasecontext(context base) {
  super.attachbasecontext(context);
  multidex.install(this);
  }
}

3.优化开发构建中的 dalvik 可执行文件分包

为了缩短耗时更长的 dalvik 可执行文件分包输出构建时间,请利用 productflavors(一个开发定制和一个发布定制,具有不同的 minsdkversion 值)创建两个构建变型。

android {
 defaultconfig {
  ...
  multidexenabled true
 }
 productflavors {
  dev {//开发版
// enable pre-dexing to produce an apk that can be tested on
// android 5.0+ without the time-consuming dex build processes.
minsdkversion 21
  }
  prod {//发布版
// the actual minsdkversion for the production version.
minsdkversion 14
  }
 }
 buildtypes {
  release {
minifyenabled true
proguardfiles getdefaultproguardfile('proguard-android.txt'),
 'proguard-rules.pro'
  }
 }
}
dependencies {
 compile 'com.android.support:multidex:1.0.3'
}

4 classes not found错误

在build.gradle中开启multidex,并指定配置文件,(注意multidexkeep.pro和multidexkeep.txt文件需要自己创建,放在项目的app文件夹下)

multidexkeepfile 属性

您在 multidexkeepfile 中指定的文件应该每行包含一个类,并且采用 com/example/myclass.class 的格式。例如,您可以创建一个名为 multidex-config.txt 的文件,如下所示:

com/example/myclass.class
com/example/myotherclass.class

然后,您可以按以下方式针对构建类型声明该文件:

android {
 buildtypes {
  release {
multidexkeepfile file 'multidex-config.txt'
...
  }
 }
}

请记住,gradle 会读取相对于 build.gradle 文件的路径,因此如果 multidex-config.txt 与 build.gradle 文件在同一目录中,以上示例将有效。

multidexkeepproguard 属性

multidexkeepproguard 文件使用与 proguard 相同的格式,并且支持整个 proguard 语法。如需了解有关 proguard 格式和语法的详细信息,请参阅 proguard 手册中的 keep options 一节。

您在 multidexkeepproguard 中指定的文件应该在任何有效的 proguard 语法中包含 -keep 选项。例如,-keep com.example.myclass.class。您可以创建一个名为 multidex-config.pro 的文件,如下所示:

-keep class com.example.myclass
-keep class com.example.myclasstoo

如果您想要指定包中的所有类,文件将如下所示:

-keep class com.example.** { *; } // all classes in the com.example package

然后,您可以按以下方式针对构建类型声明该文件:

android {
 buildtypes {
  release {
multidexkeepproguard 'multidex-config.pro'
...
  }
 }
}