NineOldAndroids ObjectAnimators не работают с ProGuard и подписанным apk

Я использую ObjectAnimators NineOldAndroids для постепенного исчезновения в маркерах Android Map v2 с помощью следующего кода:

mMarkerSelected = mMap.addMarker(new MarkerOptions()
        .position(location.getLatLng())
        .title(location.getName())
        .snippet(location.getId())
        .icon(BitmapDescriptorFactory.defaultMarker(location.getMarkerHue())));
mMarkerSelected.setAlpha(0.0f);
ObjectAnimator.ofFloat(mMarkerSelected, "alpha", 0.0f, 1.f)
                .setDuration(300).start();

Это прекрасно работает с отладочными версиями apk.

Однако, когда я подписываю свой apk и использую ProGuard, маркер внезапно не исчезает. Я предполагаю, что атрибут alpha был запутан, так что передача "alpha" в ObjectAnimator.ofFloat не совпадает с запутанным альфа-атрибутом Marker, Как заставить работать анимацию при использовании ProGuard?

Просто для полноты, это единственное содержимое моего proguard-rules.txt

-dontwarn com.squareup.okhttp.**

2 ответа

Решение

Он использует отражение, поэтому вам нужны целые имена ваших методов, т.е. setAlpha (), что-то вроде этого в вашей конфигурации proguard:

 # This is due to ObjectAnimator using reflection to access get/sets
 -keep class com.your.package.ClassThatUsesObjectAnimator { *; }

Библиотека Nineolddroids уже открыта, поэтому запускать proguard на ней бессмысленно.

Если у вас есть выбор между обфусцированием собственного исходного файла или сторонней библиотеки с открытым исходным кодом, было бы разумно выбрать свой собственный исходный файл.

Добавьте эти строки в свой proguard-project.txt и ваше приложение будет работать нормально.

## Nineolddroid related classes to ignore

-keep class com.nineoldandroids.animation.** { *; }
-keep interface com.nineoldandroids.animation.** { *; }
-keep class com.nineoldandroids.view.** { *; }
-keep interface com.nineoldandroids.view.** { *; }
Другие вопросы по тегам