web-dev-qa-db-fra.com

Proguard minifyEnabled true pour la construction de débogage, ne fonctionnant pas sur pré-Lollipop

Le nombre de méthodes de mon application est supérieur à la limite de 64k, j'utilise donc Proguard pour la réduire.

Tout fonctionne bien pour les versions release.
En revanche, les versions de débogage ne fonctionnent que pour les périphériques Lollipop +. Lors du lancement sur des appareils pré-Lollipop, j'ai toujours l'erreur infâme:

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

Voici ce que j'ai dans le fichier Gradle au niveau de l'application: 

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'
        }
    }

J'ai essayé de supprimer minifyEnabled true dans la version de débogage, puis celle-ci échoue également sur Lollipop +; par conséquent, proguard fonctionne! mais pas sur pré-sucette.

Pour ce que je sais, minifyEnabled ne devrait pas dépendre de la plate-forme, alors peut-être que le processus de construction l'ignore (car je ne sais pas quelle raison) sur les appareils pré-Lollipop.

Quelqu'un connaît une solution à ce problème?

ps. Je suis conscient de la possibilité multidex, mais je le laisse en dernier recours.

MODIFIER:

Ceci est le code complet du fichier de classement de niveau d'application:

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'

fichier de niveau de projet:

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
}

règles 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 { *; }
10

Si vous voulez essayer de réduire le nombre de méthodes, ou au moins vous voulez comprendre la différence entre publication et débogage, je vous suggère d'essayer de consulter le nombre dex disponible dans AS 2.2 preview 5, ils avaient une vidéo youtube (peut-être de Google IO) qui a rendu très facile le comptage de vos méthodes. 

Ceci ne concerne que les méthodes de comptage. Si vous utilisez toujours le même buildToolsVersion "23.0.3", vous devez obtenir exactement le même fichier apk dans les deux versions d'AS (mis à part le fait que AS 2.2 est livré avec sa propre version de JDK, qui n'est pas censé entrer votre chemin).

Déni de responsabilité: je n'ai jamais utilisé cet outil en dehors de jouer avec lui, donc je ne saurais pas quoi vous recommander après avoir trouvé le coupable.

EDIT: voici la vidéo https://youtu.be/csaXml4xtN8?t=331 pour "Apk Analyzer", qui réside dans le menu "Construire". N'essayez pas les critiques antérieures à 2.2 preview 3 ou ultérieur, elles ont prévisualisé certaines choses qui n'ont pas été publiées avant.

EDIT 2: pourquoi aussi utilisez-vous uniquement shrinkResources lors de la publication? C'est la ligne qui supprime les méthodes non traitées: "minifyEnabled" vs "shrinkResources" - quelle est la différence? et comment obtenir l'espace économisé?

1
Fabio

Remplacez le code de votre type de construction par ce code dans le fichier de niveaux de niveau de l'application. Lorsque vous déboguez ou exécutez du code sur votre appareil avant la version finale, sélectionnez ensuite le produit débogué de variante et lorsque vous allez créer un apk signé pour publication, puis sélectionnez version construite version 

  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'
                }
}
0
Amit Desale