2017-01-26 63 views
1

我有一個奇怪的問題與proguard,不知何故它打破了我有效的可繪製文件。沒有proguard drawable顯示ok。 proguard應該縮小xml drawables嗎?Proguard腐敗的可繪製文件

抽拉/ 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中指定的所有可繪製對象。 因此,舉例來說,如果我有一個按鈕,具有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

一般來說,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" /> 
+0

Ty,問題出在'shrinkResources'上,它混淆了所有隻在'style.xml'中指定的drawables。所以我有一個'style =「@ style/MyStyle」'和styles.xml:'''的按鈕。如果我將指定'背景'的位置從樣式直接移至組件屬性,則它可以正常工作。但是我有很多在'styles.xml'中指定的drawable。任何方式我可以解決這個問題,而不是手動列出'tools:keep'中的所有文件? – deathangel908

+0

我也嘗試使用以下內容創建文件'app/src/main/res/values/keep.xml':<?xml version =「1.0」encoding =「utf-8」?> '。該文件無論如何都會被損壞。 – deathangel908