Proguard可以避免应用程序变成multidex吗?

3

我有一个应用程序,其中包含几个库,已经达到了65536个方法计数的红线。

  1. 我成功将应用程序设置为了一个multidex APK。
  2. 为了进行大小优化,我决定使用Proguard,因为我只使用了一些Guavacommon.java.lang的功能,而这些库会随其整个家族一起被引入。
  3. 在完成Proguard后,我的应用程序现在大约有45,000个方法。
  4. 我经常听说多dex应用程序可能会偶尔崩溃。
  5. 由于第二个dex运行时加载,加载时间比较长,所以会出现这种情况。

那么4和5是真的吗?

然后我尝试不使用multidex,因为我的最终方法计数是<56Kmethods,使用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"
        }
    }

  1. 我经常看到多 dex 应用程序可能会偶尔崩溃。这不是真的。最好使用 multidex。
  2. 因为第二个 dex 运行时加载,所以需要时间吗?这是真的,它需要时间...建立...您可以使用 productFlavors 用于开发和生产...它将快速构建。
- Sunil Kumar
你能添加错误日志吗? - Sunil Kumar
1个回答

5
我经常看到使用multidex应用程序可能会时不时地崩溃。根据android开发者文档页面(http://developer.android.com/tools/building/multidex.html#limitations):使用multidex配置的应用程序,如果进行非常大的内存分配请求,则由于Dalvik linearAlloc限制(问题78035),可能会在运行时崩溃。在Android 4.0(API级别14)中增加了分配限制,但在Android 5.0(API级别21)之前的Android版本上仍然可能遇到此限制。ART内置了对多dex apk的支持,因此在棒棒糖及以上版本中,多dex不应该造成任何问题。您可能会在某些运行kitkat及以下版本的设备上遇到问题,尽管这应该很少见,除非您具有非常高的方法计数或内存要求。
由于第二个dex运行时加载,所以需要时间。

是的,multidex确实会显著地减慢您的应用程序第一个启动时间。(例如yelp,当他们超过限制2万个方法时,增加了200%以上)即使冷启动时间也会增加。

因此,如果您可以避免使用multi-dex,强烈建议这样做。

即使您超过限制,仍然应该尽量减少方法数量,因为越来越多的方法会减慢在pre-lollipop设备上应用的启动时间。

在您的情况下,如果您的构建成功,但仍然看到运行时崩溃(特别是像"未找到类定义"这样的崩溃),那么可能是您没有正确配置ProGuard,它可能会剥离一些必需的组件。

yelp的Timothy Meller针对此问题进行了详细讲解,其中还分享了一些multi-dex优化和ProGuard配置的重要性:

https://www.youtube.com/watch?v=skmOBriQ28E

如果您希望更好地了解Android上的multi-dexing,我建议您观看这个视频。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接