干货途牛安卓客户端架构优化问题的解决方案

 

本文介绍了插件系统的实践过程中遇到的问题以及解决办法。...



接上期《途牛旅游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参数类型定义需明确规范

如果涨姿势了,请关注我们吧!


    关注 途牛技术中心


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册