2012-10-31 17 views
8

Używam biblioteki Google Analytics V2 w moim projekcie.GoogleAnalyticsV2 i Proguard

Kiedy eksport podpisał pakiet aplikacji z Eclipse dostaję następujący komunikat w konsoli:

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) 

Oto mój 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.** 

Jeśli dodać -dontwarn com.google.analytics.tracking.android.FutureApis config potem dostać

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) 

Jakieś wskazówki?

+0

Zauważyłem, że nie podałeś -libraryjars? –

+0

@SherifelKhatib Próbowałem -libraryjars ./libs/{lib_name} –

+0

Nie jestem pewien, czy masz domyślne opcje proguard wprowadzone w nowych wersjach narzędzi Android. Porada: zaktualizuj swoje narzędzia Android w swoim menedżerze sdk i zaktualizuj wtyczkę ADT. Utwórz nowy projekt i przenieś wszystkie zasoby do nowego projektu. Będziesz mieć plik proguard-project.txt. Dodaj do tego instrukcję -dontwarn. –

Odpowiedz

18

Mam również do czynienia z tym problemem. Ponieważ nie ma oficjalnych rozwiązanie w dokumentacji GA jeszcze, wymyśliłem ten zestaw reguł:

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

ten pomija zaciemniania, jak dobrze, ale to nie powinno być problemem dla zewnętrznego libary ..

+0

Ta odpowiedź nie rozwiązuje problemu pytającego, ponieważ brakuje symbolu w słoju GAv2, który nie jest w nim zdefiniowany. JEDNAK, jest to poprawna definicja ProGuard dla GAv2 i zapobiegnie innym brakującym symbolom błędów. –

+0

Biorę to z powrotem. Opcje -dontwarn mogą ukrywać brakujące błędy symboli (takie jak zapominanie o wyeksportowaniu słoika, tak jak ja) w czasie kompilacji, co nadal będzie powodować błędy w czasie wykonywania. –

5

wstępne ostrzeżenie wskazuje, że FutureApis wywołuje File # setReadable (boolean, boolean), który nie istnieje na docelowej platformie, którą podałeś dla swojej kompilacji (podobno Android-8 lub starszy). ProGuard może to zignorować, ale będzie to problem, jeśli ten kod zostanie kiedykolwiek wykonany na starszych platformach. Dokumentacja Google Analytics określa, że ​​Android-7 jest wystarczający, więc prawdopodobnie ignorowanie go jest w porządku.

Nieoczekiwany błąd wskazuje, że V4 klasa wsparcie AccessibilityDelegateCompatIcs $ 1 rozciąga klasy Android Zobacz $ AccessibilityDelegate, który nie istnieje na platformie docelowej, które zostały określone dla swojej budowie (android-13 lub starszej). W takim przypadku ProGuard naprawdę potrzebuje tej klasy, aby poprawnie przetworzyć kod. Przy niekompletnej hierarchii klas wynik byłby bałagan.

Możesz rozwiązać oba problemy, określając bardziej aktualny cel kompilacji w pliku project.properties podczas kompilowania wersji wydania. Brakujące klasy i metody będą obecne w odpowiednim pliku android.jar, więc ProGuard będzie miał wszystkie potrzebne informacje. Ponieważ te klasy są tylko klasami biblioteki wykonawczej, używanymi do kompilacji/optymalizacji/zaciemniania, nie będą miały wpływu na wynik.

0

Wpadłem na ten sam problem - udało mi się stłumić błędy podczas tworzenia ank do wydania - ale gdy aplikacja się pojawi, w tych miejscach, gdzie klasy, do których przeklinanie obfuscator. W tej chwili nie rozwiązałem tego problemu. Co ciekawe, w trybie debagowania podczas uruchamiania aplikacji przez Eclipse - i działa idealnie.