最初构建项目是 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

posted on 2016-09-11 15:42  MTing  阅读(2975)  评论(0编辑  收藏  举报