2017-02-19 1 views
0

J'ai mis en gooeymenu dans un fichier de mise en page:comment Proguard empêcher de tableau de décapage

<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" /> 

Les points de balise menu_reference à un fichier res/values/array.xml avec le contenu suivant:

<?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> 

Lors de l'exécution dans le débogueur tout fonctionne bien, mais lors de l'exécution de la version de production dépouillée gooeymenu n'affiche aucun élément.

J'ai essayé d'ajouter plusieurs commandes à proguard-rules.pro dont les suivantes:

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

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

mais sans chance jusqu'à présent. Mes questions sont les suivantes:

  • Comment puis-je vérifier si les champs ont vraiment été dépouillé de la apk de production ou comment puis-je faire que si un champ (ou une classe/méthode plus commune) est inclus?
  • Comment puis-je commander proguard pour ajouter les champs?

Répondre

0

Le problème était que j'utilise un ObjectAnimator qui change la propriété d'un objet en faisant référence à la méthode par son nom:

« ObjectAnimator animShowAlpha = ObjectAnimator.ofFloat (circlePoint, "Alpha", 0.0f, 1.0f); ' Cependant, proguard altère les noms des objets et, par conséquent, la méthode CirclePoint.setAlpha(..) a été renommée a(..). Donc, la solution était d'ajouter une ligne à Proguard pour éviter de renommer les méthodes de la classe CirclePoint:

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

Voilà.

btw. Pour voir si proguard renomme une méthode ou pas le fichier 'app/build/sorties/mapping/release/mapping.txt' est d'une grande aide (et d'auto-explicatif).