Proguard 可以保存到 multidex 应用程序吗?

Posted

技术标签:

【中文标题】Proguard 可以保存到 multidex 应用程序吗?【英文标题】:May Proguard save going to multidex app ? 【发布时间】:2016-08-02 21:26:43 【问题描述】:

我有一个带有几个库的应用程序,达到了 65536 个方法计数的红线。

    我实现了将应用设置为multidex APK。 为了优化大小,我决定使用 Proguard,因为我只使用了 Guavacommon.java.lang 的一些功能,而这些库带来了他们的整个家庭。 Proguard 工作后,我的应用程序参考 ~ 45 Kmethods 我经常读到,multidex 应用程序可能不时崩溃 而且由于第二个 dex 运行时加载,这需要时间。

4 和 5 是真的吗?

然后我只是尝试不使用mutidex,因为我的结束方法计数是

为此,我只是将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"
        
    

【问题讨论】:

4) 我经常读到 multidex 应用程序可能会不时崩溃。这不是真的。更好地使用 multidex 。 5)因为第二个dex运行时加载,这需要时间吗?这是真的,这需要时间..building..u 可以将 productFlavors 用于开发和生产...它将快速构建 可以添加错误日志吗? 【参考方案1】:
    我经常读到,multidex 应用程序可能不时崩溃

来自 android 开发者文档页面 (http://developer.android.com/tools/building/multidex.html#limitations):

使用 multidex 配置的应用程序非常大 由于 Dalvik,内存分配请求可能会在运行时崩溃 线性分配限制(问题 78035)。分配限制增加了 Android 4.0(API 级别 14),但应用程序可能仍会遇到此限制 Android 5.0(API 级别 21)之前的 Android 版本

ART 内置了对多 dex apk 的支持,因此多 dexing 不会在棒棒糖及更高版本中造成任何问题。您可能会在某些运行 kitkat 及更低版本的设备上看到问题,但除非您有非常高的方法数或内存要求,否则这种情况应该很少见。

    而且由于第二个 dex 运行时加载,这需要时间。

是的,multidex 确实会显着减慢应用的首次启动时间。 (在 yelp 的情况下高达 200%,当他们超过限制 20k 方法时)甚至冷启动时间也会增加。

因此,如果可以避免多重索引,强烈建议您这样做。

即使超出限制,您仍应尽量减少方法计数,因为越来越多的方法会减慢棒棒糖前设备上的应用启动时间。

在您的情况下,如果您的构建成功,但如果您看到运行时崩溃(尤其是“No Class def.found”),那么可能是您没有正确配置 proguard,可能是剥离一些必需的组件。

yelp 的 Timothy Meller 就这个问题做了详细的演讲,他还分享了一些多 dex 优化和 proguard 配置的重要性:

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

如果您想更好地了解 android 上的多 dexing,我建议您观看此内容

【讨论】:

以上是关于Proguard 可以保存到 multidex 应用程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

Multidex、Proguard 和 Firebase

Android ProGuard +MultiDex 导致 ClassNotFoundException

在处理 Proguard、MultiDex、测试和产品风味时,啥是好的策略?

使用 Multidex 的 Android proguard

在 Xamarin Studio 中启用 MultiDex 或 ProGuard 时出错

在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,只有第二次出现警告/注释?