前言

移动开发的跨平台与快速发布一直是开发者的追求,也是技术的一个发展趋势,现在各大厂开始有了自己的大前端团队,所以我们也开始了自己的探索,目前来说主要有两种思路:

  • Hybrid App 代表:Cordova
    通过Webview加载Web页面,在NativeWeb页面之间建立双向通信
  • H5代码Native化 代表:ReactNative,Weex
    使用各平台Api,把H5代码编译成二进制代码直接运行

其实关于这两种思路对比,网上有很多大牛分析的很全面了,总结来说各有利弊很难完美,本篇文章我们主要讲一下Hybrid App实践,采用前后端分离以及单页应用技术开发Web页面,使用WebView加载Web页面,并通过JS通信提供一些Native层的支持,通过接口获取差异化页面资源文件,在本地整合更新,还可以达到热更新的需求。在我看来此方案更适用于需要快速发布、多端兼容、对性能要求稍低的业务,正好符合我们的需求。

源码

这里我整理了Android端会用到代码,包含JS通信,文件处理工具类,闪屏辅助类和WebView的封装。
Github地址:github.com/free46000/H…,请大家多多关注,由于源码并没有完善,所以暂时没有发布到Maven仓库

方案详解

既然确定了方向,那么就应该确定具体的方案了,通过自己的经验和网上资料整理,画了时序图:

image

按照图上的时序,接下来说一下每一步中的实践,以及碰到的坑。下面讲解

初次安装

  • 打包
    在打包程序时这一步主要是把Html相关资源文件压缩后放在assets文件夹下即可
  • 安装
    用户安装完应用程序打开后,检测是否为初次使用,如果是则通过程序直接解压包内资源到手机存储上即可,不局限于SD卡。

展示页面

  • 闪屏页展示
    由于上面的解压资源,还有Webview初始化、JS的加载执行、html的渲染都是耗时操作,并且都是发生在Html展示之前,所以我们选择把闪屏页用Native原生代码来编写,采用覆盖WebView所在页面的方案,这样在闪屏页隐藏的时候,用户就可以看到业务界面,提升用户体验。
    注:另外提供Android两种闪屏优化的小技巧,使用透明主题或者设置主题背景图片

  • 加载本地Html页面
    直接使用WebView#loadUrl()加载本地资源文件即可。由于WebView加载不同页面会出现闪屏的问题,所以我们采用Vue + Vue Router构建单页应用。
    这里Vue Router会有一个小坑,提醒大家注意一下:Vue Router默认采用hash模式,会有一个丑陋的#符号,作为一个有追求的程序员怎么能允许这种很丑的hash,一种更优雅的方式使用HTML5 History模式,但是不幸的是,加载本地资源文件的方式并不能正常解析HTML5 History模式的url,所以只能采用hash模式。

  • 数据请求
    为了节省用户的流量和时间,需要把Html资源文件存储在本地,这样数据的请求必须在客户端完成。有两种方案供选择:
    一是Native层拦截并请求数据再返回给Html层去展示,这样会增加工作量,也不利于职责的分离,所以放弃。
    二是直接使用JS请求数据,这样会出现跨域访问的问题,相比较来说还是这个比较容易解决的,采用CORS即可

  • Native调用JS
    Native层调用JS比较简单,执行一段JS代码即可,如:javascript:callJS()

  • JS调用Native
    JS层调用Native,在Android上来说主要分为三种:
    一:通过WebView#addJavascriptInterface()进行映射,使用起来简单,但是有安全风险,弃用
    二:自定义协议然后由Native层拦截并解析请求,使用起来复杂,容易和业务耦合,也不是最优选,弃用
    三:拦截JS#prompt()方法并解析,使用起来复杂,但是比第一种更安全,比第二种灵活,所以使用此方案

资源文件获取

资源文件采取差异化更新方案,本地存储一个标识,可以为版本号或者更新时间,这个可以和后端同学一起商量确定。
资源文件下载还有推送之类的由于Html的局限性,所以还是直接由Native层做比较合适,下面简单讲解下应用中的两种更新方式:

  • 服务端推送下发
    可以通过集成第三方的推送服务,在客户端收到更新推送后主动去请求下载差异化文件
  • 主动请求
    可以在选择合适的时机,如在应用启动时去请求差异化文件

资源文件更新

根据差异化清单对资源文件进行整合,存放在临时目录中,然后在第二次打开应用时更换,并展示更新后的界面,达到热更新的效果。

总结

本文只是概括的讲了结构的内容,可能会遗漏一些要点,如果大家有什么问题欢迎留言或者去GitHub上提交issue

作者开源了一个优雅的实现多类型的RecyclerView类库 支持DataBinding Form表单录入,跨多个RecyclerView拖动 Github地址:github.com/free46000/M…

Hybrid App 跨平台热更新方案实践 附带源码相关推荐

  1. 2022年9月12日-9月18日(ue4热更新视频教程+rhi模块源码抄写调剂。本周20小时。合计1582小时,剩余8418小时。)

    目前进行到mysql(7.1),tf1(2.3),oss(12.1),蓝图反射(1.7),ue4 pak(8.6), 从上周最后两天可以看到,基本上调整月计划后,可以完成任务.且打游戏已经没有吸引力了 ...

  2. 2022年9月5日-9月11日(热更新视频+rhi模块源码抄写+大象无形调试,本周40小时,合计1562小时,剩余8438小时。)

    目前进行到mysql(7.1),tf1(2.3),oss(12.1),蓝图反射(1.7),ue4 pak(6.2), 源码抄写和调试不做硬性要求. 按照计划,ue4热更新实际上落后了,重新调整下. 重 ...

  3. 美团热更新方案 ASM 实践

    作者: 李楠,环信 Android 工程师,本文为 CSDN 首发,版权归作者所有,未经允许,请勿转载. 责编: 唐小引,技术之路,共同进步.欢迎技术投稿.给文章纠错,请发送邮件至tangxy@csd ...

  4. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  5. Unity3D 热更新方案(集合各位专家的汇总)

    http://blog.csdn.net/guofeng526/article/details/52662994 热更新"这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟 ...

  6. React Native热更新方案

    随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行部分业务线的开发,也有不少使用 Hybrid 技术的公司转向了 Re ...

  7. React Native 热更新方案

    转载: https://blog.csdn.net/xiangzhihong8/article/details/73201421 随着 React Native 的不断发展完善,越来越多的公司选择使用 ...

  8. SDK全局热更新方案(全网唯一)

    大家好,我是拭心,这篇文章是一个好友 Divin 的投稿,介绍 SDK 热更新的一种实现思路,希望对你有所启发. 一.背景 App热更新 目前市面上成熟的商业热更新方案不少,有腾讯Bugly的Tink ...

  9. Android热更新方案Robust

    美团•大众点评是中国最大的O2O交易平台,目前已拥有近6亿用户,合作各类商户达432万,订单峰值突破1150万单.美团App是平台主要的入口之一,O2O交易场景的复杂性决定了App稳定性要达到近乎苛刻 ...

最新文章

  1. success or not?
  2. 在Eclipse中添加JDK源码包
  3. tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法...
  4. [转载] 整理总结 python 中时间日期类数据处理与类型转换(含 pandas)
  5. 利用PyInstaller打包exe文件
  6. Python设计模式:建造者模式
  7. python pandas中文手册-Pandas速查手册中文版(转)
  8. 基于netty实现gps jtt808协议接入
  9. 常见容错机制:failfast、failsafe、failover、failback
  10. Autosar诊断——故障诊断方案设计
  11. 1.(MySQL Router+MGR)MySQL Shell安装与用法
  12. FFMPEG视频编码 NVIDIA 和 INTEL 硬件加速 x265 8bit 和 10bit
  13. 1137: 查找最大元素 C语言
  14. 一次不常见的等待事件:RECO进程enq: DR - contention
  15. JAVA——JAVA知识点集锦(上)
  16. heaps 和 priority queue堆和优先队列的定义和数据结构表示
  17. Decision Transformer环境安装
  18. 关于MathType蓝多多的备忘录
  19. warning C4819 的解决方法
  20. Chips-2.0(二)DEMO工程综合实现

热门文章

  1. 浏览器下的CSS透明度
  2. MongoDB自增主键
  3. ACR2010_依那西普改善RA患者骨代谢
  4. BlogEngine 1.0中的编码问题及解决方案
  5. Linux之rpm包管理
  6. VSCode 搭建Vue开发环境之Vue CLI
  7. 《程序员代码面试指南》第五章 字符串问题 拼接所有字符串产生字典顺序最小的大写字符串...
  8. java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
  9. redis的spring的xml配置
  10. testNG安装一直失败解决方法