Android基礎工具移植說明

早前開展的計劃因各類瑣事而泡湯,而當遇到了具體任務後,在壓力下花了兩個多周的業餘時間把這件事完成了。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進行驗證。

     時間容許的話,我儘量針對每一種工具的內部實現原理的進行介紹。

相關文章
相關標籤/搜索