最初構建項目是 eclipse, 后來切換到 android studio來做開發. 后來多個用戶反饋在android4.4機型上存在啟動對話崩潰的問題.但是IOS 版工程從來沒有重現.
調試報錯信息:
warn 17:28:54.379 VFY: unable to resolve virtual method 599: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
warn 17:28:54.379 VFY: unable to resolve virtual method 621: Landroid/content/res/TypedArray;.getType (I)I
error 17:28:54.409 Exception while inflating <vector>
org.xmlpull.v1.XmlPullParserException: Binary XML file line #17<vector> tag requires viewportWidth > 0
at android.support.graphics.drawable.VectorDrawableCompat.updateStateFromTypedArray(VectorDrawableCompat.java:535)
at android.support.graphics.drawable.VectorDrawableCompat.inflate(VectorDrawableCompat.java:472)
at android.support.graphics.drawable.VectorDrawableCompat.createFromXmlInner(VectorDrawableCompat.java:436)
at android.support.v7.widget.AppCompatDrawableManager$VdcInflateDelegate.createFromXmlInner(AppCompatDrawableManager.java:704)
at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:356)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:182)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:175)
at android.support.v7.widget.TintTypedArray.getDrawable(TintTypedArray.java:66)
at android.support.v7.widget.Toolbar.<init>(Toolbar.java:295)
at android.support.v7.widget.Toolbar.<init>(Toolbar.java:226)
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:600)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:389)
at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
at cordova.plugin.rongcloud.im.ConversationActivity.onCreate(ConversationActivity.java:27)
at android.app.Activity.performCreate(Activity.java:5394)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340)
at android.app.ActivityThread.access$800(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5293)
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:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
warn 17:28:54.409 threadid=1: thread exiting with uncaught exception (group=0x41792da0)
error 17:28:54.419 FATAL EXCEPTION: main
Process: com.falv58app.im, PID: 28609
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.falv58app.im/cordova.plugin.rongcloud.im.ConversationActivity}: android.view.InflateException: Binary XML file line #36: Error inflating class android.support.v7.widget.Toolbar
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2282)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2340)
at android.app.ActivityThread.access$800(ActivityThread.java:157)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5293)
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:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #36: Error inflating class android.support.v7.widget.Toolbar
at android.view.LayoutInflater.createView(LayoutInflater.java:626)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
at android.support.v7.app.AppCompatDelegateImplV7.createSubDecor(AppCompatDelegateImplV7.java:389)
at android.support.v7.app.AppCompatDelegateImplV7.ensureSubDecor(AppCompatDelegateImplV7.java:309)
at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:273)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
at cordova.plugin.rongcloud.im.ConversationActivity.onCreate(ConversationActivity.java:27)
at android.app.Activity.performCreate(Activity.java:5394)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2246)
... 11 more
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:600)
... 25 more
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
at android.content.res.Resources.loadDrawable(Resources.java:3008)
at android.content.res.Resources.getDrawable(Resources.java:1586)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:354)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:187)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:175)
at android.support.v7.widget.TintTypedArray.getDrawable(TintTypedArray.java:66)
at android.support.v7.widget.Toolbar.<init>(Toolbar.java:295)
at android.support.v7.widget.Toolbar.<init>(Toolbar.java:226)
... 28 more
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:969)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:913)
at android.content.res.Resources.loadDrawable(Resources.java:3004)
... 35 more
warn 17:28:54.419 Force finishing activity com.falv58app.im/cordova.plugin.rongcloud.im.ConversationActivity
warn 17:28:54.429 Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1471 com.android.server.am.ActivityStack.startPausingLocked:1002 com.android.server.am.ActivityStack.finishActivityLocked:3110 com.android.server.am.ActivityStack.finishTopRunningActivityLocked:2960 com.android.server.am.ActivityStackSupervisor.finishTopRunningActivityLocked:3014
warn 17:28:54.429 Force finishing activity com.falv58app.im/.MainActivity
warn 17:28:54.429 Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1471 com.android.server.analytics.data.collection.application.CrashAnrDetector.broadcastEvent:296 com.android.server.analytics.data.collection.application.CrashAnrDetector.processDropBoxEntry:254 com.android.server.analytics.data.collection.application.CrashAnrDetector.access$100:60 com.android.server.analytics.data.collection.application.CrashAnrDetector$1.onReceive:102
warn 17:28:54.439 getCSCPackageItemText()
info 17:28:54.449 begin
info 17:28:54.449 setFocusWindow0
info 17:28:54.469 id=179 createSurf (1x1),1 flag=4, jm
error 17:28:54.739 !@Dumpstate > sdumpstate -k -t -z -d -o /data/log/dumpstate_app_error
warn 17:28:54.929 Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1471 com.android.server.am.ActivityStack.resumeTopActivityLocked:2144 com.android.server.am.ActivityStackSupervisor.resumeTopActivitiesLocked:2997 com.android.server.am.ActivityStack.completePauseLocked:1220 com.android.server.am.ActivityStack.activityPausedLocked:1088
info 17:28:54.959 id=180 createSurf (1080x1920),1 flag=4, Mauncher
warn 17:28:55.49 EDMNativeHelperService is published
warn 17:28:55.409 mDVFSHelper.release()
info 17:28:55.519 Function: selinux_android_load_priority [0], There is no sepolicy file.
其實問題在於:
Binary XML file line #17<vector> tag requires viewportWidth > 0
什么是Vector
Vector Drawable
Android 5.0發布的時候,Google提供了Vector的支持。Vector Drawable相對於普通的Drawable來說,有以下幾個好處:
Vector圖像可以自動進行適配,不需要通過分辨率來設置不同的圖片
Vector圖像可以大幅減少圖像的體積,同樣一張圖,用Vector來實現,可能只有PNG的幾十分之一
使用簡單,很多設計工具,都可以直接導出SVG圖像,從而轉換成Vector圖像
功能強大,不用寫很多代碼就可以實現非常復雜的動畫
成熟、穩定,前端已經非常廣泛的進行使用了
Vector圖像剛發布的時候,是只支持Android 5.0+的,對於Android pre-L的系統來說,並不能使用,所以,可以說那時候的Vector並沒有什么卵用。不過自從AppCompat 23.2之后,Google對p-View的Android系統也進行了兼容,也就是說,Vector可以使用於Android 2.1以上的所有系統,只需要引用com.android.support:appcompat-v7:23.2.0以上的版本就可以了,這時候,Vector應該算是迎來了它的春天。
如何獲得Vector圖像
概念
首先,需要講解兩個概念——SVG和Vector。
SVG,即Scalable Vector Graphics 矢量圖,這種圖像格式在前端中已經使用的非常廣泛了,詳見WIKI:https://en.wikipedia.org/wiki/Scalable_Vector_Graphics
Vector,在Android中指的是Vector Drawable,也就是Android中的矢量圖,詳見:https://developer.android.com/reference/android/graphics/drawable/VectorDrawable.html
因此,可以說Vector就是Android中的SVG實現,因為Android中的Vector並不是支持全部的SVG語法,也沒有必要,因為完整的SVG語法是非常復雜的,但已經支持的SVG語法已經夠用了,特別是Path語法,幾乎是Android中Vector的標配,詳細可以參考:http://www.w3.org/TR/SVG/paths.html
與AppCompat23.2的兼容
Vector是在Android L中提出來的新概念,所以在剛開始的時候是只兼容L+的。
Gradle Plugin 1.5的兼容
從Gradle Plugin 1.5開始,Google支持了一種兼容方式,即在Android L之上,使用Vector,而在L之下,則使用Gradle將Vector生成PNG圖像。
Android gradle plugin 1.5發布以后,加入了一個跟VectorDrawable有關的新功能。Android build tools 提供了另外一種解決兼容性的方案,如果編譯的版本是5.0之前的版本,那么build tools 會把VectorDrawable生成對應的png圖片,這樣在5.0以下的版本則使用的是生成的png圖,而在5.0以上的版本中則使用VectorDrawable.在build.gradle添加generatedDensities配置,可以配置生成的png圖片的密度。
AppCompat23.2的兼容
從AppCompat23.2開始,Google開始支持在低版本上使用Vector。
靜態Vector圖像
我們有很多方法能夠得到這些Vector,那么如何使用它們呢,Android 5.0以上的使用就不講了,不太具有普遍代表性,我們從pre-L版本的兼容開始做起。
pre-L版本兼容
VectorDrawableCompat依賴於AAPT的一些功能,它能保持最近矢量圖使用的添加的屬性ID,以便他們可以被pre-L版本之前的引用。
在Android 5.0之前使用Vector,需要aapt來對資源進行一些處理,這一過程可以在aapt的配置中進行設置,如果沒有啟用這樣一個flag,那么在5.0以下的設備上運行就會發生
android.content.res.Resources$NotFoundException。
首先,你需要在項目的build.gradle腳本中,增加對Vector兼容性的支持,代碼如下所示:
使用Gradle Plugin 2.0以上:
android { defaultConfig { vectorDrawables.useSupportLibrary = true }}
使用Gradle Plugin 2.0以下,Gradle Plugin 1.5以上:
android { defaultConfig { // Stops the Gradle plugin’s automatic rasterization of vectors generatedDensities = [] } // Flag to tell aapt to keep the attribute ids around aaptOptions { additionalParameters "--no-version-vectors" }}
像前面提到的,這種兼容方式實際上是先關閉AAPT對pre-L版本使用Vector的妥協,即在L版本以上,使用Vector,而在pre-L版本上,使用Gradle生成相應的PNG圖片,generatedDensities這個數組,實際上就是要生成PNG的圖片分辨率的數組,使用appcompat后就不需要這樣了。
當然,最重要的還是添加appcompat的支持:
compile 'com.android.support:appcompat-v7:23.4.0'
同時,確保你使用的是AppCompatActivity而不是普通的Activity。
解決辦法
在 build.gradle 中添加兼容代碼:
aaptOptions {
additionalParameters "--no-version-vectors"
}
吐槽
因為一開始工程完全沒有問題,而且一開始反饋的不多,就沒當回事, 后來被催着解決的時候懵了, 解決的思路不對離真相反而越來越遠.
在某一個無休得周末, 看着蹭蹭上漲的用戶量, 下定決心即使重構整個工程也一定要解決, 才找到了答案.
雖然最終解決問題也就幾分鍾的事情, 但是在沒解決前的那種狀態很不好, 如鯁在喉, 總是潛意識里感覺有不干凈的東西(不能控制代碼結果的因素)在工程里, 導致寫新功能的時候心里充滿不確定和不自信, 這時候無論與人溝通還是工作效率都會打折扣.
參考:
http://stackoverflow.com/questions/35622438/update-android-support-library-to-23-2-0-cause-error-xmlpullparserexception-bin
http://blog.csdn.net/heqiangflytosky/article/details/51009123
http://www.vccoo.com/v/0c0cc7?source=rss
