8

我在我的项目中使用 Google Analytics V2 库。

当我从 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到配置,那么我得到

    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)

有什么提示吗?

4

3 回答 3

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.**

这也跳过了混淆,但这对于外部库来说应该不是问题。

于 2012-11-06T12:03:32.413 回答
5

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

意外错误表明 V4 支持类 AccessibilityDelegateCompatIcs$1 扩展了 Android 类 View$AccessibilityDelegate,该类在您为构建指定的目标平台(android-13 或更早版本)上不存在。在这种情况下,ProGuard 确实需要该类来正确处理代码。如果类层次结构不完整,输出将是一团糟。

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

于 2012-11-07T17:33:40.737 回答
0

我遇到了同样的问题——在为发布创建 ank 时我能够抑制错误——但是当它落入应用程序时,在那些发誓混淆器的类所在的地方。目前我还没有解决这个问题。有趣的是,在通过 Eclipse 运行应用程序时处于 debage 模式 - 它运行良好。

于 2013-05-10T09:31:29.137 回答