2012-10-31 5 views
8

Ich verwende die Google Analytics V2-Bibliothek in meinem Projekt.GoogleAnalyticsV2 und Proguard

Wenn ich Anwendungspaket von Eclipse-signierten exportiere ich in Console folgende Ausgabe:

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) 

Hier ist mein 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.** 

Wenn ich -dontwarn com.google.analytics.tracking.android.FutureApis hinzufügen dann bekomme ich config

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) 

Irgendwelche Hinweise?

+0

Ich bemerkte, dass Sie -libraryjars nicht angegeben haben? –

+0

@SherifelKhatib Ich habe versucht -libraryjars ./libs/{lib_name} –

+0

Ich bin mir nicht sicher, ob Sie die Standard-Programmoptionen in neuen Versionen der Android-Tools eingeführt haben. Hinweis: Aktualisieren Sie Ihre Android-Tools in Ihrem SDK-Manager, und aktualisieren Sie Ihr ADT-Plugin. Erstellen Sie ein neues Projekt und verschieben Sie alle Ihre Ressourcen in das neue Projekt. Sie werden eine Datei proguard-project.txt haben. Fügen Sie die -dontwarn-Anweisung hinzu. –

Antwort

18

Ich habe auch dieses Problem konfrontiert. Da es in der GA-Dokumentation keine offizielle Lösung ist noch, habe ich diesen Satz von Regeln auf:

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

Diese Verschleierungs auch überspringt, aber das sollte kein Problem für einen externen libary sein ..

+0

Diese Antwort löst das Problem des Fragestellers nicht, da auf das fehlende Symbol im Jargon GAv2 verwiesen wird, das darin nicht definiert ist. JEDOCH ist es die korrekte ProGuard-Definition für GAv2 und verhindert andere fehlende Symbolfehler. –

+0

Ich nehme das zurück. Die -dontwarn-Optionen können fehlende Symbolfehler (wie zum Beispiel das Vergessen, ein JAR zu exportieren, wie ich es tat) zum Zeitpunkt der Erstellung ausblenden, was zur Laufzeit noch Fehler verursacht. –

5

Der Die erste Warnung zeigt an, dass FutureApis die Datei # setReadable (boolean, boolean) aufruft, die nicht auf der Zielplattform existiert, die Sie für Ihren Build angegeben haben (anscheinend android-8 oder älter). ProGuard kann es ignorieren, aber es wird ein Problem sein, wenn dieser Code jemals auf diesen älteren Plattformen ausgeführt wird. Die Dokumentation von Google Analytics gibt an, dass Android-7 ausreichend ist, daher ist es vermutlich in Ordnung, es zu ignorieren.

Der unerwartete Fehler zeigt an, dass die V4-Unterstützungsklasse AccessibilityDelegateCompatIcs $ 1 die Android-Klasse View $ AccessibilityDelegate erweitert, die nicht auf der Zielplattform existiert, die Sie für Ihren Build angegeben haben (android-13 oder älter). In diesem Fall benötigt ProGuard diese Klasse, um den Code ordnungsgemäß zu verarbeiten. Bei einer unvollständigen Klassenhierarchie wäre die Ausgabe ein Chaos.

Sie können beide Probleme lösen, indem Sie beim Kompilieren der Release-Version ein neueres Build-Ziel in project.properties angeben. Die fehlenden Klassen und Methoden sind in der entsprechenden android.jar enthalten, so dass ProGuard alle benötigten Informationen zur Verfügung hat. Da es sich bei diesen Klassen lediglich um Klassen der Laufzeitbibliothek handelt, die für die Kompilierung/Optimierung/Verschleierung verwendet werden, haben sie keine Auswirkungen auf die Ausgabe.

0

Ich lief das gleiche Problem - ich konnte Fehler unterdrücken, wenn Ank für die Freigabe erstellen - aber wenn die Anwendung es fällt, an den Orten, wo die Klassen, die obfuscator fluchen. Im Moment habe ich dieses Problem nicht gelöst. Was ist interessant, dass im Debame-Modus beim Ausführen der Anwendung über Eclipse - und es funktioniert perfekt.