早前开展的计划因各种杂事而泡汤,而当遇到了具体任务后,在压力下花了两个多周的业余时间把这件事完成了。

这就是我的引以为傲的Mercury-Project,它的核心目标是移植一些Android底层轮子到Linux平台上。

1. 为什么要做这件事?

  Android的SDK是一个大而全的东西,有很多工具可供移植和使用,例如,安卓的MPEG4Writer,MPEG2TSWriter,OpenMAX、MediaCodec等,实现的很优美和完善。

我常常想学习这些子模块是如何实现的,那么就需要有一套SDK环境,修改代码编译后,再将so库放到手机中跑,但是这种调试方式有些缺陷:依赖手机硬件、编译时间漫长。

  因此,产生了这种想法:如何将这些基础工具进行跨平台化,移植到通用的Linux平台上?

2. 移植基础库的先后顺序性是什么?

  如果想做一个Linux平台的记录仪方案,那么就需要用到封装模块(muxer),怎么搞这个呢?手撸一个稳定、兼容性较强的ts_muxer,没有十天时间肯定搞不定,那么一个

捷径是移植现有成熟的方案,例如从FFmpeg的libavformat中抄过来,或者移植Android的MPEG2TSWriter(这个模块其实是muxer+writer),抄FFmpeg的较容易,但是抄Android

的不是那么容易,因为依赖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进行验证。

时间允许的话,我尽可能针对每一种工具的内部实现原理的进行介绍。

Android基础工具移植说明的更多相关文章

  1. Android基础工具类重构系列一Toast

    前言: 一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经. 本系列定位Android基础工具类重构.旨在记录实际项目中经经常使用到的一些工具类,比方Toas ...

  2. Android基础工具函数代码集

    整理在学习研究Android开发,编写了一些基本用到的工具集,现在整理分享(后续会持续更新,有问题还请指出). 1.HttpClient工具,使用Apache的HttpClient类实现get和pos ...

  3. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  4. Android自动化测试工具调研

    原文地址:Android自动化测试工具调研 - Stars-One的杂货小窝 Android测试按测试方式分类,可分为两种:一种是传统逻辑单元测试(Junit),另外一种则是UI交互页面测试. 这里详 ...

  5. Android开发工具全面转向Android Studio(2)——AS project/module的CRUD

    本文有些地方可能需要衔接Android开发工具全面转向Android Studio(1)——准备开发环境,读起来效果会更好. 这个世界很奇妙,所有的东西离不开CRUD,即增删改查.即使人本身也遵循这个 ...

  6. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  7. Android群英传》读书笔记 (1) 第一章 Android体系与系统架构 + 第二章 Android开发工具新接触

    第一章 Android体系与系统架构 1.Dalvik 和 ARTDalvik好比是一辆可折叠的自行车,平时是折叠的,只有骑的时候,才需要组装起来用.ART好比是一辆组装好了的自行车,装好就可以骑了. ...

  8. 【转】Android开发工具--android-studio-bundle-141.2288178

    原文网址:http://www.androiddevtools.cn/ AndroidDevTools简介 Android Dev Tools官网地址:www.androiddevtools.cn 收 ...

  9. Android基础_web通信3

    在Android基础_web通信2中,我运用的JSONObject是Android原生的json类,通过import org.json.JSONObject来导入. 还有另外一种更简单的方法,就是用G ...

随机推荐

  1. Vue+EasyPOI导出Excel(带图片)

    一.前言 平时的工作中,Excel 导入导出功能是非常常见的功能,无论是前端 Vue (js-xlsx) 还是 后端 Java (POI),如果让大家手动编码实现的话,恐怕就很麻烦了,尤其是一些定制化 ...

  2. buuctf-web-[极客大挑战 2019]BuyFlag 1

    打开网页,然后发现menu中有个buyflag的连接,点进去 如果你想买这个flag ,你必须是来自CUIT的一名学生,还必须回答正确的密码.简单了解,我们查看源码,发现思路 POST方式传入两个参数 ...

  3. moviepy音视频剪辑:headblur函数遇到的ValueError assignment destination is read-only问题及解决办法

    ☞ ░ 前往老猿Python博文目录 ░ 一.运行环境 运行环境如下: python版本:3.7 opencv-python版本:4.2.0.34 numpy版本:1.19.0 二.错误案例代码及报错 ...

  4. 第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer

    一. 概述 re模块的函数search.match.fullmatch.findall.finditer都是用于搜索文本中是否包含指定模式的串,函数的参数都是一样的,第一个参数是模式串.第二个是搜索文 ...

  5. PyQt(Python+Qt)学习随笔:model/view架构中支持QListView列表中展示图标的两种方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QListView列表视图中的项不但可以展示文字,也可以展示图标和复选框,同时可以指定项是否可以拖 ...

  6. PyQt学习随笔:Model和View之间的数据互动过程

    在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...

  7. PyQt(Python+Qt)学习随笔:QAbstractItemView的defaultDropAction属性

    老猿Python博文目录 老猿Python博客地址# 一.概述 defaultDropAction属性用于控制QAbstractItemView及其子类的实例视图中拖放时放下的默认操作.该属性的类型为 ...

  8. PyQt(Python+Qt)学习随笔:QAbstractItemView的autoScroll和autoScrollMargin属性

    老猿Python博文目录 老猿Python博客地址 QAbstractItemView的autoScroll属性用于确认鼠标在视口边缘时是否自动滚动内容,默认值为True,autoScrollMarg ...

  9. SpringCloud-服务间通信方式

    接下来在整个微服务架构中,我们比较关心的就是服务间的服务改如何调用,有哪些调用方式? 总结:在springcloud中服务间调用方式主要是使用 http restful方式进行服务间调用 1. 基于R ...

  10. SQL直接生成实体属性,简单粗暴型

    在java开发中,不可避免的要碰到根据表生成对应的实体,这个过程是比较机器且繁琐的,我也用过一些逆向工程的工具,比如IDEA自带的生成实体,还有网上开源的工具,用起来也是可以的. 我现在开发用的持久层 ...