Proguard 损坏可绘制文件
Proguard corrupts drawable files
我对 proguard 有一个奇怪的问题,它以某种方式破坏了我的有效可绘制文件。没有 proguard drawable 显示正常。 Proguard 是否应该缩小 xml 个可绘制对象?
drawable/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</item>
</style>.
wide_btn_round_white.xml
会坏掉的。但是,如果我直接在按钮上指定背景,一切都会正常。根据 wiki 我可以创建 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" />
但这东西不行。据我了解,它仅指定不应删除此文件。
非常感谢任何帮助!
此致,
一般来说,Proguard 不适用于 xml 文件,仅适用于 Java。所以我认为你的构建是如何破坏你的文件的。也许打开一个新项目并复制你的源代码和 .git 文件(如果你有的话)会有所帮助
另一件事可能是 Android shrink resources, so try setting shrinkResources to false and see if it helps. If it does, use tools:keep 让有问题的资源远离 shrinker。
<?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" />
我对 proguard 有一个奇怪的问题,它以某种方式破坏了我的有效可绘制文件。没有 proguard drawable 显示正常。 Proguard 是否应该缩小 xml 个可绘制对象?
drawable/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</item>
</style>.
wide_btn_round_white.xml
会坏掉的。但是,如果我直接在按钮上指定背景,一切都会正常。根据 wiki 我可以创建 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" />
但这东西不行。据我了解,它仅指定不应删除此文件。
非常感谢任何帮助!
此致,
一般来说,Proguard 不适用于 xml 文件,仅适用于 Java。所以我认为你的构建是如何破坏你的文件的。也许打开一个新项目并复制你的源代码和 .git 文件(如果你有的话)会有所帮助
另一件事可能是 Android shrink resources, so try setting shrinkResources to false and see if it helps. If it does, use tools:keep 让有问题的资源远离 shrinker。
<?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" />