干货途牛安卓客户端架构优化问题的解决方案
本文介绍了插件系统的实践过程中遇到的问题以及解决办法。...
接上期《途牛旅游Android客户端架构优化之旅》,本期将针对实践过程中出现的种种问题,提出解决方案。
插件系统的实践过程中,遇到以下问题:
1、各插件、主APP存在资源重复问题?
A:把公共资源抽象到基础库层
2、插件可导致主APP崩溃?
A:进程隔离
3、 新手需要学习成本?
A :脚本自动建立新插件空工程,详细API文档
4、插件解决了不同业务模块耦合的问题,使得开发效率大大提高。我们通过插件拆分后,发现了插件中存在很多重复的代码。主要有以下问题:
第一,开发效率低下;
第二,大家都在重复制造轮子;
第三,不利于统一管理公共模块;
A:解决重复代码的问题,关键在于组件化,主要包括基础工具、公共view和公共业务组件三个层次。
依据组件的级别拆分,目前项目中有以下组件:
基础工具包括log,金额转换、文件操作等;
view组件包括折线图,日历控件,按钮,上拉下拉等;
业务组件包括城市列表,用户中心,图片选择等。
组件的管理都由架构团队负责,有公共的wiki和文档的维护。
5、不同插件中日志、网络、监控、Hot Fix?
A:组件化完成后,不同的插件需要的日志、网络、监控等功能,也需要抽象。我们称为SDK化,把基础功能模块做成SDK,提供给插件和主app使用。
基础服务包括打点日志系统、性能监控、网络框架和安全模块。
对于线上修复方案,由于插件本省具有动态增量更新的特性,本来就具有hotfix的特点。
基础服务中的打点日志、性能监控和网络框架采取了AOP动态插庄、PB和JSON、Gzip压缩,OKHttp以及HttpDns等技术。
打点系统把数据上传到服务端,通过数据分析,可以查看不同版本的相关数据。
通过监控系统的数据分析,可以查看crash率、接口访问时间、错误率、页面性能等数据。
安全也很重要,途牛app的安全数据和算法都存储在so文件中,加载破解者的破解分析难度。
6、途牛app的项目工程比较大,代码如何进行管理呢?
A:主要思路git+gerrit方式,各个插件团队独立开发,在统一的代码review平台。插件系统的代码在不同的仓库中,由相关插件负责人负责管理仓库。途牛最开始是两个仓库,经过插件化后,仓库被拆分成多个仓库,由不同的研发团队负责管理。
架构组负责公共模块研发和接入Git+Gerrit Review+checkstyle 确保代码规范统一。
插件化、组件化、sdk化完成后,整体的架构图如下:
至此,问题得到比较好的解决:
业务耦合严重通过插件思路来解决;
代码复用率低通过公共模块的组件化来解决;
无平台化产品通过SDK化的基础服务来解决。
随着系统功能增多,为了快速的上线,一般采取H5的策略,但是H5的用户体验相比native要差一些;如果采取native的开发方式,一些引流模块界面和交互比较复杂,需要投入安卓和iOS两批人马,开发成本比较高。
为了解决hybrid体验和native成本高的问题,2016年比较热的两个框架:
一个是facebook的reactnative ;
另一个是阿里团队的weex。
经过分析选型,我们选择的rectnative。
React Native 有以下特点:
第一,支持动态发布更新;
第二,体验优于H5,和native接近;
第三,框架有facebook的支持,组件逐渐完善,github活跃度很高。
我们reactnative线路有以下阶段:
从2015年开始调研,到2016年上半年几个简单页面的试点,到现的大力推广,目前有社区、攻略、消息等模块在使用react native框架开发。
底层框架的功能:
React native的底层框架是facebook提供的,我们在底层框架上做了增量更新、bridge、监控系统、native组件扩展、js组件扩展、js基础模块等功能。
增量更新负责bundle的下载、合并、更新等工作;
bridge负责native和js的交互;
native扩展组件负责native层的组件,如listview扩展等;
监控系统负责监控reactnative页面的性能等相关数据;
js组件和js基础模块由js开发,主要包括业务组件和途牛的js基础功能模块。
引入reactnative框架后,app的整体架构图如下所示:
在reactnative的开发过程中的问题:
1、启动白屏问题,安卓比较突出?
A:异步缓存JSBundle文件
2、列表未复用导致性能低下?
A:利用native层的复用机制,js层发送数据到native 层,在native层复用
3、JS导致的线上崩溃?
A:JS层的css参数类型定义需明确规范
如果涨姿势了,请关注我们吧!
关注 途牛技术中心
微信扫一扫关注公众号