打印
[资料分享]

安卓底层开发学习经验第三十三期

[复制链接]
1085|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这一期我们来简单的介绍一下Android浏览器,我们首先来看一下市面上浏览器主要内核的种类
浏览器的内核的实现必须要基于一个标准,比如一个HTML语句,不管什么浏览器他解析的结果一定是一样的,在浏览器中显示的内容也是一样的,这样大家才能使用HTML进行网页的编写。我们遵循的标准就是W3C的标准,现在最火的W3C应该就是html5标准的一个制定,这样大家都去支持H5,现在包括他的游戏、应用都很火,主流的浏览器内核包括下面几种:第一是trident,是我们熟悉的window IE使用的内核,这个也只有IE在用。第二个是Gecko,这个主要是firfox使用的内核。第三个就是大家熟悉的Webkit内核,这个内核是由苹果公司编写的,并且开源出来了,有很多用户一直在提交,但是提交入户的时候都是由苹果开发人员最后进行陌制的,苹果的浏览器Safari也是基于Webkit实现的,其中Webkit中会包含一个WebCore,他是这个浏览器中的一个排版引擎,比如我们写一个网页,他就是由WebCore来进行排版的,谷歌浏览器最开始也是基于Webkit实现的,但是后来想要做一些东西陌制到浏览器上边,发现受到苹果的限制,所以他就自己开发了一套Blink内核,这个内核也是开源的,现在有很多浏览器也在使用,其中最主要的还是chrome浏览器,其中Blink其实是属于WebkitWebCore组件的一个分支,他和WebCore的不同就是排版的不同,也就是JS这块的解析不同,还有就是浏览器的刷新和开启新的窗口,都是有一定区别的,这些就是浏览器当前主要的内核,而我们想要从事浏览器的开发,一个就是看开源的Blink,另一个就是看开源的Webkit,这两个都是可以着手去做的。那么在Android系统中我们最开始使用的浏览器的内核是Webkit的,在4.2以及以前的版本都是使用的Webkit,但是在4.4上用Blink替换了Webkit,这样我们手机内核主要是BlinkBlink要比Webkit有一定的优越性的,下面我们来看一下WebkitBlink的主要区别
他们的主要区别就是在js引擎这块解析的过程,我们Webkit JS引擎它使用的是JavaScriptCore我们来看一下他解析的过程。比如我们写一个标准的JS,他将源码下载下来之后,会将源代码翻译成抽象语法树,将语法树通过JavaScriptCore编译成为字节码,然后由CPU去执行这些字节码。在最初的版本中,字节码会被JavaScriptCore引擎解释执行
而我们Blink的具体实现是把JavaScriptCore替换成自己的V8引擎,这个V8要比JavaScriptCore先进很多,他把源码下载下来之后解析,也是转换成抽象语法树,但是他并不像抽象语法树转变成字节码或者其他中间表示,而是通过JIT编译器的全代码生成器从抽象语法树直接生成本地代码,减少这抽象语法树到字节码的转换时间,这一切都是在网页加载的时候完成的,虽然可以提高优化的可能,但是这些分析可能带来巨大的事件浪费,但是V8一直在发展,而且现在有的浏览器也可以直接调用底层C的一个程序,所以说Blink也一直在发展。通过抽象语法树我们知道,WebkitBlinkJS引擎是有一定区别的,还有一个区别就是我们chrome内核,他每开一个页面在里面都会有一个沙箱系统,会重启一个线程,所以说我们每启一个界面就会启一个线程,这个是比较浪费资源的,好处是当我们有一个页面发生错误之后不会导致我们整个浏览器发生崩溃,只会导致当前的页面崩溃,这个是和其他浏览器的一个区别,坏处就是占用的系统资源比较多,线面我们来啊可能一下Android中浏览器代码的一个目录
下面我们来看一下Android浏览器的整体结构
这个结构主要分为三部分,包括我们的应用层,它主要是做一个显示用,比如我们开一个窗口,然后传给我们的底层,底层再去做渲染,然后在这里做一个输入、标签管理、历史记录等,都是在上层来做的。我们中间层也就是webview层,就是做了一个适配,比如我们启动之后首先要创建一个webview,他中间会调我们的底层,download的时候我们会做一些底层的初始化,把整个chromeium给初始化起来。我们再来看chromeium主要内核做的事情,第一个就是监控我们的输入事件,当我们进行输入的话,我们底层也会截获到相应的按键输入消息,然后从浏览器中进行输入。第二个就是我们的Skia模块,他在Android中主要是做一些渲染,比如我们的字体,解析出来之后把字体做一个渲染的时候,都是通过Skia来完成的。第三个就是Https,这个就是我们请求页面都是通过这个模块来实现的,剩下的就是H5相关的,有JSCSS模块,WebGL模块这个是H5的一个标准,还有我们V8 JS引擎这块,还有Html5的一些标签,以及我们的Meida接口等等都是通过这个来实现的。还有一个比如我们手机使用微信之类的,他现在输入事件可以截获到我们sensor事件,这个sensor事件注册也是在这里完成的,并不是走的我们Android的接口。还有就是我们Meida处理的过程,如果是video的话那么它所走的接口在我们浏览器中他会回调我们java的接口去启我们系统的一个Meidaplayer,所以说我们在浏览器中,如果说支持H5标签的话,那么他直接走的就是Meidaplayer这个接口。这个就是我们Android浏览器的一个整体结构。当我们请求一个网页的时候,其实这是一个很复杂的过程,首先我们需要在应用层输入这个uri,输入完之后我们通过webview这层向下调,调给我们的chromeium这个接口,而chromeium内部使用的是一个多进程的工作方式,进程之间通讯很频繁,当我们拿到uri之后我们首先会做一系列的解析,解析完之后扔给我们的http这个模块,在通过这个模块去请求,请求过程中下载我们页面的过程其实就是通过WebCore进行排版,进行渲染的一个过程。比如我们使用手机浏览器看一个网页的时候会发现首先出来的是文字,信号不好的时候图片会慢慢刷出来,这个都是我们chrome这个内核所做的事情,而这个内核里面也添加了许多开源的库,这个就是我们Android浏览器的整体架构。
那么我们的浏览器为什么这么重要呢?首先现在的浏览器不能单独的看成一个浏览器,他也可以变幻成为各种应用。首先就是我们熟知的一个微信,当我们打开微信,如果朋友圈刷的很慢的话我们向下拖,会发现它使用的是一个X5的内核,也就是我们微信是基于浏览器的一个变种的应用,我们所浏览的所有东西都可以看成一个网页,为什么是网页,因为H5是一个标准的东西,我既可以在手机上使用浏览器访问,也可以在pc上使用浏览器访问,这个是不相关的,而且容易在我们后台做一些部署,我们只要把HTML5写好,那么使用我们微信去访问的话,对于浏览器来说他的东西都是一样的,而且现在浏览器底层的东西嵌入的越来越强大,我们有的现在在浏览器上直接调用camera模块,调用meida模块,播放东西不在需要插件,这个就是我们浏览器现在发展的至关重要的一点,而且浏览器也是我们流量的一个入口,所以现在很多家都在推浏览器,比如百度、UC等。第二个就是我们的百度浏览器,当我们下载一个百度手机浏览器的话就会发现,他看起来更像是一个应用,但是他的实质是一个浏览器,他在里面嵌加了很多应用,比如小说新闻等,当我们使用这个浏览器打开一个小说的话,那么从上边来看他用的是一个浏览器,但是其实他走的是native应用还是这个,现在还无从考证,但是他已经从浏览器中嵌加了这个东西,他更相当于一个native应用加我们浏览器应用的一个组合这种方式,所以百度浏览器用户还是很多的。第三个是NodeJS,他是做后台的一个软件,在国外能使用NodeJS的都在使用,他的实质就是把V8这个引擎给抠出来了,然后自己封装了一些JS的库,然后它使用标准的JS去做一些后台的开发,而JS语句的执行过程就是通过V8来做解析的,这个就是浏览器的另一种应用,他可以把JS拿出来,如果说我们使用JS做开发的话,如果很多同学都对JS比较熟悉的,那么这样开发起来更加快,因为JS有很多开源的库,拿过来就可以用。第四个就是我们WebOS的一个可行性,他的可行性是基于我们HTML5 的一个发展,硬件性能的不断提高JS引擎的效率不断提高和发展,以及我们市场的一个需求,这样WebOS才是有可能的现在好多厂商都在使用WebOS,做出产品,那么现在我们也可以尝试基于chrome这个内核或者webkit这个内核来开发相关的WebOS,当然这个难度肯定是有的,但是它有一定的可行性,而且是不断地随着硬件性能的提高和我们JS引擎软件效率的发展。这个就是浏览器的一个大概的介绍,这里只是给大家介绍了一些浏览器的相关知识以及相关的应用

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

315

帖子

16

粉丝