0

我正在使用DexGuard編譯我的應用程序。我的應用程序使用矢量繪製。我的所有設置都是正確的,並且在調試版本以及使用Proguard發佈版本時都能正常工作。使用DexGuard時,它只會在發佈版本中崩潰。所以我知道這是一個DexGuard問題。 我正在使用DexGuard v7.0,由於許可限制,我無法更新。 我已將 -keepresourcefiles "res/drawable/**" -keep class android.support.v7.** { *; } 添加到我的dexguard文件中以用於測試目的和更清晰的堆棧跟蹤,因此我們知道這不是問題。 它跟隨堆棧跟蹤崩潰;DexGuard和Vector Drawables

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時,在android.support.v7.widget.AppCompatDrawableManager方法loadDrawableFromDelegates(從getDrawable調用)是返回空。因此getDrawable將繼續並調用ContextCompat.getDrawable,它不支持棒棒糖前設備中的矢量,並且它會返回空值invalid drawable tag vector日誌,因此會導致ResourcesNotFoundException
使用調試版本時,loadDrawableFromDelegates確實會返回Drawable,因此ContextCompat.getDrawable不會被調用,並且一切正常。 有沒有人有任何想法如何避免這一點。我谷歌搜索,還有其他人有類似的問題,但他們大多是appcompat矢量設置問題,而不是DexGuard。

回答

3

經過12個小時的工作,我終於弄明白了,所有這一切都是DexGuard配置中的1行。你不需要上面提到的任何設置。所有你需要的是

-keepresourcexmlattributenames vector/** 

之所以這樣,是該程序兼容性庫不找載體,像viewportWidth通過ID屬性,但它使用的實際屬性附加傷害名。默認情況下,Dexguard剝離該名稱,因此它從未找到該值。通過添加上面的行,您告訴DexGuard爲所有矢量文件保留屬性名稱。
我希望這可以節省很多人的心痛。

+0

您可以通過使用更新的DexGuard版本保存麻煩,該版本已通過默認配置支持矢量繪圖。 –

+0

我已經提到過,由於許可限制,O無法升級。我相信在同樣的情況下,DexGuard已經改變了許可模式。 – lionscribe

+0

那麼「許可證限制」有點誤導。 DexGuard已將其許可模式更改爲年度訂閱,對於某些開發人員而言,這可能有點過於昂貴,但本身沒有限制。 –