如何防止剥离数组

时间:2017-02-19 20:21:37

标签: android-proguard

我在布局文件中实现了gooeymenu:

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

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>

在调试器中运行时,一切正常,但从剥离的生产版本运行时,gooeymenu不会显示任何项目。

我尝试向proguard-rules.pro添加几个命令,包括以下内容:

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

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

但到目前为止没有任何运气。所以我的问题是:

  • 如何验证字段是否真的被剥离了 生产apk或如何确定是否包含一个字段(或更常见的类/方法)?
  • 如何命令proguard添加字段?

1 个答案:

答案 0 :(得分:0)

问题是我使用ObjectAnimator通过名称引用方法来更改对象的属性:

'ObjectAnimator animShowAlpha = ObjectAnimator.ofFloat(circlePoint,“Alpha”,0.0f,1.0f);'

然而,

proguard会破坏对象的名称,因此方法CirclePoint.setAlpha(..)被重命名为a(..)。因此,解决方案是向proguard添加一行以防止重命名类CirclePoint的方法:

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

就是这样。

顺便说一句。要查看proguard是否重命名方法,文件' app / build / outputs / mapping / release / mapping.txt '是非常有用的(并且不言自明)。