Подтвердить что ты не робот

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

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

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

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

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

EDIT:

Это полный код файла уровня приложения 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 { *; }
4b9b3361

Ответ 1

Если вы хотите попытаться уменьшить количество меток или, по крайней мере, хотите понять разницу между выпуском и отладкой, я предлагаю вам попробовать посмотреть количество 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 или более поздней версии, они просматривают некоторые вещи, которые не были выпущены до конца.

EDIT 2: почему вы используете только shrinkResources при выпуске? Это строка, которая должна устранить неиспользуемые методы: "minifyEnabled" vs "shrinkResources" - какая разница? и как получить сохраненное пространство?

Ответ 2

Замените код типа сборки этим кодом на уровне приложения gradle. когда вы отлаживаете или запускаете код на своем устройстве перед окончательной версией, затем выберите встроенный вариант отладки и когда вы собираетесь создать подписанный 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'
                }
}

Ответ 3

Включить multidex enabled true и разрешить поддержку вашего приложения в виде приложения с несколькими приложениями. Ниже перечислены следующие шаги:

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

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

compile 'com.android.support:multidex:1.0.0'

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

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

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

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

update

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