android studio集成融雲 SDK 後在部分機型啓動對話時崩潰

最初構建項目是 eclipse, 後來切換到 android studio來作開發. 後來多個用戶反饋在android4.4機型上存在啓動對話崩潰的問題.可是IOS 版工程歷來沒有重現.

調試報錯信息:html

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來講,有如下幾個好處:java

Vector圖像能夠自動進行適配,不須要經過分辨率來設置不一樣的圖片linux

Vector圖像能夠大幅減小圖像的體積,一樣一張圖,用Vector來實現,可能只有PNG的幾十分之一android

使用簡單,不少設計工具,均可以直接導出SVG圖像,從而轉換成Vector圖像ios

功能強大,不用寫不少代碼就能夠實現很是複雜的動畫數組

成熟、穩定,前端已經很是普遍的進行使用了android-studio

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應該算是迎來了它的春天。app

如何得到Vector圖像
概念
首先,須要講解兩個概念——SVG和Vector。eclipse

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

相關文章
相關標籤/搜索