Proguard minifyEnabled true для сборки отладки, не работающей на pre-Lollipop

Количество методов моего приложения выше предела 64k, поэтому я использую Proguard для его уменьшения.

Все отлично работает для релизов.
С другой стороны, отладочные сборки успешны только для устройств Lollipop +. При запуске на устройствах pre-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' } } 

Я попытался удалить minifyEnabled true в сборке отладки, а затем сборка завершится неудачно и на Lollipop +, поэтому proguard работает! Но не на пре-Lollipop.

Для того, что я знаю, minifyEnabled не должен быть зависимым от платформы, поэтому, возможно, процесс сборки пропускает его (я не знаю, на какой причине) на устройствах pre-Lollipop.

Кто-нибудь знает решение этой проблемы?

пс. Я знаю о возможности multidex, но я оставляю это в качестве своего последнего средства.

РЕДАКТИРОВАТЬ:

Это полный код файла градиента уровня приложения:

 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' 

Файл градиента уровня проекта:

 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 true для сборки отладки, не работающей на pre-Lollipop"

Если вы хотите попытаться уменьшить количество меток или, по крайней мере, хотите понять разницу между выпуском и отладкой, я предлагаю вам попробовать посмотреть количество dex, доступное в предварительном просмотре AS 2.2, у них было видео youtube (возможно, из Google IO), что очень легко подсчитать ваши методы.

Это только для методов подсчета, если вы все еще используете один и тот же buildToolsVersion "23.0.3" вы должны получить тот же самый файл apk в обеих версиях AS (кроме того, что AS 2.2 поставляется со своей версией JDK, которая Не должен мешать вам).

Отказ от ответственности: я никогда не использовал этот инструмент, кроме игры с ним, поэтому я не знаю, что рекомендовать после того, как вы действительно найдете там преступника.

EDIT: вот видео https://youtu.be/csaXml4xtN8?t=331 для «Apk Analyzer», которое находится внутри меню «Build». Не пробуйте обзоры раньше, чем 2.2 Preview 3 или более поздней версии, они просматривали некоторые вещи, которые не были выпущены до более поздней версии.

РЕДАКТИРОВАТЬ 2: почему вы используете только shrinkResources ? Это линия, которая должна устранить неиспользуемые методы: «minifyEnabled» и «shrinkResources» – в чем разница? И как получить сохраненное пространство?

Замените код типа сборки с помощью этого кода в файле градиента уровня приложения. Когда вы отлаживаете или запускаете код на своем устройстве перед окончательной версией, затем выберите встроенный вариант debug и когда вы собираетесь создать подписанный apk для выпуска, тогда выберите встроенный вариант выпуска

  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 enabled true и разрешите поддержку вашего приложения в виде приложения с несколькими приложениями. Ниже перечислены следующие шаги:

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

Добавьте эту зависимость в список зависимостей

Msgstr "

Расширьте класс уровня приложения с помощью MultiDexApplication

Напишите этот метод в своем классе приложения

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

Сохранить minifyEnabled false независимо от отладки или выпуска сборки

Обновить

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