顯示廣告
隱藏 ✕
看板 uefacool
作者 uefangsmith (uefang.bbs@ptt2.cc)
標題 [轉錄]Re: [請益] 手機程式開發與兼顧硬體能力
時間 2011年10月01日 Sat. PM 02:43:22


※ 本文轉寄自 uefang.bbs@ptt2.cc

看板 
作者 fcamel (飛啊!專心的小駱駝)
標題 [轉錄]Re: [請益] 手機程式開發與兼顧硬體能力
時間 Thu Sep 29 08:54:47 2011


※ [本文轉錄自 fcamel 信箱]

看板 
作者 fcamel.bbs@ptt.cc (fcamel.bbs@ptt.cc)
標題 Re: [請益] 手機程式開發與兼顧硬體能力
時間 Thu Sep 29 08:54:21 2011


看板 Soft_Job
作者 iincho (世界的盡頭)
標題 Re: [請益] 手機程式開發與兼顧硬體能力
時間 Thu Sep 29 01:25:57 2011



  既然有人希望在下介紹怎麼看Android code,這裡就稍微分享一下心得,
  不敢說每個模組都精通,但是大方向抓是抓得出來的,不過我不喜歡吊
  書袋,所以想看到什麼design pattern之流的不要太期待。

  首先講書,Android目前關於系統面寫得最好的是底下這本:

  Android技術內幕:系統卷, 作者楊豐盛,簡體書。

  網路上找得到部分試閱,不過後面的章節沒前面寫得好,但光看第三章就划算,
  對binder的講解應該是目前市面上最好的。

  應該很多人看過韓超那本"深入淺出 Android 系統原理及開發要點",
  不過就我來看這兩本根本不是同一個檔次的東西。

  台灣出的基本上只能買高煥堂寫的,其他的不要碰。高先生對系統的理解算非常強,
  就是欠了點文彩有些可惜,不過寫的東西比那些搞技術傳教的好多了,至少觀念
  都是正確的。

  寫AP的書我買的少,不特別做評論,不過還是一樣建議,優先考慮簡體書。

  再來講看code的大方向,首先你要知知道Android的分層:

  上層APP走Java,中層Middlware走C++,底層driver走C。
  再加上兩兩中間溝通的介面,所以你至少要會五個東西。

  總結來說,你要有基本的C/C++和Java程式語言閱讀的能力,然後你要懂JNI,
  不然永遠在Java那層繞吧,最後你要會寫一點Linux driver,
  不然ioctl下去你就不知道東西到哪去了。

  再來,你最好懂一些OS的基本概念,尤其要知道virtual memory的運作機制,最好
  懂一些program loader和shared library的概念。為什麼? 我個人的看法是這樣,
  你讀code的時候除了想辦法追出流程以外,也要能夠理解資料是怎麼搬動的,
  這在Android尤其重要,因為系統設計本質上就是分散的,大量依靠IPC傳遞資訊,
  所以當資料在不同process, user和kernel space搬來搬去的時候常會亂了套,
  當然你可以不用理這些,但是Android有一些很精巧的設計是靠這些東西在跑的,
  你不會就永遠看不出來為什麼這個系統在某些地方的設計概念是怎麼做的。

  我想這對純軟的人來說門檻應該不高,最終我們希望的是能更理解到看到一段
  code就知道程式的流程,並且每段程式/資料在記憶體的哪個位置。能做到這一步
  你對系統的掌握就比那些看圖說故事的好多了,比如說在Java的那層
  Message Handler,真的看懂我認為要能夠說出中間的資料怎麼傳遞的才算及格,
  而不是是A丟給B然後就會處理這樣的程度,很不幸的市面上的書籍大概都到這為止,
  好在我們手上還有source code和debugger可以利用。

  原則的東西講完來講細項,Android很大,但是有個東西一定要完全理解,
  就是binder。因為中間層的設計理念大量使用到這個機制,每個中間的框架,
  那些所謂的System service都是用OO包裝出一組架構,透過binder實踐
  Client/server通訊來完成功能的。所以你只要讀通一組service其他就是照套,
  然後就是針對子模組(Graphic Engine, Window system..etc)來了解,
  這樣大概花幾個月就能有個大概成果,重點是一個一個照順序去解,利用前面
  累積的經驗來加速後面的學習。

  關於這部分我推薦底下這位的博客

  http://blog.csdn.net/maxleng

  他寫的Android核心分析雖然不算太精細,但是概念的掌握算是寫的最好的,
  只是一開始往往看不懂必須等看code看到一定程度再回頭讀才會豁然開朗。
  這應該算是另一個文采不夠強的例子吧,感覺上都講了,但是就是少了那麼
  臨門一腳。

  另外單純講Binder有份文件不錯,沒有標題,作者我也不知道,到處翻到的。

  http://ppt.cc/M3rW

  大陸有些文件是照抄這份就是。

  最後是怪招,我這個人很懶,總是在想有沒有輕鬆寫意的方式可以幹活。
  讀code有沒有偷雞的方法? 有的,就是靠Google....

  一般說來我看到看不懂的東西第一會先去找有沒有人寫過概念性的介紹,
  比如說最近看AudioFlinger我就會敲AudioFlinger,然後配合一些程式
  裡面的關鍵字做搜尋,巴特....重點就是那個巴特...

  先找圖片....這真是個盲點啊...XDDDDD

  因為現在Android已經出來好幾年了,很多code對面的一堆傢伙都讀過,
  這些人不但喜歡寫博客還喜歡畫圖,所以可以看到一堆閒人畫出來的
  結構圖/UML圖,看到感覺有用的直接點進去看文,比在那邊一堆文章
  慢慢撈快多了,男人果然是視覺系的動物(啥),但是用這種方法要注意
  code的時效性,有時候人家寫的是舊版的東西,我的習慣通常是看個好幾個
  不同的文件然後統整一下再看code比對,順便檢查一下別人文章有沒有錯。

  不過以上方法碰到冷門一點的module就死了,這時候就要用工具,
  老美打仗都是用大槍就是這個道理,不要再相信精神戰力那套了。
  拿出source insight或是其他工具硬上吧,我個人是比較喜歡
  understand C++就是。不過要注意這些工具常常會有判斷錯誤的狀況,
  尤其是碰到動態註冊或是一堆template的狀況常常都死得很難看,
  真的找不出來的時候請反璞歸真暴力grep,不過說真的我不大能理解
  有很多人堅持不用這些工具堅持vim+ctag+grep就是,明明效率
  就是差了十倍有。

  剩下就是花時間,看不懂先去休息再回頭看,應該都會有不錯的效果。
  總之,備齊工具,抓大概念,各個擊破,如此而已。

--
Beware of bugs in the above code;
I have only proved it correct, not tried it.

--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.193.107
※ 編輯: iincho          來自: 114.32.193.107       (09/29 01:34)
Ting1024:超好文..雖然沒碰,但感覺這是很有趣 :)1F 09/29 01:34
akasan:最近 soft_job 噴好多好文出來喔2F 09/29 01:59
tac0wu:讚3F 09/29 02:15
andymai:推一下~不過說那些畫圖的人是閒人~會讓人家很受傷吧...4F 09/29 06:04
fissh:推看圖,不過我現在在做冷門(?)的module orz5F 09/29 07:54


--
"A camel watches the moon, it seems like he has something to say."
"The moon does nothing silently, like what it always does."

                                         --- The Mythical Camel-Moon
                              ( http://www.csie.nctu.edu.tw/~chlo/ )

--
※ 發信站: 批踢踢兔(ptt2.cc)
◆ From: 114.43.209.55
nfsnfs:我也想看Android技術內幕:系統卷這本書                 推1F 09/29 23:11
nfsnfs:轉錄至看板 nfsnfs                                        09/29 23:18

--
※ 看板: uefacool 文章推薦值: 0 目前人氣: 0 累積人氣: 27 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇