2012-10-31 48 views
8

我使用谷歌分析V2库在我的项目。GoogleAnalyticsV2和Proguard的

当我出口从Eclipse的签名的应用程序包我获得控制台输出如下:

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) 

这里是我的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.** 

如果我添加-dontwarn com.google.analytics.tracking.android.FutureApis到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) 

任何提示?

+0

我注意到你没有指定-libraryjars? –

+0

@SherifelKhatib我试图-libraryjars ./libs/{lib_name} –

+0

我不知道,如果你有在Android的工具的新版本中引入的默认proguard的选项。建议:在你的SDK管理器中更新你的android工具,并更新你的adt插件。创建一个新项目并将所有资源移至新项目。你将会有一个文件proguard-project.txt。添加到-dontwarn语句。 –

回答

18

我也面临这个问题。至于还有的GA文档中没有官方的解决办法呢,我做了这套规则:

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

此跳过混淆为好,但不应该是一个外部libary一个问题..

+0

这个答案并不能解决提问者的问题,因为缺少的符号在GAv2 jar中引用,没有在其中定义。但是,它是GAv2的正确ProGuard定义,并且可以防止其他遗漏的符号错误。 –

+0

我收回它。 -twtwarn选项可能会在构建时隐藏缺少的符号错误(例如忘记导出jar),这在运行时仍会导致错误。 –

5

的初始警告表明FutureApis调用File#setReadable(boolean,boolean),它在您为构建指定的目标平台上(显然是android-8或更早版本)不存在。 ProGuard可以忽略它,但如果这些代码是在那些较旧的平台上执行的,那么它会成为一个问题。 Google Analytics的文档指出,android-7已经足够了,所以大概忽略它是没有问题的。

意想不到的错误指示V4支持类AccessibilityDelegateCompatIcs $ 1扩展的Android类查看$ AccessibilityDelegate,这不,你已经为你的版本(Android的13岁以上)指定的目标平台上的存在。在这种情况下,ProGuard确实需要该类来正确处理代码。由于类层次结构不完整,输出结果会很糟糕。

您可以通过编辑你的发行版时project.properties指定一个更近的构建目标解决这两个问题。缺少的类和方法将出现在相应的android.jar中,因此ProGuard将获得所需的所有信息。由于这些类只是运行时库类,用于编译/优化/混淆处理,它们不会影响输出。

0

我遇到了同样的问题 - 我可以在创建发布版本时抑制错误 - 但是当应用程序崩溃时,在那些发出混淆的类的地方。目前我还没有解决这个问题。有趣的是,在debage模式下通过Eclipse运行应用程序时 - 它完美地工作。