【问题标题】:ConnectivityManager ClassCastException with Google Analytics v4 and ProGuardConnectivityManager ClassCastException 与 Google Analytics v4 和 ProGuard
【发布时间】:2014-11-13 10:56:26
【问题描述】:

我在编译使用 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 类与混淆的项目文件发生冲突。

这是一个例外:

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% vanilla):

# 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

【问题讨论】:

  • 您是否尝试过添加 -keep class com.google.** {*;}
  • @Devrim 是的,我有。该命令将告诉 ProGuard 不要混淆我在项目中使用的所有 Google 库。但是,问题似乎并不在于 Google 库被混淆了,而是与预先混淆的 Google Analytics 库和新混淆的代码存在某种冲突。我已经编辑了我的问题以反映这一点。

标签: android google-analytics proguard


【解决方案1】:

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

-dontoptimize

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

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

(我是ProGuard的开发者)

【讨论】:

    【解决方案2】:

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

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

    工作正常。

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2021-03-16
      相关资源
      最近更新 更多