May Proguard保存到multidex应用程序?

时间:2016-04-12 10:19:15

标签: android android-gradle proguard android-proguard multidex

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

  1. 我完成了将应用设置为multidex APK。
  2. 为了进行大小优化,我决定使用Proguard,因为我只使用了Guavacommon.java.lang的一些功能,而这些lib则带来了他们的整个家庭。
  3. 在Proguard工作之后,我的应用程序参考~45 Kmethods
  4. 我经常读到multidex app可能会不时崩溃
  5. 由于第二次运行时加载,这需要时间。
  6. 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"
            }
        }
    

1 个答案:

答案 0 :(得分:4)

  
      
  1. 我经常读到multidex app可能会不时崩溃
  2.   

来自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及以下版本的某些设备上看到问题,但这种情况应该很少见,除非您的方法计数或内存要求非常高。

  
      
  1. 由于第二次运行时加载,这需要时间。
  2.   

是的,multidex确实会显着降低应用的首次启动时间。 (如果是yelp,当他们超过极限的20k方法时,高达200%)甚至冷启动时间也会增加。

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

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

在您的情况下,如果您的构建成功但是如果您发现运行时崩溃(特别是诸如"没有找到类别定义")那么可能是您没有' t正确配置了proguard,它可能会删除一些必需的组件。

来自yelp的Timothy Meller就此问题进行了详细讨论,其中他还分享了一些多指标优化以及proguard配置的重要性:

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

如果你想更好地理解android上的多dexing,我建议你看这个