8

プロジェクトで Google アナリティクス 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 アナリティクスのドキュメントでは、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 を介してアプリケーションを実行するときのデバッグ モードであり、完全に動作することです。

于 2013-05-10T09:31:29.137 に答える