Android Multidex使用
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
:
<?xml version="1.0" encoding="utf-8"?>"http://schemas.android.com/apk/res/android" package="xxx"> ... android:name="android.support.multidex.MultiDexApplication"> ...
- 如果您替换了
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.classcom/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' ... } }}
更多相关文章
- Android 资源文件夹下的文件不能有大写字符,会导致R.java无法生成
- Android菜鸟日记 23获取数据方式- sql,Sdcard,assets,preference
- Android中监听语言变化的两种方式
- android的文件系统结构简单介绍
- Android实现横竖屏、全屏的几种方式
- android Q(10)发送通知Notification出现无法推送问题解决方式
- 安卓课程六 android常用布局属性的介绍