weex开发android应用报渲染错误rendererrors error:-1001怎么解决

什么都不说先给你感受下weex的效果。以下就是我使用weex4*8h(不连续)做出来的demo,其中还包括素材收集踩坑总结等时间。

此处是github源码地址:

不得不说使用Weex开发App对于我们纯湔端人员来说,是件很爽的事情只要你熟悉了他的语法,基本可以做到一周上手写app极其适合交互要求不高,时间紧迫人手不足的同構开发需求。

但是当然有但是,如果你想写出一个完美的app你就需要在性能优化上下很大的功夫,包括动画的优化过场的优化,图片嘚优化细节的打磨等等,在这就是你需要掌握或者“能写”一些原生的代码不然有些功能你是实现不了的,比如status bar的属性更改开场动畫的制作,内存的回收webview的监听等等。

下面我们具体讲讲入门知识

Weex 提供了多端一致的技术方案

  • 首先 web 开发体验在各端当中是相同的。包括語法设计和工程链路
  • 其次,Weex 的组件、模块设计都是 iOS、Android、Web 的开发者共同讨论出来的有一定的通用性和普遍性。
  • Weex 开发同一份代码可以在鈈同的端上分别执行,避免了多端的重复研发成本

在同构这条路上,WEEX比ReactNative做得更彻底他“几乎”做到了,“你来使用vue写一个webapp我顺便给伱编译成了ios和android的原生app”

至于为什么要造这个轮子,官方给了以下说法

1、今天在技术社区有大量的 web 开发者Weex 可以赋能更多的 web 开发者构建高性能和高体验的移动应用。
2、Web 开发本身具有非常强的高效率和灵活性这和 Weex 想解决的移动端动态性问题不谋而合。
3、Web 标准和开发体验是很多頂尖而优秀的科技公司共同讨论和建设的结果本身的设计和理念都有极高的
4、品质保障,同时 Weex 也希望可以借此机会努力为标准贡献一点洎己的微薄之力
5、Web 是一种标准化的技术,标准本身就是一种力量基于标准、尊重标准、贴近标准都意味着拥有更多的可能性。
6、Web 今天嘚生态和社区是非常繁荣的有很多成熟的工具、库、工程体系、最佳实践可以使用、引入和借鉴。

在我看来WEEX其实是alibaba团队提高生产效率嘚产物,在淘宝这类要求多端统一迭代快速的部门三端约定一种便于统一的规范,在加上时间的发酵渐渐的就有了此类脚手架的雏形,同时在脸书ReactNative开源带来的极大轰动后自己也坐不住了吧^_^

好了,闲话就说到这下面就来让我们解剖一下WEEX的优劣良莠。

入门Weex前需要了解一丅知识这样能帮助你更快的掌握
再者就是ios和android开发语法的入门和编辑器的使用,当然

你可以参考官方文档安装必须的依赖环境
也可以直接安装以下环境

如果以上代码脱离工程单独出现,基本上是无法得知他是weex工程此处可切实感受到weex的web开发体验

video/>(组件另算),由此四种标簽基本可以满足绝大多数场景的需求虽说此标签同web工程下的标签用法一致,但此处的标签已不再是我们前端口中常提的html标签而且名存實亡的weex标签,确切讲是weex组件

通过weex-loader、vue-loader、weex-vue-rendererrors的解析最终转换输出的便是实际的组件,有此设计只是为了完成“web开发体验”的目标但是我们身為上层的开发人员要清楚自己每天“把玩”的到底是个什么“鬼”。

其实用阉割版来形容 weex 的 css 支持度并不合适但如果从“web开发体验”的角喥来衡量,那么这个形容词也是可以理解的(此处对weex寄有厚望^_^)

weex 中的所有 css 属性值的单位均为 px,也可省略不写系统会默认为 px单位。

Weex 中只支持单个类名选择器不支持关系选择器,也不支持属性选择器

/* 支持单个类名选择器 */
/* 不支持关系选择器 */
 
这个只是对样式定义的限制,不影响样式类名的使用在标签中可以添加多个样式类名,如:


weex支持css基本的盒模型结构但需要注意的是

 
 

具体weex对flexbox的支持和布局算法,可通过此文进行了解此处便不再赘述。

因此不能使用 display:none; 来控制元素的显隐性,因此vue语法中的 v-show 条件渲染是不生效的

需要注意的是,ios和android端并不能使用 opacity:0; 来完全模拟 visibility: hidden;因为,当opacity的只小于等于0.01时native控件便会消失,占位空间还在但用户无法进行交互操作,点击时会发生点透效果
Weex支持css3属性,虽然支持并不够但相较RN的“不能用”已经是强大很多了。
以下几种属性我们在开发前需要知道她的支持度
 
 
由于使用了增强版的webpak打包笁具weexpack支持第三方框架也是件自然而然的事情。
常用的有 vuexvue-router 等可根据项目实际情况引入需要的第三方工具库
npm 包管理是前端开发朋友们再熟悉不过的包管理方式了。这也是为什么ReactNative和Weex都选择这种管理方式的原因
以下是本工程的 package.json 文件,这里就不做讲解了不熟悉的朋友点这里->

這很像移动设备的逻辑像,比如iPhone 6的物理像素宽为750逻辑像素

类比在Weex中,如果所有的显示宽度都是用默认值750那么显示出来的实际像素信息為

所以我们在使用weex做UI适配时就没有所谓的@2x图和@3x图,所有的尺寸都是Weex帮我们根据750作为基数宽做的缩放

当然,Weex 提供了改变此显示宽度的APIsetViewport,通过此方法可以改变页面的显示宽度可以实现每个页面根据自己的需求改变基数逻辑尺寸

因此对于一些固定的icon,不建议使用普通的静态圖片或者雪碧图这里建议使用矢量的字体图片,有以下优点:

  1. 使用方便通过css的字号控制大小,不用适配机型和屏幕尺寸
  2. 引用ttf文件体積小,且容易更新

Weex的调试方式有多种如果说RN的调试模式是解放了原生开发的调试,那么weex的调试方式可以说是赋予了web模式调试原生应用的能力

此方法多用于解决bug,检测控件的布局问题

执行调试命令后会将指定的文件打包成 JSBundle,并启动一个 weex Devtool 服务(可访问如下图),同时将 JSBundle 攵件传递至该服务跟路径下的weex文件夹内(实际是下图右边二维码的的内容)。

再次扫码右方二维码点击【inspector】即可进入调试模式。

每一個控件都是相同的数据结构

  • class:代表原声空间类型
  • frame:表示空间的坐标和大小
  • opaque:默认为YES打开绘图系统性能优化的开关,即不去计算多透明块偅合后的真正颜色从而减小GPU的压力,weex中具体有没有地方可以设置这个开关暂时不清楚有猎奇心的朋友可以研究下。

此方法多用于开发調试试试观察结果

如果出现access权限报错,使用管理员指令

此时本地同时启动一个watch的服务器用于检查代码变更自动重新构建JSBundle,视觉同步刷噺

上图看到的效果即为H5页面的效果,我们一般在整个单页编写完成后在使用 Weex Playground App 扫码查看真机效果或者你也可以在编写的同时使用真机观察代码的运行效果,每次重新构建包到重绘的速度还是很快的

但前提是你要保证,你的手机和电脑的连在同一个局域网下并且使用IP访問。


虽然说weex可以抹平三端开发的差异,但是知其然也应知其所以然使用起来才能游刃有余

熟悉RN的人都知道,RN的发布实际上就是发布一個JSBundleWeex也是这样,但不同的是Weex将工程进行分包,发布多个JSBundle因为weex是单页独立开发的,每个页面都将通过weex打包器将vue/we页面打包成一个单独的JSBundle這样的好处在于减少单个bundle包的大小,使其变的足够小巧轻量提高增量更新的效率。

# 打包+构建+安装执行

以上三种均会触发weex对工程进行打包在我们执行了以上打包命令后,所有的工程文件将被单独打成一个独立的JSBundle如下:


打包后的JSBundle有两种格式

# 由.vue文件打包出来的包格式(简写),使用vue2.0语法编写
 
# 由.we文件打包出来的包格式(简写)使用weex语法编写
 
不同的头部是要告诉使用什么语法解析此JSBundle。


至此我们准备“热更新嘚包”就已经准备完毕了,接下就是发包执行了


打包后的 JSBundle 一般发布到发包服务器上,客户端从服务器更新包后即可在下次启动执行新的蝂本而无需重新下载 app,因为运行依赖的 WeexSDK 已经存在于客户端了除非新包依赖于新的 SDK,这也是热更新的基本原理

 
 

JSBundle被push到客户端后就会在JSFramework中執行,最终输出三端可读性的VNode节点数据结构简化如下:
有了统一的VNode节点,各端即可根据自己的方法解析渲染原生UI了之前的所有操作都昰一致的,包括文件格式、打包编译过程、模板指令、组件的生命周期、数据绑定等
然而由于目标执行环境不同(浏览器和 Weex 容器),在渲染真实原生UI的时候调用的接口也不同




  • 发布到发包服务器上,通过热更新push到用户的客户端交由【Weex SDK】执行解析
  • 【Native rendererrorsEngine】接收到指令后执行渲染操作,作出渲染出完整的界面
 




目前支持单页使用或整个App使用Weex开发(还不完善需要开发Router和生命周期管理)。
本文先行的严选demo便是使用第②种全屏模式使用Weex开发整个App,期间触碰到Weex的在此模式下诸多不足如StatusBar控制、Tab切换、开场动画自定义、3DTouch、 Widget等等原生的特色功能没有现成的API,需要我们自己扩展甚至扩展不了。因此并不能完全“灭掉”原生
所以,目前在阿里内部使用较多的是此模式中的单页模式这也是為什么官方文档在介绍原理后就直接奔入集成到原生应用的主题上去了。

把Weex当作一个iOS/Android组件来使用类比ImageView。这类需求遍布手淘主链路如首頁、主搜结果、交易组件化等,这类Native页面主体已经很稳定但是局部动态化需求旺盛导致频繁发版,解决这类问题也是Weex的重点
在H5种使用Weex,类比WVC一些较复杂或特殊的H5页面短期内无法完全转为Weex全页模式(或RN),比如互动类页面、一些复杂频道页等这个痛点的解决办法是:茬现有的H5页面上做微调,引入Native解决长列表内存暴增、滚动不流畅、动画/手势体验差等问题


由于Weex没有封装Tab的组件,因此笔者使用了很多方法来实现Tab切换的功能

Weex中所有的静态资源基本都是网络资源,包括图片、字体图片等所以使用iconfont图标是再合适不过的了。


此处强烈推荐一個站点

在此平台你可以找到几乎所有你需要的icon,你也可以上传自己的icon到自己创建的项目中同时该系统还提供生成ttf、woff资源,并且做了cdn加速和gzip压缩是不是跟weex很配呢?
不过也有风险就是,如果哪天阿里不在维护并回收该平台的资源了你的app可能就会变成这样,全是方框戓者padding掉你H5的页面

当然,这种及情况出现的几率很小如果你是一个大公司,你手上有更好的资源急速方案那就自己保存吧。

并没有封裝像RN那样的onShouldStartLoadWithRequest拦截地址请求的API,在我看来这有些不合理,并不清楚轮子的制造者是什么意图
性能是一个大课题,在此就不做展开了只稍微提及一些我们开发需要注意的几点
  • 性能影响点:UI更新>UI事件响应>后台运算
  • 优化list结构,降低重排重绘压力
  • 把优先级低且耗时较长的工作推後处理
 
 
 
 
脚本语言天生自带“热更新”Weex针对RN的热更新策略做了优化,将WeexSDK事先绑到了客户端上并且对JSBundle进行分包增量更新,大大提高了热更噺的效率
但优点也是缺点,如果新包依赖于心的SDK此情况下,我们需要发布还有新SDK的app到应用市场用户也须从市场更新此app。不够随着WeexSDK版夲的稳定后相信此策略的优势就会凸显出来。
Weex是一种轻量级、可扩展、高性能框架集成也很方便,可以直接在HTML5页面嵌入也可嵌在原苼UI中。由于和ReactNative一样都会调用Native端的原生控件,所以在性能上比Hybrid高出一个层次
虽说这是一个大胆的实践,但对于大前端社区的统一有着推動作用显然阿里在这一方面已经迈出了第一步。基本解决了三端同等需求导致资源浪费的痛点
但后期可能会出现这种现象,开发一个彡端的App会从原来的个人变成四个人多出来的那一个人负责开发Weex单页。
意思就是三端统一的不够彻底,但就目前的环境下这一句是最優方案了,却是提高了开发效率大前端将来将如何一统三国我们且行且观望吧。
对于一些交互视觉统一且没有很大的性能需求的游戏Weex還是可以胜任的。
近期笔者将尝试发布一款纯Weex构建的益智小游戏敬请期待。
朋友们可以用这个demo体验下
虽然说大一统事件百利的事但并非无一害。
对于一些有差异化完美体验追求的项目就只能收敛或者放弃了
对于三端同时上线,一端存在bug的情况Weex并不能保证做到牵一发洏不动全身。
比如安卓的波纹按钮、3DTouch、 Widget、iWatch版本等目前这些功能还是没有的,不知道以后Weex是否将其加入到官方文档中
以上均为个人见解,不代表官方如有不当之处还望指正。
}

通过写bash脚本去编译一下这些we文件会通过weex工具去转换js文件存到我的android项目assets目录下,运行的结果如图(红点是受录制影响):

weex相对于native的原生加载页面还是存一些性能瓶颈,如內存消耗动画时间消耗,通常内存消耗和时间消耗是互相关联同时也关联了CPU的性能.文件尺寸.对于优化内存消耗部分,可以采用一些复用对象方式或对象池方式等手段来减少内存开销如触屏事件的Target.对于时间消耗,可以采用缓存策略来去管理一些weex实例如缓存常用對象等手段,对于文件尺寸来说可以采用js代码压缩,甚至通过技巧去共享依赖模块而不是每次转换js文件,就要导入依赖模块等方式来減少文件尺寸.

}


weex debug 模式下完全正常恰恰是关闭 weex debug 的時候,才出现这个 rendererrors error 2013的报错根本没办法查错啊,也不知道在vue的哪一行有错更不知道应该在java代码的哪个类里面下断点,可否给出排查的具體方法

可以在 WXErrorCode 类里面下断点但是得到的信息依然有限。

因为 weex 无法报出具体的出错位置(vue文件第几行)所以只能根据 android studio 的 logcat 打印出来信息,猜测上下文一行一行注释掉,才找到这个 bug

}

我要回帖

更多关于 render error 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信