逗人, 我在很多博客文章中都看到,multidex apps启动比普通应用慢。 我的应用程序使用了很多超过64k方法的库,所以我使用multidex。但是当我在发布版本中使用proguard时,最终的apk变得不到64k方法
所以我的问题是:我是否可以在Android调试版本中启用multidex,这样我就没有运行时错误?并且在发布版本中禁用multi dex,因为我不需要它?
如果是,怎么样?
如果不是,Android是否足够智能以加速启动,因为它应该认识到应用程序不超过64k,即使它是多dex应用程序?
答案 0 :(得分:20)
是的,你可以。当您声明buildTypes仅包含用于debug的multidex时:
buildTypes {
release {
multiDexEnabled false
}
debug {
multiDexEnabled true
}
}
答案 1 :(得分:9)
除了仅为调试启用multidex,您可以将min sdk版本更改为21仅用于调试,因此gradle可以加快ART的dexing:
android {
productFlavors {
// Define separate dev and prod product flavors.
dev {
// dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
// to pre-dex each module and produce an APK that can be tested on
// Android Lollipop without time consuming dex merging processes.
minSdkVersion 21
}
prod {
// The actual minSdkVersion for the application.
minSdkVersion 14
}
}
...
buildTypes {
release {
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.android.support:multidex:1.0.0'
}
答案 2 :(得分:4)
您不再需要开发模式来启用多重删除 开发,这可以减少API版本检查...
过去,我们的文档建议创建一个开发产品 具有minSdkVersion为21的flavor,以便启用多索引 在开发过程中显着加快构建速度。那个解决方法 不再需要,它有一些严重的缺点,如 打破API访问检查(因为真正的minSdkVersion是没有 更久以来。)在最新版本的IDE和Gradle插件中, IDE自动传递连接设备的API级别 用于部署,如果该设备至少是API 21,那么 multidexing会自动打开,这意味着你会得到相同的结果 速度有益于开发产品的味道,但没有缺点。
答案 3 :(得分:0)
是的,它甚至可以与Lollipop之前的Android版本的multidex支持库一起使用,只需一点技巧。
首先在build.gradle中为调试版本指定multiDexEnabled
:
buildTypes {
...
debug {
...
multiDexEnabled true
}
}
然后在AndroidManifest.xml
下创建一个src/debug
文件。
src/debug/AndroidManifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:name="android.support.multidex.MultiDexApplication"
tools:replace="android:name"/>
</manifest>
应该可以解决问题。如果您的应用程序使用自定义应用程序类,则必须创建该应用程序类的子类,并在清单中指定该子类的名称。
应用程序子类应如下所示:
public class MyDebugApplication extends MyApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}