使用Google Analytics v4和ProGuard的ConnectivityManager ClassCastException

时间:2014-11-09 04:04:46

标签: android google-analytics proguard

我在编译使用ProGuard和Google Analytics v4的应用时遇到了麻烦。一个似乎相似的其他线程是here,除了没有太多细节。

我尝试过以下无效:

  1. 执行keep com.google.** { *; }
  2. 执行-keep android.support.** { *; }个包裹。每隔一段混淆代码就会出现此错误,就像将新混淆的代码加入预先混淆的Google Analytics代码一样会导致错误。
  3. 如果遗传问题存在问题,请使用-keepattributes Signature
  4. 使用带有四个字母单词的混淆词典(例如rNqp,sSlq),以防与Android dexing有关,导致预先混淆的Google Analytics类与模糊处理的项目文件发生冲突。
  5. 以下是例外:

    11-08 22:45:01.644    2206-2226/com.example.helloworld E/GAV3﹕ Thread[GAThread,5,main]: Error on GAThread: java.lang.ClassCastException: android.net.ConnectivityManager cannot be cast to android.support.v4.d.a
                at com.google.a.a.a.at.a(Unknown Source)
                at com.google.a.a.a.am.a(Unknown Source)
                at com.google.a.a.a.s.h(Unknown Source)
                at com.google.a.a.a.s.g(Unknown Source)
                at com.google.a.a.a.s.a(Unknown Source)
                at com.google.a.a.a.u.run(Unknown Source)
                at com.google.a.a.a.ab.run(Unknown Source)
    11-08 22:45:01.644    2206-2226/com.example.helloworld E/GAV3﹕ Thread[GAThread,5,main]: Google Analytics is shutting down.
    

    Proguard配置文件(99.9%香草):

    # This is a configuration file for ProGuard.
    # http://proguard.sourceforge.net/index.html#manual/usage.html
    
    # Optimizations: If you don't want to optimize, use the
    # proguard-android.txt configuration file instead of this one, which
    # turns off the optimization flags.  Adding optimization introduces
    # certain risks, since for example not all optimizations performed by
    # ProGuard works on all versions of Dalvik.  The following flags turn
    # off various optimizations known to have issues, but the list may not
    # be complete or up to date. (The "arithmetic" optimization can be
    # used if you are only targeting Android 2.0 or later.)  Make sure you
    # test thoroughly if you go this route.
    #-optimizations !code/simplification/cast,!field/*,!class/merging/*
    #-optimizationpasses 5
    #-allowaccessmodification
    #-dontpreverify
    
    # The remainder of this file is identical to the non-optimized version
    # of the Proguard configuration file (except that the other file has
    # flags to turn off optimization).
    
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -verbose
    
    -keepattributes *Annotation*
    -keep public class com.google.vending.licensing.ILicensingService
    -keep public class com.android.vending.licensing.ILicensingService
    
    # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
    -keepclasseswithmembernames class * {
        native <methods>;
    }
    
    # keep setters in Views so that animations can still work.
    # see http://proguard.sourceforge.net/manual/examples.html#beans
    -keepclassmembers public class * extends android.view.View {
       void set*(***);
       *** get*();
    }
    
    # We want to keep methods in Activity that could be used in the XML attribute onClick
    -keepclassmembers class * extends android.app.Activity {
       public void *(android.view.View);
    }
    
    # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
    -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>;
    }
    
    # The support library contains references to newer platform versions.
    # Don't warn about those in case this app is linking against an older
    # platform version.  We know about them, and they are safe.
    -dontwarn android.support.**
    
    -keepattributes Signature
    

2 个答案:

答案 0 :(得分:0)

您似乎正在使用proguard-android-optimize.txt的副本(更常见的方法是引用Android SDK中原始的,维护的文件)。您可以尝试禁用优化:

-dontoptimize

如果确实可以避免此问题,您可以在ProGuard's bug tracker或直接向我报告此问题。

确保您使用的是最新版本的ProGuard(在撰写本文时为5.1版)和最新版本的GMS库。

(我是ProGuard的开发者)

答案 1 :(得分:0)

我找到了解决方案。它只涉及不混淆ConnectivityManager。我用过:

-keep android.net.** { *; }

工作正常。