在Android上实现多进程构架的浏览器(浏览器开发)的讨论

2023-11-23 10:38

本文主要是介绍在Android上实现多进程构架的浏览器(浏览器开发)的讨论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  浏览器是互联网入口之一。PC端浏览器是多进程架构;客户端浏览器APP架构是单进程的,当然浏览器APP也可以设计为多进程架构。
  webkit浏览器,例如Android浏览器是单进程的。无论是开启系统浏览器,还是在应用中指定url通过intent调起,系统有唯一一个进程com.android.browser。
  多进程有不同方式,一种是应用的多进程,即父子进程,有一个主进程,有多个子进程;一种是独立的多进程。前者父子进程具有相同的用户ID,具有同样的安全策略,而后者可采用原生系统的安全架构。这两种方式都能解决稳定性和强健性。
  一个进程崩溃不会损害到其他进程以及操作系统。同时系统会严格的限制一个用户访问另外一个用户空间的数据。

 一个浏览器页面至少存在三个线程:js引擎线程(处理js)、GUI渲染线程(渲染页面)、浏览器事件触发线程(控制交互)。即使是线程模式,浏览器多个页面的时候也存在为数众多的线程。考虑当前的浏览器主要有两个对性能要求较高的两个部分:
  1.JS引擎,对于JS引擎,较旧的引擎一般都是单线程的,新的引擎都开始支持多线程的实现了,例如chrome的JS引擎中的webwork调度单元就是以多线程为基础的。
  2.Render引擎,对于Render引擎,涉及的面就更复杂,特别是最进HTML5中WebGL引入之后,涉及到的模块就跟多。所以从架构的方向上来说,偏向于进程实现,否则这么多的线程在一个进程中,系统的复杂度和维护成本会越来越高,同时可扩展性也变差。
  从移动SoC的发展来看,未来提供的可计算的单元越来越多,主流SoC都已经进入到八核阶段,以及相应的移动GPU也都4核,内存也从1G向4G过渡,总线也由32位向64位过渡,所以新的硬件架构下,进程模式的优势会越来越大。
  对于Android系统中的浏览器部分,不管是service也好还是Activity也好都是属于Application Framework的部分,他们的设计目的是不同应用之间的交互或者为系统提供应用间的交互,而对于浏览器这样基础的,庞大的应用,其内部各个引擎只为应用内部服务,所以不应该采用Application framework里面的组建来提供对外的服务接口,除非楼主希望完成一套标准话的Android浏览器架构。
  对于现存的浏览器来说基本都是采用本地化的C/C++库来实现这些功能。

  从浏览器服务于几乎没有动态的代码的网页,到大量网页转而使用动态网页,从含有大量javascript和flash的网页到像完全成熟的网络应用如GMail。浏览器一是必须要让这些应用互相分离,二是要解决好导致渲染引擎崩溃;三是要解决用户浏览的安全性。
  向用户提供多进程浏览。以期达到在浏览器中添加多进程浏览功能之后,即使是浏览器其中的一个进程出现了崩溃现象,其他的进程也不会受到影响的目的。类似Android虚拟机的实例。有很多的浏览器厂商采用了多进程标签浏览的概念,其中包括谷歌Chrome、微软IE8和Mozilla Firefox,而众多基于WebKit的浏览器也将在不久之后采用多进程标签浏览这个功能,例如苹果的Safari浏览器。其中大致包括:浏览器进程、渲染进程、插件进程和扩展进程。如果创建太多的进程,内存占用较大,电脑的性能会降低。对于较低配置的机器而言,长时间浏览会导致整个系统变慢甚至失去响应。影响用户体验效果。一般限定创建渲染进程的最大数量大多数情况下是20。同一个渲染器进程可以被用于多个站点。

> Android架构设计思想、原则及系统的核心
-- 浏览器的多进程构架从以下几个方面进行考虑: 
1. android 的service理解,考虑service实现多进程。 
2. 分析参考chrome多进程构架在android上的实现,提出渲染进程用service实现。 
3. 多进程构架的优缺点,比如从内存,ipc通信等方面 
4. 给出一个设计思路和实现思路。

-- Android架构设计
  1、Android的核心在Framework层,本质上,这是一个基于组件的应用开发系统,组件间通过消息(Intent)进行通信。一方面,Intent是通信信息的载体,另一方面,Intent也定义了Android组件的通信协议。
  2、Android的权限系统是基于Linux,但又增加了很多自己的控制模块。Android架设在Linux之上,因此,继承了Linux可移植性、用户管理机制、文件系统,等等。
  总体上来说,其分为以下几部分权限系统:
(1)userid : 继承于linux,对于多个app,通过shareuid的方式可以使用同一个userid,主要承担一些目录访问权限之类的工作,比如私有目录只能由同一uid应用访问。
(2)安装level:system level or app level,这个是根据应用的安装位置决定的,在system/app下安装的应用就是system level,在权限访问中会得到更多的权限,比如静默安装应用的权限等。
(3)permission : 这个是最主要的权限控制,一般开发者开发应用主要是接触这个部分,在这部分中,会根据应用在AndroidManifest.xml中声明的use-permission而在访问相应api或资源时判断其是否有访问权限,比如常用的android.permission.INTERNET等。
(4)signature: 签名,是Android权限系统中的重要组成部分,对于系统签名的应用,会有一些特殊的功能,而shareuid等特性也是需要同一签名作基础。此外,permission在设置/自定义其权限时也经常会使用到签名,比如控制只有我自己的应用才可以访问我自己定义的公开API。

  可以借鉴chrome多进程构架在android上实现多进程架构的浏览器设想。在Android中,进程概念相当薄弱。Android可以对组件所运行的进程做托管,依赖于进程托管,Android可以轻松支撑多任务多进程的应用模型。只要控制好多进程浏览开发的数量与内存占用的比例,解决好多进程构架的最大的优缺点之一就是对内存(CPU)资源的占用,如果能解决资源对内存的占用,及ipc通信等方面的用户体验,多程功能在Android上开发还是有价值的。除了组件,资源体系也是Android中比较特色的一块,它提供了完整的资源支持,可以用来描述一切与UI相关的内容,并实现多设备的适配。

  进程开销过大,不建议实现多进程,就目前安卓手机的配置而言,多进程必然导致高CPU高耗电,我相信用户更喜欢一个轻便快速的APP,进程是常驻的,通常来说为一个程序开启多个进程,是完全没有必要的,由此我们通常采用多线程的手段;
  线程好处显而易见,可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率;当然线程也不要设置过多,因为线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;多线程需要协调和管理,所以需要CPU时间跟踪线程;线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug;而且现在各种机型的配置不同,可以考虑因为机器配置CPU的采集而分配多少线程的思路;

  启动多个后台service进程,并发运行JS,CSS解析引擎,再通过一个前端service接收解析后的结果,生成渲染数据或者JS操作指令,根据渲染数据及JS操作指令,边执行,边渲染,经过几次渲染调整的过程,页面最终就会呈现出来. 
 多进程的优点: 
 1. 流水作业, 效率最大化, android是通过移植JAVA虚拟机来运行APP程序,虽然内存管理在不断得到优化,但频繁的内存分配及释放, 在ANDROID手机上也会难担重负. 流水化作业后,各工序分配的内存资源可分隔反复重用. 
 2 由于各工序分配在不同的service流水线进程中, 如果某工序所在流水线(即service进程)停止,可单独重启该作业流水线service,不会造成其它流水线停止. 缺点有: 进程之间的通讯通过IPC进行, 效率比共享内存低, 同时需要协调管理各进程的状态, 开发难度加大.

  对当前机器 CPU+内存+网络IO+磁盘IO 四项进行分析,多进程/多线程方式虽然是充分的利用了这前述的四项资源,但当大量的多进程/多线程的时候,内外存交换又成为了新的瓶颈。V8就是一个相当不错的解决的方案,基于事件的程序模式将是未来的一种趋势和方向。

-- 在Android上实现多进程构架的浏览器肯定是没有问题的。
  从浏览器的构架上来说,这样做合理吗?如果用进程的方式,无疑对内存的占用,系统的功耗这些都会产生问题。但是好处也是不容质疑的,采用进程的方式对稳定性的提高是不容质疑的。
 

这篇关于在Android上实现多进程构架的浏览器(浏览器开发)的讨论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/417334

相关文章

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU