2012-10-31 2 views
8

J'utilise la bibliothèque Google Analytics V2 dans mon projet.GoogleAnalyticsV2 et Proguard

Quand je l'exportation signé dossier de demande d'Eclipse je suis sortie suivante dans la console:

Proguard returned with error code 1. See console 
    Warning: com.google.analytics.tracking.android.FutureApis: can't find referenced method 'boolean setReadable(boolean,boolean)' in class java.io.File 
    Warning: com.google.analytics.tracking.android.FutureApis: can't find referenced method 'boolean setWritable(boolean,boolean)' in class java.io.File 
     You should check if you need to specify additional program jars. 
    Warning: there were 2 unresolved references to program class members. 
      Your input classes appear to be inconsistent. 
      You may need to recompile them and try again. 
      Alternatively, you may have to specify the option 
      '-dontskipnonpubliclibraryclassmembers'. 
    java.io.IOException: Please correct the above warnings first. 
    at proguard.Initializer.execute(Initializer.java:321) 
    at proguard.ProGuard.initialize(ProGuard.java:211) 
    at proguard.ProGuard.execute(ProGuard.java:86) 
    at proguard.ProGuard.main(ProGuard.java:492) 

Voici mon proguard.cfg

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-dontwarn android.support.** 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 
-keep public class com.android.vending.licensing.ILicensingService 
-keep public class * extends android.support.v4.app.Fragment 
-keep public class * extends android.app.Fragment 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
} 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keep class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator *; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

-keep class com.flurry.** { *; } 
-dontwarn com.flurry.** 

Si j'ajoute -dontwarn com.google.analytics.tracking.android.FutureApis config je reçois

at proguard.ProGuard.main(ProGuard.java:492) 
    Proguard returned with error code 1. See console 
     You should check if you need to specify additional program jars. 
    Unexpected error while evaluating instruction: 
    Class  = [android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl] 
    Method  = [newAccessiblityDelegateBridge(Landroid/support/v4/view/AccessibilityDelegateCompat;)Ljava/lang/Object;] 
    Instruction = [18] areturn 
    Exception = [java.lang.IllegalArgumentException] (Can't find any super classes of [android/support/v4/view/AccessibilityDelegateCompatIcs$1] (not even immediate super class [android/view/View$AccessibilityDelegate])) 
    Unexpected error while performing partial evaluation: 
    Class  = [android/support/v4/view/AccessibilityDelegateCompat$AccessibilityDelegateJellyBeanImpl] 
    Method  = [newAccessiblityDelegateBridge(Landroid/support/v4/view/AccessibilityDelegateCompat;)Ljava/lang/Object;] 
    Exception = [java.lang.IllegalArgumentException] (Can't find any super classes of [android/support/v4/view/AccessibilityDelegateCompatIcs$1] (not even immediate super class [android/view/View$AccessibilityDelegate])) 
    java.lang.IllegalArgumentException: Can't find any super classes of [android/support/v4/view/AccessibilityDelegateCompatIcs$1] (not even immediate super class [android/view/View$AccessibilityDelegate]) 
    at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:287) 
    at proguard.evaluation.value.IdentifiedReferenceValue.generalize(IdentifiedReferenceValue.java:65) 
    at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:481) 
    at proguard.optimize.info.MethodOptimizationInfo.generalizeReturnValue(MethodOptimizationInfo.java:247) 
    at proguard.optimize.evaluation.StoringInvocationUnit.generalizeMethodReturnValue(StoringInvocationUnit.java:195) 
    at proguard.optimize.evaluation.StoringInvocationUnit.setMethodReturnValue(StoringInvocationUnit.java:126) 
    at proguard.evaluation.BasicInvocationUnit.exitMethod(BasicInvocationUnit.java:134) 
    at proguard.evaluation.Processor.visitSimpleInstruction(Processor.java:514) 
    at proguard.classfile.instruction.SimpleInstruction.accept(SimpleInstruction.java:218) 
    at proguard.optimize.evaluation.PartialEvaluator.evaluateSingleInstructionBlock(PartialEvaluator.java:753) 
    at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:587) 
    at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlockAndExceptionHandlers(PartialEvaluator.java:560) 
    at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute0(PartialEvaluator.java:264) 
    at proguard.optimize.evaluation.PartialEvaluator.visitCodeAttribute(PartialEvaluator.java:181) 
    at proguard.classfile.attribute.CodeAttribute.accept(CodeAttribute.java:101) 
    at proguard.classfile.ProgramMethod.attributesAccept(ProgramMethod.java:79) 
    at proguard.classfile.attribute.visitor.AllAttributeVisitor.visitProgramMember(AllAttributeVisitor.java:95) 
    at proguard.classfile.util.SimplifiedVisitor.visitProgramMethod(SimplifiedVisitor.java:91) 
    at proguard.classfile.ProgramMethod.accept(ProgramMethod.java:71) 
    at proguard.classfile.ProgramClass.methodsAccept(ProgramClass.java:504) 
    at proguard.classfile.visitor.AllMethodVisitor.visitProgramClass(AllMethodVisitor.java:47) 
    at proguard.classfile.ProgramClass.accept(ProgramClass.java:346) 
    at proguard.classfile.ClassPool.classesAccept(ClassPool.java:116) 
    at proguard.optimize.Optimizer.execute(Optimizer.java:372) 
    at proguard.ProGuard.optimize(ProGuard.java:306) 
    at proguard.ProGuard.execute(ProGuard.java:115) 
    at proguard.ProGuard.main(ProGuard.java:492) 

Des indices?

+0

J'ai remarqué que vous n'avez pas spécifié -libraryjars? –

+0

@SherifelKhatib J'ai essayé -libraryjars ./libs/{lib_name} –

+0

Je ne suis pas sûr si vous avez les options proguard par défaut introduites dans les nouvelles versions des outils android. Conseil: mettez à jour vos outils android dans votre gestionnaire sdk, et mettez à jour votre plugin adt. Créez un nouveau projet et déplacez toutes vos ressources vers le nouveau projet. Vous aurez un fichier proguard-project.txt. Ajoutez-y l'instruction -dontwarn. –

Répondre

18

J'ai également fait face à ce problème. Comme il n'y a pas de solution officielle dans la documentation GA encore, je compose cet ensemble de règles:

-keep class com.google.android.gms.analytics.** 
-keep class com.google.analytics.tracking.** 
-dontwarn com.google.android.gms.analytics.** 
-dontwarn com.google.analytics.tracking.** 

Cette saute obscurcissement aussi bien, mais cela ne devrait pas être un problème pour un libary externe ..

+0

Cette réponse ne résout pas le problème du demandeur car le symbole manquant est référencé dans le fichier GAv2, non défini dans celui-ci. CEPENDANT, c'est la définition ProGuard correcte pour GAv2, et empêchera d'autres erreurs de symbole manquantes. –

+0

Je le reprends. Les options -dontwarn peuvent masquer les erreurs de symboles manquantes (comme l'oubli d'exporter un fichier jar, comme je l'ai fait) au moment de la construction, ce qui provoquera toujours des erreurs lors de l'exécution. –

5

Le L'avertissement initial indique que FutureApis appelle File # setReadable (boolean, boolean), qui n'existe pas sur la plateforme cible que vous avez spécifiée pour votre build (apparemment android-8 ou plus ancien). ProGuard peut l'ignorer, mais ce sera un problème si ce code est exécuté sur ces anciennes plates-formes. La documentation de Google Analytics spécifie que Android-7 est suffisant, donc probablement ignorer c'est bien. L'erreur inattendue indique que la classe de support V4 AccessibilityDelegateCompatIcs $ 1 étend la classe Android View $ AccessibilityDelegate, qui n'existe pas sur la plateforme cible que vous avez spécifiée pour votre build (android-13 ou plus ancien). Dans ce cas, ProGuard a vraiment besoin de cette classe pour traiter correctement le code. Avec une hiérarchie de classe incomplète, la sortie serait un désordre.

Vous pouvez résoudre les deux problèmes en spécifiant une cible de génération plus récente dans project.properties lors de la compilation de votre version. Les classes et méthodes manquantes seront présentes dans le fichier android.jar correspondant, ainsi ProGuard aura toutes les informations dont il a besoin. Comme ces classes ne sont que des classes de bibliothèques d'exécution, utilisées pour la compilation/l'optimisation/l'obfuscation, elles n'affectent pas la sortie.

0

Je suis tombé sur le même problème - je pouvais supprimer les erreurs lors de la création d'ank pour la libération - mais quand l'application tombe, dans les endroits où l'obfuscator jure. Pour le moment, je n'ai pas résolu ce problème. Ce qui est intéressant, c'est en mode débogage lors de l'exécution de l'application via Eclipse - et cela fonctionne parfaitement.