DexGuard 和矢量绘图
DexGuard and Vector Drawables
我正在使用 DexGuard 编译我的应用程序。我的应用程序使用矢量绘图。我的所有设置都是正确的,并且在调试版本和发布版本中使用 Proguard 时都能正常工作。它仅在使用 DexGuard 时在发布版本中崩溃。所以我知道这是 DexGuard 的问题。
我正在使用 DexGuard v7.0,但由于许可证限制,我无法更新。
我已经添加了
-keepresourcefiles "res/drawable/**"
-keep class android.support.v7.** { *; }
为了测试目的和更清晰的堆栈跟踪,我的 dexguard 文件,所以我们知道这不是问题所在。
它因以下堆栈跟踪而崩溃;
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lionscribe.myapp/com.lionscribe.elist.main.MainActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020018
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
at android.app.ActivityThread.access0(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020018
at android.content.res.Resources.loadDrawable(Resources.java:3440)
at android.content.res.Resources.getDrawable(Resources.java:1917)
at o.?.?(:354)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:193)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:181)
at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(:689)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:186)
at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(:77)
at android.support.v7.app.AppCompatDelegateImplBase.<init>(:83)
at android.support.v7.app.AppCompatDelegateImplV7.<init>(:146)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(:28)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(:41)
at android.support.v7.app.AppCompatDelegate.create(:193)
at android.support.v7.app.AppCompatDelegate.create(:173)
at android.support.v7.app.AppCompatActivity.getDelegate(:511)
at android.support.v7.app.AppCompatActivity.onCreate(:71)
at o.hF.onCreate(:29)
at com.lionscribe.elist.main.MainActivity.onCreate(:121)
at android.app.Activity.performCreate(Activity.java:5451)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
at android.app.ActivityThread.access0(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:986)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:930)
at android.content.res.Resources.loadDrawable(Resources.java:3436)
at android.content.res.Resources.getDrawable(Resources.java:1917)
at o.?.?(:354)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:193)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:181)
at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(:689)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:186)
at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(:77)
at android.support.v7.app.AppCompatDelegateImplBase.<init>(:83)
at android.support.v7.app.AppCompatDelegateImplV7.<init>(:146)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(:28)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(:41)
at android.support.v7.app.AppCompatDelegate.create(:193)
at android.support.v7.app.AppCompatDelegate.create(:173)
at android.support.v7.app.AppCompatActivity.getDelegate(:511)
at android.support.v7.app.AppCompatActivity.onCreate(:71)
at o.hF.onCreate(:29)
at com.lionscribe.elist.main.MainActivity.onCreate(:121)
at android.app.Activity.performCreate(Activity.java:5451)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
at android.app.ActivityThread.access0(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
根据代码,我发现在使用 DexGuard 时,android.support.v7.widget.AppCompatDrawableManager
中的方法 loadDrawableFromDelegates
(从 getDrawable
调用)是 returning null。因此 getDrawable
继续并调用 ContextCompat.getDrawable
,它在 Lollipop 之前的设备中不支持 Vectors,并且它 returns null with an invalid drawable tag vector
log,因此导致 ResourcesNotFoundException
.
使用调试版本时,loadDrawableFromDelegates
执行 return 一个 Drawable,因此 ContextCompat.getDrawable
不会被调用,一切正常。
有谁知道如何避免这种情况。我谷歌了一下,还有其他人也有类似的问题,但他们主要是 appcompat vector 设置问题,而不是 DexGuard。
好吧,经过 12 个小时的工作,我终于弄明白了,它只是 DexGuard 配置中的 1 行。您不需要我上面提到的任何设置。你只需要
-keepresourcexmlattributenames vector/**
原因是 AppCompat 库不查找矢量的属性,如 viewportWidth
通过 id,但它使用实际的属性名称。默认情况下,Dexguard 会删除名称,因此它永远不会找到该值。通过添加以上行,您告诉 DexGuard 保留所有矢量文件的属性名称。
我希望这可以让其他人免去很多心痛。
我正在使用 DexGuard 编译我的应用程序。我的应用程序使用矢量绘图。我的所有设置都是正确的,并且在调试版本和发布版本中使用 Proguard 时都能正常工作。它仅在使用 DexGuard 时在发布版本中崩溃。所以我知道这是 DexGuard 的问题。
我正在使用 DexGuard v7.0,但由于许可证限制,我无法更新。
我已经添加了
-keepresourcefiles "res/drawable/**"
-keep class android.support.v7.** { *; }
为了测试目的和更清晰的堆栈跟踪,我的 dexguard 文件,所以我们知道这不是问题所在。
它因以下堆栈跟踪而崩溃;
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lionscribe.myapp/com.lionscribe.elist.main.MainActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020018
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
at android.app.ActivityThread.access0(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020018
at android.content.res.Resources.loadDrawable(Resources.java:3440)
at android.content.res.Resources.getDrawable(Resources.java:1917)
at o.?.?(:354)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:193)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:181)
at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(:689)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:186)
at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(:77)
at android.support.v7.app.AppCompatDelegateImplBase.<init>(:83)
at android.support.v7.app.AppCompatDelegateImplV7.<init>(:146)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(:28)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(:41)
at android.support.v7.app.AppCompatDelegate.create(:193)
at android.support.v7.app.AppCompatDelegate.create(:173)
at android.support.v7.app.AppCompatActivity.getDelegate(:511)
at android.support.v7.app.AppCompatActivity.onCreate(:71)
at o.hF.onCreate(:29)
at com.lionscribe.elist.main.MainActivity.onCreate(:121)
at android.app.Activity.performCreate(Activity.java:5451)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
at android.app.ActivityThread.access0(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:986)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:930)
at android.content.res.Resources.loadDrawable(Resources.java:3436)
at android.content.res.Resources.getDrawable(Resources.java:1917)
at o.?.?(:354)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:193)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:181)
at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(:689)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(:186)
at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(:77)
at android.support.v7.app.AppCompatDelegateImplBase.<init>(:83)
at android.support.v7.app.AppCompatDelegateImplV7.<init>(:146)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(:28)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(:41)
at android.support.v7.app.AppCompatDelegate.create(:193)
at android.support.v7.app.AppCompatDelegate.create(:173)
at android.support.v7.app.AppCompatActivity.getDelegate(:511)
at android.support.v7.app.AppCompatActivity.onCreate(:71)
at o.hF.onCreate(:29)
at com.lionscribe.elist.main.MainActivity.onCreate(:121)
at android.app.Activity.performCreate(Activity.java:5451)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471)
at android.app.ActivityThread.access0(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5602)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
根据代码,我发现在使用 DexGuard 时,android.support.v7.widget.AppCompatDrawableManager
中的方法 loadDrawableFromDelegates
(从 getDrawable
调用)是 returning null。因此 getDrawable
继续并调用 ContextCompat.getDrawable
,它在 Lollipop 之前的设备中不支持 Vectors,并且它 returns null with an invalid drawable tag vector
log,因此导致 ResourcesNotFoundException
.
使用调试版本时,loadDrawableFromDelegates
执行 return 一个 Drawable,因此 ContextCompat.getDrawable
不会被调用,一切正常。
有谁知道如何避免这种情况。我谷歌了一下,还有其他人也有类似的问题,但他们主要是 appcompat vector 设置问题,而不是 DexGuard。
好吧,经过 12 个小时的工作,我终于弄明白了,它只是 DexGuard 配置中的 1 行。您不需要我上面提到的任何设置。你只需要
-keepresourcexmlattributenames vector/**
原因是 AppCompat 库不查找矢量的属性,如 viewportWidth
通过 id,但它使用实际的属性名称。默认情况下,Dexguard 会删除名称,因此它永远不会找到该值。通过添加以上行,您告诉 DexGuard 保留所有矢量文件的属性名称。
我希望这可以让其他人免去很多心痛。