4

最近、アプリをプレイ ストアにリリースしました。プロガードがなくても問題なく動作しますが、使用することにしたときに予期しないクラッシュが発生しました。

Google Play サービスで推奨されるプロガード ルールについては、こちらを参照してください。また、この場合に別の行を追加してみました。これが私が得たものです(3行目は私のアプリ用です):

-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();
...

追加するルールを手伝ってくれる人はいますか? すべてを無効にしたくはありませんが、問題は解決します。

4

2 に答える 2

1

この問題は私を狂わせました。Proguard は、明示的にインポートされていない内部クラスを削除しています。さらに悪いことに、この問題は (Proguard を使用した後) 私には存在しませんでしたが、コードを少し変更した後、ある日突然現れました。

この問題を修正するために、一連の Proguard フラグを追加しました。最後に、どちらがトリックを行ったのかわかりません。

必ず次の 3 つを追加してください。

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

あなたも試すことができます:

-dontshrink
-dontoptimize

頂点で

正直なところ、これは依存関係ウォーカー タイプの問題であり、Proguard はこれよりも優れているはずですが、最終的に上記のように修正しました。

于 2013-09-13T10:21:37.097 に答える