高可用、高可扩展的原生WebView通信架构的思考
一、为什么学WebView?
为什么学习Webview,主要是指WebView的应用场景,当前大环境里应用越来越广泛,主要有两方面的制约因素:
- 硬件,手机的性能,CPU 2.8GHz,内存RAM 12G,处理速度越来越快;
- 网络,应用的内容实时从服务器拉取,网络带宽高/延时低,5G,体验提高。
二、是否会替代原生开发?
不会。早在2012年就开始鼓吹html一统天下…
- 操作系统的原因,Android和iOS风格不同,如果实现原生效果,需要大量if-else;
- 很难做到html要和PC兼容(三端统一),宽高比例不同,PC大多为横向,手机大多竖向,同样需要大量if-else(包括responsive响应式开发);
- 小程序/uniapp,依赖微信平台,有政策风险,账号被封了怎么办?作为引流、辅助成不了气候,大型公司和主流App都不会考虑这个方案;
- 浏览器的兼容性是很复杂的工作,存在碎片化问题。
三、什么情况用html开发?
- 与操作系统风格无关的页面
1)游戏(完全定制化,unity3d/Cocos2d)一套生成三端
2)about页面、privacy页面、help页面、反馈页面、活动(抽奖、问卷)、电商类页面 - 页面层次很深,用户使用很少的页面,经常变化的页面。
四、Html需要和原生进行大量的通信(重要)
- 将WebView做成一个独立组件;
- 使用方便;
- 可扩展性,灵活的扩展通信能力;
- 可靠性;
- 可配置性;
- 全面详细的文档,swagger / javadoc / html;
- 升级部署,gradle -> artifactory pro -> gradle依赖(给其他团队使用)。
五、搭建WebView和Java的通信架构
- kotlin / compose,采用新的技术实战;
- View/ViewGroup,从Android诞生以来,当前Android的UI系统用的是View / ViewGroup,xml定义布局 + Java / Kotlin,命令式UI,已经过时;
- Swift / Flutter / Compose,独立的UI系统,声明式UI,数据驱动,推荐。
六、组件化实现
组件化,各个Module中的引用版本必须一致,否则编译失败。
组件之间没有横向依赖,如果依赖需要接口下沉(common),组件要提供给别人用,app是组件的组装器。
删除test相关,加快编译速度。
新建module -> library(webview + common + usercenter + base)
y依赖关系:app -> webview -> common(AutoService) -> base
6.1 这里common模块和base模块的区别
都像是工具类的作用,但是架构作用是不同的:
- common:所有的工程师都能改的代码
- base:框架、基类,架构师管理的代码
6.2 AutoService
常见的组件化方案有,各有优势:
方案 | 特点 |
---|---|
ARouter | 基因中自带支持从webview中调用、不用互相注册(不用知道需要调用的app的进程名称等信息)等 |
ComponentCaller | 集成简单、功能丰富、全程监控、改造老项目成本低等 |
AutoService | Google推荐、继承简单、功能强大 |
6.3 依赖传递:
- api/compile(gradle 3.0之前):相当于java的public,除了自己用,使用的地方也可以用,组件中一般使用api引入,方便连续依赖调用。
- implementation:相当于java的private,只能自己用。
不同组件里面重复的引入,打包之后不会重复
6.4 思考:使用WebView的方式有哪些?
- Fragment
- Activity->Fragment
- 为什么没有Compose?
目前Compose中没有独立的webview的组件,WebView仅仅是浏览器的盒子,没必要包装成一个AndroidView放到Compose中
6.5 定制化
- 显示title标题
- 是否显示actionBar
- smartrefreshLayout刷新
- loadSir加载状态处理(错误、失败……)
- ……
6.6 WebView页面三元素
WebView = Html(视图、元素) + CSS(样式) + JavaScript(交互、动态执行)
6.7 WebView包含四个部分
- WebView自身负责创建对象,加载URL,生命周期管理,状态管理
- WebChromeClient:辅助WebView处理Javascript对话框,网站图标、标题…
- WebViewClient:处理各种通知、请求事件
- WebSettings:配置管理
- JavascriptInterface
6.8 可靠性(OOM)
- webView 需要兼容90年代到目前为止所有的html,代码复杂度不亚于操作系统的复杂度,千万行代码工程。
- 独立进程只能针对Activity、Service,Fragment依附于Activity不能放到独立进程。
1) 实现:android:process=":customwebview"
2) 好处:操作系统以进程为单位,复杂容易崩溃,崩溃后不影响App(主进程)使用。
3) 副作用:需要使用AIDL跨进程通信
6.9 可扩展性
加命令 -> Webview -> addJavaScriptInterface(只有一个,不需要修改)
基于命令模式的设计框架 + AutoService
高可用、高可扩展的原生WebView通信架构的思考相关推荐
- 基于弹性计算平台——构建高可用、可扩展的应用
文 / 陈波 前不久,Facebook宣布投资10亿美元收购仅成立15个月的移动照片分享应用Instagram,消息传出时,人们不仅惊叹于这笔巨额的交易,更为这支13个人的小团队感到不可思议.Inst ...
- 【成为架构师课程系列】高并发系统设计的三大目标:高性能、高可用、可扩展
系统设计目标 1:如何提升系统性能? 提到互联网系统设计,你可能听到最多的词儿就是 三高,也就是 高并发.高性能.高可用,它们是互联网系统架构设计永恒的主题.在前两节课中,我带你了解了高并发系统设计的 ...
- 使用Amazon CDK部署基于Amazon Fargate的高可用、易扩展的Airflow集群
前言 Apache Airflow(以下简称为Airflow) 是一项由Airbnb在 2014 年推出的开源项目,其目的是为了管理日益复杂的数据管理工具.脚本和分析工具,提供一个构建批处理工作流的方 ...
- 9种高性能高可用高并发的技术架构
9种高性能高可用高并发的技术架构 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复工作. 所谓网站架构模式即为了解决大型网站面临的 ...
- 高可用高并发的 9 种技术架构!
高可用高并发的 9 种技术架构! 1.分层 分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一 ...
- 分布式高可用高并发物联网(车联网-JT808协议)平台架构方案
技术支持QQ:78772895 平台基于(<JT/T808-2011道路运输车辆卫星定位系统终端通讯协议及数据格式>以及<JT/T808-2013道路运输车辆卫星定位系统北斗兼容车载 ...
- 分布式系统 概念 高可用 高并发 学习笔记
分布式系统 概念 高可用 高并发 学习笔记 0. 分布式系统基本概念 0.1 背景 分布式系统是由一组通过网络进行通信.为了完成共同的任务而协调工作的计算机节点组成的系统.分布式系统的出现是为了用廉价 ...
- 微服务Springboot实战大揭秘/高并发/高可用/高负载/互联网技术-任亮-专题视频课程...
微服务Springboot实战大揭秘/高并发/高可用/高负载/互联网技术-320人已学习 课程介绍 Java架构师系列课程是针对有志向架构师发展的广大学员而设置,不管你是工作一到三年, ...
- 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统
亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统 1.高并发原则 1.1 无状态 1.2 拆分 1.3 服务化 1.4 消息队列 1.5 数据异构 1.6 缓存银弹 1.7 并发化 2 高可用原 ...
- 读书笔记:《亿级流量网站架构核心技术 -- 跟开涛学搭建高可用高并发系统》
from <亿级流量网站架构核心技术 – 跟开涛学搭建高可用高并发系统> 概述 一个好的设计要做到,解决现有的需求和问题,把控实现和进度风险,预测和规划未来,不要过度设计,从迭代中演进和完 ...
最新文章
- 同样在JavaScript中
- 跟我学Spring Cloud(Finchley版)-16-Zuul
- 熵的定义(很好的方法论工具尤其第三熵增益的计算)
- Bitcoin Unlimited发布BCH新版本,石墨烯技术迎来进展
- 学python可以做什么产品-学习Python到底有什么用?
- JBoss日志文件配置
- 一家创业公司,如何服务好数百企业?
- 玩转MySQL之Linux下的简单操作(服务启动与关闭、启动与关闭、查看版本)
- Android为网络请求自定义加载动画
- 识别物体是否存在_【科学实践Vol.1】带你玩转“人脸识别”
- 中国水泥基防水行业市场供需与战略研究报告
- Java之多线程断点下载的实现
- filenet java配置_技术的力量:IPFS新贵Filenet缘何采用Podt
- 成为一名二进制分析师需要用到的Linux二进制分析工具有哪些?
- SQL server 字符串 转 日期格式
- 【转】安装虚拟机VMware及在VMware下安装Ghost XP系统图文教程(附PQ分区及VMwa
- php 分页样式css样式,thinkphp5分页CSS样式代码
- 网易互联网(网易严选)测试开发工程师
- 数据结构与算法基础(王卓)(22):哈夫曼树
- web常见特效——floor电梯导航
热门文章
- Semantic-UI 的词语
- Python可视化--条形图
- 病毒制作实践小记:运行关机、蓝屏炸弹、进程关闭、拓展名病毒
- 南京南汽技工学校计算机专业是啥,计算机中心附近技术类学校
- 摄像头V4L2编程应用开发
- spring boot整合SpringSecurity-04 使用jwt的方式认证
- Urchin.exe使用说明
- dubbo admin安装中易踩坑点及解决方法
- Servlet思维导图总结
- c语言中 输出操作是由库函数,【判断题】在 C语言中,输入操作是由库函数scanf完成,输出操作是由库函数printf完成 。...