J'utilise MultiDex et ProGuard dans mon application Android. Quand je lance mon application, il s'avère que proguard fonctionne deux fois. Voici les tâches après quoi proguard exécute:L'utilisation de MultiDex dans Android App exécute ProGuard deux fois et seulement une deuxième fois avec des avertissements/notes?
:app:transformClassesAndResourcesWithProguardForRelease
ProGuard, version 5.2.1
...
Initializing...
Shrinking...
Obfuscating...
Writing output...
et plus tard:
:app:transformClassesWithMultidexlistForRelease
ProGuard, version 5.2.1
fichier Voici mon application build.gradle
:
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'io.fabric.tools:gradle:1.20.1'
}
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'com.google.gms.google-services'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "de.majestella"
minSdkVersion 16
targetSdkVersion 22
versionCode 3
versionName "1.0.1"
// Enabling multidex support.
multiDexEnabled true
}
dexOptions {
incremental true
javaMaxHeapSize "2g"
}
buildTypes {
debug {
debuggable true
// ProGuard
minifyEnabled false
}
release {
signingConfig signingConfigs.release
debuggable false
// ProGuard
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro', 'proguard-guava.pro', 'proguard-square-picasso.pro',
'proguard-crashlytics.pro', 'proguard-google-analytics.pro'
}
}
}
repositories {
mavenCentral()
maven {
name = "sonatype"
url = "https://oss.sonatype.org/content/repositories/snapshots/"
}
maven {
name = "sonatypeGoogle"
url = "https://oss.sonatype.org/content/repositories/google-snapshots/"
}
flatDir {
dirs 'libs'
}
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile('com.crashlytics.sdk.android:crashlytics:[email protected]') {
transitive = true;
}
compile 'com.android.support:multidex:1.0.1'
compile 'com.google.android.gms:play-services-analytics:8.1.0'
compile "com.google.android.gms:play-services:8.1.0"
}
Après la première manche PROGUARD (après: app: transformClassesAndResourcesWithProguardForRelease) Je reçois les avertissements suivants après writing output
, donc proguard fonctionne très bien ici avec mes règles:
Warning: can't write resource [fabric/com.crashlytics.sdk.android.answers.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.answers.properties])
Warning: can't write resource [fabric/com.crashlytics.sdk.android.beta.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.beta.properties])
Warning: can't write resource [fabric/com.crashlytics.sdk.android.crashlytics-core.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.crashlytics-core.properties])
Warning: can't write resource [fabric/com.crashlytics.sdk.android.crashlytics.properties] (Duplicate zip entry [fabric/com.crashlytics.sdk.android.crashlytics.properties])
Warning: can't write resource [fabric/io.fabric.sdk.android.fabric.properties] (Duplicate zip entry [fabric/io.fabric.sdk.android.fabric.properties])
Lorsque la deuxième manche PROGUARD a lieu après :app:transformClassesWithMultidexlistForRelease
je reçois le texte suivant:
Note: android.support.design.widget.CoordinatorLayout calls 'Class.getAnnotation'
Note: com.google.ads.mediation.MediationServerParameters calls 'Field.getAnnotation'
Note: com.google.common.eventbus.AnnotatedSubscriberFinder calls 'Method.getAnnotation'
Note: com.google.common.reflect.Invokable$MethodInvokable calls 'Method.getParameterAnnotations'
Note: d.a.a.a.c calls 'Class.getAnnotation'
Note: d.a.a.a.i calls 'Class.getAnnotation'
Note: android.support.v4.app.ak calls 'Field.getType'
Note: com.google.android.gms.internal.zzsf calls 'Field.getType'
...
Ceci est étrange parce que dans la première manche PROGUARD je reçois pas d'avertissement/notes comme celui-ci à cause de mes règles.
Voici mes règles ProGuard:
-keep class com.google.common.io.Resources {
public static <methods>;
}
-keep class com.google.common.collect.Lists {
public static ** reverse(**);
}
-keep class com.google.common.base.Charsets {
public static <fields>;
}
-keep class com.google.common.collect.MapMakerInternalMap$ReferenceEntry
-keep class com.google.common.cache.LocalCache$ReferenceEntry
-dontwarn sun.misc.Unsafe
-dontwarn com.google.common.collect.MinMaxPriorityQueue
-keepattributes SourceFile,LineNumberTable,*Annotation*
-keep class com.crashlytics.android.**
-dontwarn com.squareup.okhttp.**
-dontnote org.apache.http.conn.**
-dontnote org.apache.http.params.**
-dontnote android.net.http.**
-dontnote **ILicensingService
-dontnote com.android.vending.billing.IInAppBillingService
-dontwarn com.google.auto.factory.**
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
-dontnote android.support.**
-dontnote com.google.common.util.concurrent.**
-dontnote com.squareup.okhttp.**
-keep class org.jsoup.** { *; }
-keeppackagenames org.jsoup.nodes
-keep class com.google.common.cache.Striped64 { *; }
-keep class com.google.common.** { *; }
-keep class com.daimajia.slider.** { *; }
-dontnote org.jsoup.**
-dontnote com.google.common.**
-keep class com.squareup.picasso.** { *; }
-keep class com.google.android.gms.** { *; }
-keep class com.google.ads.** { *; }
-keep class com.lorentzos.** { *; }
-keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**
-dontnote com.google.android.gms.maps.internal.CreatorImpl
-keep class com.mikepenz.iconics.** { *; }
Il me semble que la deuxième manche ProGuard n'utilise pas mes règles ProGuard.
Edit: Voici le résultat de gradlew -q tasks --all
: https://gist.github.com/confile/2a15d80980214656f4f1
Pourquoi la deuxième manche de Proguard soulève des erreurs et comment puis-je les résoudre?
Je ne vois aucune erreur de ProGuard dans votre question, seulement des "notes". – m0skit0
Oui, je veux dire des notes. – confile
Essayez d'exécuter 'gradlew -q tasks --all' pour savoir d'où ça vient. Il listera toutes les tâches avec leurs dépendances. (Il peut être utile d'écrire la sortie dans un fichier, pour faciliter la recherche.) – kevinpelgrims