DexGuard和Vector Drawables

时间:2016-08-17 17:56:54

标签: android android-proguard android-vectordrawable dexguard

我正在使用DexGuard编译我的应用程序。我的应用程序使用矢量drawables。我有正确的所有设置,它在调试版本和我使用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.access$900(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.access$900(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.access$900(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时遵循这一点,loadDrawableFromDelegates中的方法getDrawable(从android.support.v7.widget.AppCompatDrawableManager调用)返回null。因此,getDrawable会继续并调用ContextCompat.getDrawable,它在前Lollipop设备中不支持向量,并且返回带有invalid drawable tag vector日志的null,因此会导致ResourcesNotFoundException。<登记/> 使用调试版本时,loadDrawableFromDelegates会返回Drawable,因此ContextCompat.getDrawable不会被调用,一切正常。 有没有人有任何想法如何避免这种情况。我用谷歌搜索,还有其他人有类似的问题,但他们主要是appcompat矢量设置问题,而不是DexGuard。

1 个答案:

答案 0 :(得分:3)

经过12个小时的工作,我终于弄清楚了,而且所有这一切都是DexGuard配置中的1行。您不需要我上面提到的任何设置。你需要的只是

-keepresourcexmlattributenames vector/**

原因是AppCompat库不查找向量的属性,如id viewportWidth,但它使用实际的属性名称。默认情况下,Dexguard会删除名称,因此它永远不会找到该值。通过添加上面的行,您告诉DexGuard保留所有矢量文件的属性名称 我希望这可以拯救其他人心痛。