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 { *; }
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é?
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'
}
}