proguard导致谷歌播放服务'ActivityRecognitionResult getMostProbableActivity崩溃

时间:2013-09-04 09:32:59

标签: android proguard google-play-services

我最近向Play商店发布了一个应用程序,虽然没有proguard它可以正常运行,但是当我决定使用它时,我遇到了意外的崩溃。

我看了here了解Google Play服务推荐的proguard规则,我也试过为这种情况添加另一行。这是我得到的(第三行是我的应用程序):

-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}
-keep class * implements com.google.android.gms.internal.ae
-keep class * extends il.co.kix.minitasker.EntityBase

这是执行追溯后的崩溃报告

android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class com.google.android.gms.location.ActivityRecognitionResult
at android.os.Parcel.readParcelable(Parcel.java:2086)
at android.os.Parcel.readValue(Parcel.java:1965)
at android.os.Parcel.readMapInternal(Parcel.java:2226)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.containsKey(Bundle.java:271)
at android.content.Intent.hasExtra(Intent.java:4116)
at com.google.android.gms.location.ActivityRecognitionResult.boolean hasResult(android.content.Intent)(Unknown Source)
                                                             com.google.android.gms.location.DetectedActivity getMostProbableActivity()
at il.co.kix.minitasker.ActivityRecognitionIntentService.void onHandleIntent(android.content.Intent)(Unknown Source)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.os.HandlerThread.run(HandlerThread.java:60)

令人讨厌的代码行可能是:

...
   @Override
    protected void onHandleIntent(Intent intent) {
        if (ActivityRecognitionResult.hasResult(intent)) {
            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            DetectedActivity mostProbableActivity = result.getMostProbableActivity();
...

任何人都可以帮助添加规则吗?我不想一起禁用它,但确实解决了这个问题。

2 个答案:

答案 0 :(得分:13)

Android运行时通过反射访问这些CREATOR字段,这通常无法使用静态分析进行检测。因此,您需要告诉ProGuard保留它们:

-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

这似乎不是android-sdk/tools/proguard/proguard-android.txt中的标准设置,但它可能应该是。

答案 1 :(得分:1)

这个问题让我疯狂。 Proguard正在剥离未明确导入的内部类。更糟糕的是,这个问题对我来说并不存在(使用Proguard之后),然后在一些代码更改后突然出现了一天。

我添加了一大堆Proguard标志来解决这个问题。最后,我不确定是哪一个做了这个伎俩:

绝对添加以下三项:

-keep class android.os.Parcelable.Creator
-keep class com.google.android.gms.location.ActivityRecognitionResult
-keep class com.google.android.gms.** {*;}

您也可以尝试:

-dontshrink
-dontoptimize

在顶部

老实说,这是一个依赖者 - 步行者类型的问题,而Proguard应该比这更好,但我最终确定如上所述。