安卓基础工具分析与实践
接下来一段时间,我决定把安卓的常用基础工具做一个总结。以便给读者一些启示,算是抛砖引玉,或者是对自己研究心得的记录吧。(格式写的乱,读者自行脑补分段吧。。。)
1. 一个问题:安卓native层开发为什么可以用较少行代码实现一些复杂的业务逻辑操作?
对于这个问题,有些人可能觉得并不是,像Android中的AudioFlinger模块,太冗长、啰嗦,类之间的关系巨复杂了!还有OMXCodec编解码相关的内容也是绕的云里来雾里去!
2. 待介绍的内容
今天,我对于Audio的native框架、音视频编解码这些较上层的框架相关内容,暂且不做介绍,而是要介绍再下一层的东西。这一层,是在bionic之上,具体业务(像音视频编解码框架,audio框架)之下的一层,为公共基础库,可以被各个模块使用。
实现路径为system/core/libcutils/,头文件路径为system/core/include/utils/,编译出的库为libutils.so。
可以看到安卓多媒体中间件的源文件基本上都包含了这些头文件:#include <utils/xxx.h>,并且makefile都链接了这个库libutils.so。
3. 问题答案
上面问题的答案,就是“封装”!
4.为什么
上层的业务开发工作基于这些被严格测试和验证了的基础工具来展开,可以快速高效实现具体业务逻辑,把我们的精力和焦点放在具体业务逻辑上,而不是二者同时考虑。
一个通俗易懂的比喻,我们目标是造一辆山地车,主要精力是拿各个厂商的零件去组织装配就可以了,例如拿Shimano的变速器,拿米其林的轮胎等等。相反,另外一种做法不可取:山地车商又组织一批人力去攻克变速器和轮胎技术。
再有一个例子是,光刻机巨头ASML也不是每样东西都研究,像光学镜头这种东西也不得不从Carl Zeiss采购,NASA的哈珀望远镜的镜头也是让Carl Zeiss帮定制的。这个没办法,光学镜头人家研究了一两百年,自己短时间突击肯定达不到别人的高度。
这也体现了国际分工和全球化作用,那就是做自己最擅长的事情——业务聚焦。
5.具体介绍细节
回到这个问题点,可以这么说,只有把基础工具的实现原理了解清楚,上层业务开发才更快速和高效,而不用再从造轮子开始做起。读android中一些模块的实现,我们也不会因调用逻辑不清楚而晕头转向了。
接下来呢,我将利用几篇文章来介绍相关工具,并利用demo来验证这些工具。这些工具介绍都是基于Android4.4版本,demo都会上传至我的github仓库。
这些工具内容涉及线程类、原子操作、互斥锁、RefBase、容器类、堆栈调用、sharebuffer、hash类等等。以及应用于多媒体部分的更上一层的封装,像ALooper/AMessage/AHandler消息机制模型。
6.个人期望
我的目标让读者明白两点:如何实现 + 如何用。
。。。。。。
今天太晚了,就先写到这儿。