早前开展的计划因各类琐事而泡汤,而当遇到了具体任务后,在压力下花了两个多周的业余时间把这件事完成了。html
这就是个人引觉得傲的Mercury-Project,它的核心目标是移植一些Android底层轮子到Linux平台上。git
1. 为何要作这件事?github
Android的SDK是一个大而全的东西,有不少工具可供移植和使用,例如,安卓的MPEG4Writer,MPEG2TSWriter,OpenMAX、MediaCodec等,实现的很优美和完善。ionic
我经常想学习这些子模块是如何实现的,那么就须要有一套SDK环境,修改代码编译后,再将so库放到手机中跑,可是这种调试方式有些缺陷:依赖手机硬件、编译时间漫长。工具
所以,产生了这种想法:如何将这些基础工具进行跨平台化,移植到通用的Linux平台上?oop
2. 移植基础库的前后顺序性是什么?学习
若是想作一个Linux平台的记录仪方案,那么就须要用到封装模块(muxer),怎么搞这个呢?手撸一个稳定、兼容性较强的ts_muxer,没有十天时间确定搞不定,那么一个测试
捷径是移植现有成熟的方案,例如从FFmpeg的libavformat中抄过来,或者移植Android的MPEG2TSWriter(这个模块实际上是muxer+writer),抄FFmpeg的较容易,可是抄Androidspa
的不是那么容易,由于依赖Andorid的底层基础库。调试
例如,MPEG2TSWriter模块,用到了管理类对象的sp/RefBase,用到了消息/反射机制ALooper/AMessage/AHander。
前者是安卓大厦的根基之一(实现路径:system/core/libutils),任何native层开发几乎都离不开它;
后者是native层中多媒体系统子模块开发的基础工具(路径为这个:frameworks/av/media/libstagefright/foundation/),从名字foundation中也能够看到端倪,这里要补充一点:
这个foundation其实又是依赖libutils的,它是对libutils的更上一层的封装。
所以,能够初步总结出,其依赖链:MPEG2TSWriter -> foundation -> libutils。
libutils又依赖什么?Bionic!这个是什么呢?是Android版的标准C库,等价于通用Linux平台的glibc库。两者都是C标准库的不一样实现方式,其提供的接口、功能行为在不一样平台上
都是一致的,所以移植工做能够在libutils这一层次上结束。
因袭,结论是:移植的前后顺序,先libutils,再foundation,最后MPEG2TSWriter。
3. Android为何搞这么复杂?
确实是比较复杂,但层次性很是好!一个东西流行必有其内部脊髓所在!这也是安卓生态圈繁荣的根源吧。
软件开发,一个很是重要的概念,就是分层,这个跟其余行业相似。
例如,我D目前收割群众的主要方式——房地产行业。
盖房子,其实也分不少层次,最底层是最廉价,也是最容易被人忽略的,也是最重要的。
盖房子最底层是什么呢?作砖头这一古老行业!再往上一层是批发经销砖头的,再往上是施工工程队。
施工工程队能够对比于软件开发的上层,它不可能什么事情都要亲力亲为,例如从开砖窑厂、挖泥巴、烧制砖头开始搞?那岂不又回到了原始社会!
现代社会的主要特色是精细的社会分工,每一个人都干本身擅长的事情,你们的劳动成果整合起来,造成一件完美的艺术品。
4. Mercury-Project名字的由来
Mercury中文名称为“水星”,是太阳系中最内层的行星。
起名字也是一门哲学,每一个人都有一个名字,你们有谁想过人为何要起名字?哈哈。。。
起这个名字,毫不是意味着我要或者我想移民水星!!!水星朝向太阳一面温度400多度,背向的将近零下200度,那谁受得了?!
NASA发射的水星探测器也几乎受不了,呵呵。。。
起这个名字寓意Android就是那个太阳,水星要吸取太阳散发出来的光和热!
5. 项目目前进展
libutils大部分工具已移植完毕,foundation中经常使用的工具移植完毕,而且针对这两个库中提供的工具,编写了诸多测试用例。
下一步的任务,是把libutils中所有工具都移植完毕,再有就是,对移植的工具,编写齐全的demo case进行验证。
时间容许的话,我尽量针对每一种工具的内部实现原理的进行介绍。