序
我本来还没有想着做一个属于我的博客网站,一个是认为自己写的东西本来就比较小众没什么人看,放在自己的博库里面孤芳自赏确实没什么意思,违背了原本我写博客的初衷。我原本的初衷是希望记录自己所学的同时,能够帮助那些希望理解原理,却苦于无法各种原因(或基础,或时间)无法更进一步的朋友。
最近Sharry(一个年纪比我小,比我厉害的大牛)强烈推荐我做一个属于自己的博客。最近简书不太稳定,加上本来简书上的读者并不多。用他的话来说就是,虽然研究的东西不是特别深奥,但是还是属于比较小众的一类。不如自己做个博客保存起来更好,而且也是自己往外界展示自己的一个途径。恰巧,最近公司也搭建了一个博客,我也在上面维护文档,顺手学了hexo相关的知识。也就顺势结合一点h5的小知识稍微定制一个属于自己博客。
正文
关于Android
本博客将会记录一个Android应用开发工程师应该熟知的源码。会从Android应用Framework,一路打通到内核。虽然关于Linux内核,我也不是特别熟悉,但是会一遍学习一遍总结成文章。为了成体系的总结成文章,下面介绍一下,我对Android应用的架构的理解:
这里是Android最为粗略的思维导图。Android为了兼容性,选择的是兼容性最好的Linux内核,其次在Linux内核基础上,增加一层c++编写的native Framework的层,为Android系统添加自己的核心特性(如AssetManager2,SurfaceFlinger等等)。如果顺着这个思路开发就会变成c/c++的开发,当时Google为了争取市场,选择了Java语言面向开发者。Android只有上述这些核心特性开发起来就十分繁琐,为了进一步缩减Java开发成本,Google又在这之上构建了Java编写的Framework层,这一层就有了大部分开发者十分熟悉的Activity等四大组件的管理,资源管理等等。
根据上面那个简单的思维导图,应用层开发者如果想要理解Android系统,那就必须从Java Framework层一路打通到Linux内核。唯有做到这件事情,你才能说我对Android熟悉了。
有了大体的印象之后,我们再来看看整个Android系统详细一点的构成图,也就是网上经常摆出来的经典图:
在这里,我们应用开发者对SystemApp并不需要多少兴趣。我们要关心的是从Java Api Framework开始的Framework层。
- 1.四大组件Activity,Broadcast,Service,ContentPrivder的启动流程与工作流程
- 2.View System。View(也就是每一个控件)的管理以及view的绘制流程,触点管理的IMS等
- 3.PackageManagerService Android系统是怎么安装apk,又是怎么解析的?
- 4.Resource 资源管理系统,Android管理资源的核心
- 5.Window Android中WindowManagerService怎么管理呈现给用户的窗口
- 6.Handler Android进程运行的核心机制
而这6点往往都会通过jni联通到native 核心库(core Libary)中,接下来的下面几点几乎所有的工作都在native下完成,对用户无感
7.Android Runtime(ART)这是Android运行的环境,里面包含了极大量的内容,如Zygote,虚拟机等等
8.SurfaceFlinger Android是如何渲染到屏幕上的。里面包含了大量的知识,如OpenGL es,Skia等等。
下面这一点就跑到Linux内核中的驱动,是Android设计最厉害的地方:
9.Binder进程间通信。可以说没有Binder,就没有Android。在Java Framework到native层所有的进程间通信都必须依赖Binder驱动做进程间通信。其透明性,让我们平时开发都没有注意到它的存在。
10.libc 这些都是封装好的一些系统调用,c/c++开发者常用的类。这一部分,如果我们想彻底理解Binder也需要对libc,以及系统调用有一定的理解。
当然,如果是音视频开发,我们还需要对Media Framework有研究。如果是硬件驱动开发,也要熟悉HAL层,该层会经过hwBinder进行隔离。还有SELinux的安全权限等等…
可以说Android系统是庞大且复杂的系统。想要完全熟悉它必须花十分大的功夫才行。但是,如果是应用开发者,我们需要阅读理解上述10点的源码其实就差不多了,而Framework开发者则需要了解更加深的层次才行。
不过也不要松一口气,应用开发者因为经常接触业务,实际上在github中开源了十分多设计精巧的第三方开源,我们必须要阅读器源码,并且理解它,大致上有如下的常用库:
1.Okio square开发的io读写
2.OkHttp square基于Okio开发的网络请求库,是当前最为热门的请求库
3.Retrofit 是基于OkHttp的动态代理的请求库,可以极大缩减我们的开发时间,也是最热门的
4.EventBus 进程内信号通信
5.RxJava 一个设计精巧,改变代码编写习惯的响应式异步工具
6.ARouter为代表的路由库,当业务繁重的时候且需要复用管理的时候,使用的解耦模块之间联系的工具
7.Tinker,RePlugin 等插件化库 虽然使用的不多,能够让你的App动态化。
8.Glide,Picasso 等图片加载库
下面这些库是基于对Linux内核,系统调用的理解编写出超越市面上绝大同功能性能的第三方库。是可选:
1.mmkv 一个基于mmap的磁盘缓存工具,比起SP更快捷
2.mars tx的一个基于socket优化弱网络的网络请求工具
…
在我看来,达到这个10点系统源码,8点第三库源码要求,大致上就是一个中级Android工程师的水平。真正的高级Android工程师,无论是内核,还是Android源码各个位置都是十分熟悉,并且有着十分大的广度,了解各个领域的知识,能够结合这些领域迸发出奇思妙想。但是不知道是不是我的层次比较低,所接触到很多顶着高级工程师的名头,却对这些东西不是十分理解,或许是经验堆积上来的能力,但是没看透问题的本质,只要同一个问题抛出不同的形式异常就可能让人焦头烂额。
当然,出路不仅仅只有一条,我们可以学习其他的来增加自己的实例,如音视频,大前端flutter等。
我也会持续更新关于OpenGL以及OpenCv的学习文章。
关于Flutter
flutter是现在比较火热的领域,因为它代表这一个未来。他可以做到在Android,web,iOS,甚至到桌面都能做到同一份代码处处运行。当然和Java的同一份代码处处运行的原理很相似,都是在不同的机器中依托在一个虚拟机环境中,让其能够运行起来。这是代码上运行的核心逻辑。
flutter还有更高级的表现能力,就是在不同的平台,ui实现的一致性。RN是用过映射的方式,分别管理iOS和Android。但是Android有但是iOS没有,iOS有而Android没有的控件怎么办?这就只能特殊处理了。但是flutter则是干脆抛弃两者所提供的ui特性,通过skia这个跨平台渲染库,自己重新处理整个渲染系统。
因此Flutter大致分为两个区域,一个是依托虚拟机的dart环境,一个是渲染引擎的engine环境:
能看到flutter会包含着自己的一个dart 的Framework层,其要职就是为了方便开发者开发,和所有的api做进一步的管理和规划。下面大致分为Shell模块,和dart虚拟机。Shell模块是指每一个flutter中的功能,在不同平台中的实现,意思是类似Shell命令一样能够控制原生,dart虚拟机则是dart的运行环境。
有了大体的印象之后,下面是一副更为详细的设计框架图,这里能看到整个Flutter面对Web和移动端采用是不同的引擎:
我们把关注点放在engine中大致的技术要点,就有现在最为常见的Flutter系统框架图:
这里我点出,一个入门级别的Flutter开发工程师需要阅读且理解哪些源码:
- 1.Flutter的启动流程
- 2.Dart Framwork中Widget,Element,RenderingObject之间的联系(每一个控件一个页面都是一个Widget)
- 3.阅读Dart虚拟机中Isolate的原理,Future的原理(dart 开发中随处可见的异步控制原理)
- 4.TaskRunner的工作原理(类似Android的Handler)
- 5.Flutter的渲染核心原理,是怎么把视图绘制到屏幕的(类似Android的View的绘制三大步骤,接着把图元数据收集起来放到Skia中绘制)
只有理解这些,Flutter才能说入门了。才能写出比较好的Flutter代码。
目录
如果等不及我移植文章到博客,可以先去我的简书里面,看相关的文章。
Android源码分析
待填充
Flutter源码解析
待填充
音视频
待填充
结束语
Flutter相关的文章估计不会这么快出,不过Android相关的文章已经到了SF的进度了,预计今年能完成绝大部分。
越是学习越是觉得自己无知,越是需要静下心一步一脚印踏踏实实的学习。正印证那个那句话:学海无涯苦作舟。
我也没有很强的毅力,不过能感觉到自己每学懂一点知识点,感觉自己距离一线大厂的门槛更近一步,就愈加有动力。