Proguard破坏了可绘制的文件

时间:2017-01-26 18:14:09

标签: android proguard

我对proguard有一个奇怪的问题,不知怎的,它打破了我有效的可绘制文件。没有proguard drawable显示确定。是不是应该缩小xml drawables?

抽拉/ wide_btn_round_white.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle" >
            <corners android:radius="25dip" />
            <padding android:bottom="10dp"/>
            <padding android:top="10dp"/>
            <solid android:color="@color/colorOrangeGetStarted" />
        </shape>
    </item>
</selector>

变得像这样

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

的build.gradle

release {
        minifyEnabled true
        shrinkResources true
        signingConfig signingConfigs.release
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

proguard-rules.pro

-keepattributes *Annotation*
-keepattributes Signature
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
-keep class com.stripe.** { *; }
-keepclassmembers class com.myapp.services.http.** {
    <fields>;
}
-keepclassmembers class com.myapp.services.ws.** {
    <fields>;
}
-keepclassmembers class * extends java.lang.Enum {
    <fields>;
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

修改: 出现此问题的原因是shrinkResources。它会混淆仅在style.xml中指定的所有drawable。 例如,如果我有一个style="@style/MyStyle"styles.xml的按钮:

<style name="MyStyle">
    <item name="android:background">@drawable/wide_btn_round_white</it‌​em>
</style>.

wide_btn_round_white.xml会被打破。但是,如果我直接在按钮上指定背景,一切都会正常工作。根据维基,我可以创建app/src/main/res/values/keep.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/wide_btn_round_white" /> 

但这件事并不奏效。据我了解,它只指定不应删除此文件。

非常感谢任何帮助!

最好的考虑,

1 个答案:

答案 0 :(得分:1)

一般来说,Proguard不适用于xml文件,只适用于Java。所以我认为你的构建是如何破坏你的文件。也许打开一个新项目并在那里复制你的源代码和.git文件(如果有的话)将有帮助

另一件事可能是Android shrink resources,所以尝试将shrinkResources设置为false,看看是否有帮助。如果是,请使用tools:keep让您的问题资源远离收缩者。

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />