Proguard导致Google Play服务中的ActivityRecognitionResult getMostProbableActivity崩溃

4
我最近发布了一款应用到Play商店,虽然没有使用proguard时它能够完美运行,但当我决定使用它时却遇到了意外的崩溃。
我在这里查找了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();
...

有人能帮忙添加一个规则吗?我不想完全禁用它,但这确实可以解决问题。


随着谷歌宣布在Google Play上上传的任何APK现在都会在APK本身上运行Proguard,因此现在无需在外部使用Proguard。 - Biraj Zalavadia
文件大小似乎有非常明显的差异,使用Proguard为800kb,而不使用则为1.2mb。 - Anton Wolkov
也许我漏掉了什么,但是他们真的可以在我签署代码之前完成吗? - Anton Wolkov
与https://dev59.com/AWQo5IYBdhLWcg3wDbwJ 相同的问题,但那里没有答案。 - Anton Wolkov
@BirajZalavadia,我在谷歌上搜索了你说的信息,但是没有找到你提到的新闻链接。你能否请给我一个链接,让我看看Google将在apk本身上运行proguard的消息? - Mahmud Ahsan
2个回答

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

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

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

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


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应该比这更好,但我最终按照上述方法解决了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接