proguard вызывает сбой в сервисах Google Play ActivityRecognitionResult getMostProbableActivity

Недавно я выпустил приложение в магазин игр, и хотя оно отлично работает без proguard, у меня произошел неожиданный сбой, когда я решил его использовать.

Я просмотрел здесь рекомендуемые правила proguard для Google Play. services, я также попытался добавить еще одну строку для этого случая. Вот что у меня получилось (третья строка для моего приложения):

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

Кто-нибудь может помочь с правилом добавить? Я не хочу отключать все это вместе, но это решает проблему.


person Anton Wolkov    schedule 04.09.2013    source источник
comment
Как объявил Google, любой apk, загруженный в google paly, теперь google запускает proguard на самом apk, поэтому теперь нет необходимости использовать proguard на нашей стороне.   -  person Biraj Zalavadia    schedule 04.09.2013
comment
кажется, есть очень заметная разница в размере файла, с proguard это 800 КБ, а без - 1,2 МБ.   -  person Anton Wolkov    schedule 04.09.2013
comment
может быть, я что-то упускаю, но могут ли они действительно сделать это без моей подписи кода после этого?   -  person Anton Wolkov    schedule 04.09.2013
comment
та же проблема, что и stackoverflow.com/questions/16362726 / но там нет ответа.   -  person Anton Wolkov    schedule 04.09.2013
comment
@BirajZalavadia Я ищу в Google информацию, которую вы сказали, но я не получаю никакой ссылки на новости, которые вы рассказали. Не могли бы вы дать мне ссылку, где вы видите, что Google запускает proguard на самом apk?   -  person Mahmud Ahsan    schedule 26.04.2014


Ответы (2)


Среда выполнения Android обращается к этим полям CREATOR посредством отражения, которое, как правило, невозможно обнаружить с помощью статического анализа. Поэтому вам нужно сообщить ProGuard, чтобы сохранить их:

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

Это не похоже на стандартную настройку в android-sdk/tools/proguard/proguard-android.txt, но, вероятно, так и должно быть.

person Eric Lafortune    schedule 14.09.2013

Эта проблема сводила меня с ума. 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 должен быть лучше, чем это, но в конце концов я исправил ее, как указано выше.

person D2TheC    schedule 13.09.2013