Proguard minifyEnabled为真正的debugging版本,不工作的前棒棒糖

我的应用程序的方法计数高于64k的限制,所以我使用Proguard来减less它。

一切工作正常发布版本。
另一方面,debugging版本仅适用于Lollipop +设备。 在前棒棒糖设备上启动时,我总是有臭名昭着的错误:

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

这是我在应用程序级别的gradle文件中的:

 buildTypes { debug { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

我已经尝试删除debugging版本中的minifyEnabled true ,然后生成也失败了棒棒糖+,因此proguard正在工作! 但不在前棒棒糖。

对于我所知的minifyEnabled不应该是平台依赖的,所以也许构build过程跳过它(因为我不知道什么原因)的前棒棒糖设备。

任何人都知道这个问题的解决scheme?

PS。 我意识到multidex的可能性,但是我把它作为我的最后一招。

编辑:

这是应用程序级别gradle文件的完整代码:

 apply plugin: 'com.android.application' apply plugin: 'android-apt' apply plugin: 'me.tatarka.retrolambda' buildscript { repositories { mavenCentral() } dependencies { classpath 'me.tatarka:gradle-retrolambda:3.2.5' classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5' } } android { compileSdkVersion 24 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.pierfrancescosoffritti.shuffly" minSdkVersion 16 targetSdkVersion 24 versionCode 30 versionName "0.13" } buildTypes { debug { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } def dbflow_version = "3.1.1" dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' apt 'com.jakewharton:butterknife-compiler:8.2.1' apt "com.github.Raizlabs.DBFlow:dbflow-processor:${dbflow_version}" compile "com.github.Raizlabs.DBFlow:dbflow-core:${dbflow_version}" compile "com.github.Raizlabs.DBFlow:dbflow:${dbflow_version}" compile 'com.android.support:support-v4:24.1.1' compile 'com.android.support:design:24.1.1' compile 'com.android.support:recyclerview-v7:24.1.1' compile 'com.android.support:cardview-v7:24.1.1' compile 'com.android.support:palette-v7:24.1.1' compile 'com.jakewharton:butterknife:8.2.1' compile 'com.github.PierfrancescoSoffritti:AndroidUtils:0.5' compile 'com.github.PierfrancescoSoffritti:SlidingDrawer:0.10' compile 'com.github.PierfrancescoSoffritti:WebBasedOAuth:0.7' compile 'com.github.PierfrancescoSoffritti:ShrinkingImageLayout:0.4' compile 'com.github.PierfrancescoSoffritti:ExpandableLayout:0.1' compile 'com.google.apis:google-api-services-youtube:v3-rev177-1.22.0' compile 'com.google.api-client:google-api-client-android:1.20.0' compile 'io.reactivex:rxandroid:1.2.1' compile 'io.reactivex:rxjava:1.1.8' compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.github.Commit451:ElasticDragDismissLayout:1.0.4' compile 'com.google.firebase:firebase-core:9.2.1' compile 'com.google.firebase:firebase-crash:9.2.1' compile 'com.google.firebase:firebase-ads:9.2.1' compile 'com.artemzin.rxjava:proguard-rules:1.1.8.0' } apply plugin: 'com.google.gms.google-services' apply plugin: 'com.getkeepsafe.dexcount' 

项目级gradle文件:

 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.google.gms:google-services:3.0.0' classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.5.5' } } allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } } task clean(type: Delete) { delete rootProject.buildDir } 

proguard规则:

 # retrolambda -dontwarn java.lang.invoke.* # picasso -dontwarn com.squareup.okhttp.** # adMob -keep public class com.google.android.gms.ads.** { public *; } -keep public class com.google.ads.** { public *; } # GoogleApiClient # Needed to keep generic types and @Key annotations accessed via reflection -keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault -keepclassmembers class * { @com.google.api.client.util.Key <fields>; } # Needed by google-http-client-android when linking against an older platform version -dontwarn com.google.api.client.extensions.android.** # Needed by google-api-client-android when linking against an older platform version -dontwarn com.google.api.client.googleapis.extensions.android.** # Needed by google-play-services when linking against an older platform version -dontwarn com.google.android.gms.** # com.google.client.util.IOUtils references java.nio.file.Files when on Java 7+ -dontnote java.nio.file.Files, java.nio.file.Path # Suppress notes on LicensingServices -dontnote **.ILicensingService # Suppress warnings on sun.misc.Unsafe -dontnote sun.misc.Unsafe -dontwarn sun.misc.Unsafe # DBFlow -keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; } 

Solutions Collecting From Web of "Proguard minifyEnabled为真正的debugging版本,不工作的前棒棒糖"

如果你想尝试减less方法计数,或者至less你想了解从发布到debugging的差异,我build议你看一下在AS 2.2预览版5中可用的dex计数,他们有一个youtubevideo(也许从谷歌IO),这使得计算你的方法变得非常容易。

这只用于计数方法,如果仍然使用相同的buildToolsVersion "23.0.3" ,则应该在两个版本的AS中都得到完全相同的apk文件(除了AS 2.2带有自己的JDK版本不应该得到你的方式)。

免责声明:我从来没有使用这个工具,除了玩它,所以我不知道什么build议后,你实际上find一个罪魁祸首。

编辑:这里的videohttps://youtu.be/csaXml4xtN8?t=331为“Apk分析器”,住在“生成”菜单。 不要早于2.2预览版3或更高版本尝试评论,他们预览了一些以后才发布的内容。

编辑2:也是为什么你只在版本上使用shrinkResources ? 这是消除不必要的方法的线: “minifyEnabled”vs“shrinkResources” – 有什么区别? 以及如何获得节省的空间?

用应用级别的gradle文件中的代码replace您的构buildtypes代码。 当您在最终发布之前在设备上debugging或运行代码时,请select构build的变体debugging,当您要构build已签名的apk版本时,请select构build的变体版本

  buildTypes { debug { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

启用multidex为true,并允许作为multidex应用程序支持您的应用程序。要遵循的几个步骤是:

  defaultConfig { minSdkVersion 15 targetSdkVersion 23 versionCode 3 versionName "1.0.1" **multiDexEnabled true** } 

添加这个依赖到依赖列表

编译'com.android.support:multidex:1.0.0'

使用MultiDexApplication扩展您的应用程序级别

在你的应用程序类中写这个方法

 protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 

保持minifyEnabled false无论debugging还是释放构build

更新

 dexOptions { jumboMode = true javaMaxHeapSize "4g" //specify the heap size for the dex process preDexLibraries = false }