2017-06-22 66 views
6

我一直在努力,它包含了許多矢量圖形的應用程序。最近我開始在牛軋糖上進行測試,發現它立即崩潰。 logcat顯示Resources $ NotFoundException,同時加載一個向量,該向量讓人想起早期版本的Android中具有矢量圖形的所有AppCompat錯誤。但是,它在KitKat,棒棒糖和棉花糖上運行良好。只是在牛軋糖上我得到了這個錯誤。

我已經把範圍縮小到一定的數量,導致異常的矢量文件,但我不明白爲什麼他們比我現在用的是別人的不同。所有從相當簡單SVGs從產生:http://inloop.github.io/svg2android/

我的猜測是,事情的方式發生了變化,他們正在創建載體,由於某種原因可繪製這樣就不會產生提拉這些文件現在導致錯誤。當庫在屏幕上放置drawable時,它不能「找到」缺少的drawable,因爲它沒有被創建。我不確定Nougat的矢量文件中額外的檢查/限制是什麼。

有沒有其他人經歷過這個?任何想法爲什麼?牛軋糖的矢量處理有什麼變化?

遇到的錯誤,並通過其他的矢量誤差搜索後,我更新了我的gradle這個設置:

  • buildToolsVersion '25 .0.3'
  • vectorDrawables.useSupportLibrary =真
  • 編譯「com.android 。支持:程序兼容性-V7:25.4.0'
  • 編譯 'com.android.support:preference-v14:25.4.0'
  • 編譯 'com.android.support:recyclerview-v7:25.4.0'
  • 編譯 'com.android.support:design:25.4.0'

我也包含在主類:

static { 
     AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
    } 

的logcat的:

E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.MyApp.Application.MyAppApplication, PID: 4957 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.MyApp.Application.MyAppApplication/com.MyApp.Application.MyAppApplication.MyApp}: android.content.res.Resources$NotFoundException: Drawable com.MyApp.Application.MyAppApplication:drawable/icon_month with resource ID #0x7f0800da 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
        Caused by: android.content.res.Resources$NotFoundException: Drawable com.MyApp.Application.MyAppApplication:drawable/icon_month with resource ID #0x7f0800da 
        Caused by: android.content.res.Resources$NotFoundException: File res/drawable/icon_month.xml from drawable resource ID #0x7f0800da 
    at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:725) 
    at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571) 
    at android.content.res.Resources.getDrawable(Resources.java:767) 
    at android.content.Context.getDrawable(Context.java:525) 
    at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:30) 
    at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:372) 
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:202) 
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:190) 
    at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100) 
    at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:85) 
    at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:92) 
    at com.MyApp.Application.MyAppApplication.MyApp.onCreate(MyApp.java:233) 
    at android.app.Activity.performCreate(Activity.java:6662) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
        Caused by: java.lang.IllegalArgumentException: Path string cannot be empty. 
    at android.util.PathParser.nCreatePathDataFromString(Native Method) 
    at android.util.PathParser.-wrap1(PathParser.java) 
    at android.util.PathParser$PathData.<init>(PathParser.java:74) 
    at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1556) 
    at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1507) 
    at android.graphics.drawable.VectorDrawable.inflateChildElements(VectorDrawable.java:693) 
    at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:598) 
    at android.graphics.drawable.DrawableInflater.inflateFromXml(DrawableInflater.java:130) 
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1224) 
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1197) 
E/AndroidRuntime:  at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:715) 
     ... 23 more 

初在XML矢量文件的(無法發送整個文件):

<?xml version="1.0" encoding="utf-8"?> 
    <vector xmlns:android="http://schemas.android.com/apk/res/android" 
     android:width="100.000000dp" 
     android:height="75.666667dp" 
     android:viewportWidth="100.000000" 
     android:viewportHeight="75.666667"> 

     <group 
       android:translateY="75.666667" 
       android:scaleX="0.003333" 
       android:scaleY="-0.003333"> 
      <path 
       android:fillColor="#000000" 
       android:strokeWidth="1" 
       android:pathData="M28898 22695 c-7 -7 -376 -19 -491 -16 -69 2 -113 -1 -122 -9 -14 -12 -296 -34 
    -330 -26 -18 4 -170 7 -235 4 -14 0 -47 3 -75 7 -61 9 -223 9 -265 0 -19 -4 -36 -2 
    -46 6 -12 10 -20 9 -39 -1 -20 -11 -35 -11 -77 -1 -38 9 -151 11 -404 8 -192 -2 
    -354 -6 -360 -9 -5 -3 -103 -4 -217 -3 -115 1 -210 -2 -213 -7 -3 -5 -18 -6 -34 -3 
    -23 5 -126 7 -310 5 -14 -1 -185 -1 -380 -1 -280 0 -567 -3 -705 -8 -5 -1 -35 1 
    -65 3 -100 8 -183 7 -324 -2 -77 -5 -148 -7 -158 -4 -10 2 -18 -1 -18 -7 0 -14 -35 
    -14 -76 1 -25 9 -39 9 -56 0 -13 -6 -81 -14 -153 -17 -71 -3 -195 -9 -275 -14 -80 
    -5 -152 -10 -160 -10 -138 -6 -171 -10 -184 -24 -9 -9 -16 -20 -16 -26 0 -6 -4 -11 
    -10 -11 -15 0 -12 21 7 42 16 18 14 19 -68 19 -121 0 -114 0 -234 -5 -113 -6 -236 
    -11 -550 -22 -221 -8 -229 -9 -243 -18 -7 -4 -80 -7 -162 -8 -85 0 -153 -4 -156 -9 
    -4 -6 -10 -6 -18 0 -6 5 -68 11 -136 11 -114 1 -181 -1 -371 -14 -36 -3 

.... 

謝謝!

編輯 好像這個問題是不再是「pathData」條目矢量文件(似乎路徑數不成爲問題)。該錯誤似乎當本地JNI功能GetStringUTFChars被稱爲在一個較長的pathData進入發生,它將返回解析器不能得出一個空字符串。我不知道這是否只是一件長事,也不知道爲什麼這可以在AppCompat庫中正常工作。

當前的解決方法是1)對於任何具有long pathData或2)的矢量使用位圖來修改xml文件並將pathData分成多個路徑(感謝Lewis McGreary的建議!)。

兩者都需要測試每個矢量圖形,以確定哪些工作,然後單獨地修改所述圖形內容。這是不理想的,尤其是對於從一個大型游泳池選擇圖像這一特定的應用程序。整體移動到PNG格式是一種選擇,但將導致更大的APK和較差的比例:(

Android的源與崩潰:

PathParser Java

PathParser JNI - here is the call to GetStringUTFChars

PathParser JNI Hwui - here is where the crash happens

+1

我不知道真正原因是什麼在這裏,但我可以說使用支持庫時 - 牛軋糖(API 24)和向上它委託給VectorDrawable的框架版本,並且API 23向下使用支持庫版本。 –

+0

這有助於。更多的挖掘,它似乎是在更長的pathData字符串的24 + Api扼流圈,給出上面的「路徑字符串不能爲空」的錯誤。我一直無法找到矢量渲染的相應源代碼。對於在Android Studio中使用內置Vector Studio創建的矢量圖形也是如此。我只創建了一個新的牛軋糖,沒有支持庫,項目結果相同。很明顯,支持庫在渲染具有長路徑數據的矢量方面做得更好,但實際上該做什麼?測試牛軋糖上的所有載體?我可以強迫牛軋糖使用支持庫嗎? – Emilie

+2

我不確定是否可以強制使用支持庫。如果更長的pathData是問題,並且根據特定圖像,將單個路徑分成多個較短的元素可能是一個解決方案。所以特別是如果圖像在一個路徑中有多個元素,通過「M」命令將是一個剪切/粘貼到新路徑的好地方。 –

回答

2

我找到了解決方法!看來問題出現在AAPT2中。

添加:

android.enableAapt2 = false 

gradle.properties 
+0

這是否有任何副作用? – thailey01

+0

以上解決方案對我無效,因爲發生'gradle sync'時出現錯誤。我想最好的解決方案是優化你的矢量繪製。可能SVGO會在一定程度上幫助https://github.com/svg/svgo – karthikk

0

我有沒有其他解決方法比你提到的其他2個。但似乎這個問題已在Android 7.1中修復了

相關問題