2012-10-31 35 views
8

Tôi sử dụng thư viện Google Analytics V2 trong dự án của mình.GoogleAnalyticsV2 và Proguard

Khi tôi xuất khẩu ký gói ứng dụng từ Eclipse tôi nhận được sau đầu ra trong Console:

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) 

Dưới đây là proguard.cfg tôi

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

Nếu tôi thêm -dontwarn com.google.analytics.tracking.android.FutureApis để cấu hình sau đó tôi nhận được

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) 

Bất kỳ gợi ý nào?

+0

Tôi nhận thấy bạn không chỉ định -libraryjars? –

+0

@SherifelKhatib Tôi đã thử -libraryjars ./libs/{lib_name} –

+0

Tôi không chắc chắn nếu bạn có các tùy chọn proguard mặc định được giới thiệu trong phiên bản mới của các công cụ Android. Lời khuyên: cập nhật công cụ Android của bạn trong trình quản lý sdk và cập nhật plugin adt của bạn. Tạo một dự án mới và chuyển tất cả các tài nguyên của bạn sang dự án mới. Bạn sẽ có một tập tin proguard-project.txt. Thêm vào đó câu lệnh -dontwarn. –

Trả lời

18

Tôi cũng đã gặp sự cố này. Như không có giải pháp chính thức trong tài liệu GA nêu ra, tôi tạo thành này tập hợp các quy tắc:

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

này bỏ qua obfuscation là tốt, nhưng điều đó không phải là một vấn đề đối với một THƯ VIỆN bên ngoài ..

+0

Câu trả lời này không giải quyết được vấn đề của người hỏi vì biểu tượng bị thiếu được tham chiếu trong bình GAv2, không được xác định trong nó. BAO GIỜ, đó là định nghĩa ProGuard chính xác cho GAv2 và sẽ ngăn chặn các lỗi biểu tượng bị thiếu khác. –

+0

Tôi lấy lại. Tùy chọn -dontwarn có thể ẩn các lỗi biểu tượng bị thiếu (chẳng hạn như quên xuất một lọ, như tôi đã làm) tại thời gian xây dựng, điều này sẽ vẫn gây ra lỗi trong thời gian chạy. –

5

Các cảnh báo ban đầu chỉ ra rằng FutureApis gọi File # setReadable (boolean, boolean), không tồn tại trên nền tảng đích mà bạn đã chỉ định cho build của bạn (rõ ràng là android-8 hoặc cũ hơn). ProGuard có thể bỏ qua nó, nhưng nó sẽ là một vấn đề nếu mã đó đã từng được thực hiện trên những nền tảng cũ hơn. Tài liệu của Google Analytics chỉ định rằng android-7 là đủ, vì vậy có lẽ bỏ qua nó là tốt.

Lỗi không mong muốn chỉ ra rằng lớp hỗ trợ V4 AccessibilityDelegateCompatIcs $ 1 mở rộng lớp Android Xem $ AccessibilityDelegate, không tồn tại trên nền tảng đích mà bạn đã chỉ định cho bản dựng của mình (android-13 trở lên). Trong trường hợp này, ProGuard thực sự cần lớp đó để xử lý đúng mã. Với một hệ thống phân cấp lớp không đầy đủ, đầu ra sẽ là một mớ hỗn độn.

Bạn có thể giải quyết cả hai vấn đề bằng cách chỉ định mục tiêu xây dựng gần đây hơn trong project.properties khi biên dịch phiên bản phát hành của bạn. Các lớp và phương thức còn thiếu sẽ có mặt trong android.jar tương ứng, vì vậy ProGuard sẽ có tất cả thông tin cần thiết. Vì các lớp này chỉ là các lớp thư viện thời gian chạy, được sử dụng để biên dịch/tối ưu hóa/obfuscation, chúng sẽ không ảnh hưởng đến đầu ra.

0

Tôi đã gặp phải vấn đề tương tự - tôi có thể chặn lỗi khi tạo vòng chân cho bản phát hành - nhưng khi ứng dụng bị rơi, ở những nơi mà các lớp học chửi thề kẻ quấy rối. Hiện tại tôi chưa giải quyết được vấn đề này. Điều thú vị là ở chế độ debage khi chạy ứng dụng thông qua Eclipse - và nó hoạt động hoàn hảo.