2017-02-19 11 views
0

я реализовал gooeymenu в файле макета:как Proguard предотвратить зачистки массива

<com.mschwartz.dailyflightbuddy.ui.GooeyMenu 
    android:id="@+id/gooeymenu" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentRight="true" 
    android:layout_below="@id/btn_text_cockpit" 
    android:layout_centerInParent="true" 
    android:alpha="0.8" 
    app:center_drawable="@drawable/ic_settings_white_48dp" 
    app:hide_on_start="true" 
    app:itemorientation="LEFT" 
    app:menu_reference="@array/gooeymenu_command_array" /> 

The menu_reference тег указывает на файл res/values/array.xml со следующим содержанием:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

<array name="gooeymenu_command_array"> 

    <item>@drawable/gooey_info_item</item> 
    <item>@drawable/gooey_zoom_item</item> 
    <item>@drawable/gooey_center_item</item> 
    <item>@drawable/gooey_city_item</item> 
    <item>@drawable/gooey_airport_item</item> 
    <item>@drawable/gooey_configure_item</item> 
</array> 

</resources> 

при работе в debugger все работает нормально, но при запуске из разделенной производственной версии gooeymenu не показывает никаких элементов.

Я попытался добавить несколько команд proguard-rules.pro включая следующие:

-keepclassmembers class com.mschwartz.dailyflightbuddy.R$array { 
    *; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

но без везения до сих пор. Так что мои вопросы:

  • Как я могу проверить, если поля действительно были вырезаны из производства APK или как я могу убедиться, что если поле (или более общий класс/метод) включен?
  • Как я могу командовать proguard для добавления полей?

ответ

0

Проблема заключалась в том, что я использую ObjectAnimator который изменяет свойство объекта с помощью ссылки на метод по его имени:

«ObjectAnimator animShowAlpha = ObjectAnimator.ofFloat (circlePoint,„Альфа“, 0.0f, 1.0f);»

proguard однако управляет именами объектов, и, следовательно, метод CirclePoint.setAlpha(..) был переименован в a(..). Таким образом, решение было добавить строку в Proguard для предотвращения переименования методов класса CirclePoint:

-keep class com.mschwartz.dailyflightbuddy.ui.GooeyMenu$CirclePoint { *; }

Вот так.

кстати. Чтобы убедиться, что proguard переименовывает метод или не файл 'app/build/output/mapping/release/mapping.txt' очень помогает (и не требует пояснений).