我有一个带有几个库的应用程序,达到65536方法计数的红线。
multidex
APK。Guava
和common.java.lang
的一些功能,而这些lib则带来了他们的整个家庭。4和5是否属实?
然后我只是尝试不使用mutidex
,因为我的结束方法计数是< 56K方法与prodGuard,但它失败,好像它有更多!
为此,我只将gradle参数multiDexEnabled
设为false
还有其他事情要检查/做吗?
以下是我的Gradle的一部分:
android {
compileSdkVersion ANDROID_BUILD_SDK_VERSION
buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
applicationId "XXXX"
targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION
minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION
versionCode ANDROID_BUILD_VERSION_CODE
versionName ANDROID_BUILD_APP_VERSION_NAME
// Enabling multidex support.
multiDexEnabled false
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
debuggable false
ext.enableCrashlytics = true
renderscriptOptimLevel 3
signingConfig android.signingConfigs.release
zipAlignEnabled true
minifyEnabled true
// shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro', 'proguard-rules-new.pro', 'proguard-rules-eventbus.pro', 'proguard-rules-firebase.pro', 'proguard-rules-fabric.pro', 'proguard-rules-leakcanary.pro'
}
debug {
debuggable true
renderscriptOptimLevel 3
applicationIdSuffix ".debug"
versionNameSuffix "debug"
}
}
答案 0 :(得分:4)
- 我经常读到multidex app可能会不时崩溃
醇>
来自android开发者文档页面(http://developer.android.com/tools/building/multidex.html#limitations):
使用非常大的multidex配置的应用程序 由于Dalvik,内存分配请求可能在运行时崩溃 linearAlloc limit(问题78035)。分配限额增加了 Android 4.0(API级别14),但应用程序可能仍会遇到此限制 Android 5.0之前的Android版本(API级别21)
ART支持多指令apx,因此多dexing不应该导致棒棒糖及以上的任何问题。您可能会在运行kitkat及以下版本的某些设备上看到问题,但这种情况应该很少见,除非您的方法计数或内存要求非常高。
- 由于第二次运行时加载,这需要时间。
醇>
是的,multidex确实会显着降低应用的首次启动时间。 (如果是yelp,当他们超过极限的20k方法时,高达200%)甚至冷启动时间也会增加。
因此,如果您可以避免多重处理,强烈建议您这样做。
即使超出限制,您仍应尽量减少方法计数,因为越来越多的方法会减慢预制棒棒糖设备上的应用启动时间。
在您的情况下,如果您的构建成功但是如果您发现运行时崩溃(特别是诸如"没有找到类别定义")那么可能是您没有' t正确配置了proguard,它可能会删除一些必需的组件。
来自yelp的Timothy Meller就此问题进行了详细讨论,其中他还分享了一些多指标优化以及proguard配置的重要性:
https://www.youtube.com/watch?v=skmOBriQ28E
如果你想更好地理解android上的多dexing,我建议你看这个