作者: iincho (世界的盡頭) 看板: Soft_Job
標題: Re: [請益] 手機程式開發與兼顧硬體能力
時間: Thu Sep 29 01:25:57 2011
標題: Re: [請益] 手機程式開發與兼顧硬體能力
時間: Thu Sep 29 01:25:57 2011
既然有人希望在下介紹怎麼看Android code,這裡就稍微分享一下心得,
不敢說每個模組都精通,但是大方向抓是抓得出來的,
首先講書,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)來了解,
這樣大概花幾個月就能有個大概成果,重點是一個一個照順序去解, 利用前面
累積的經驗來加速後面的學習。
關於這部分我推薦底下這位的博客
他寫的Android核心分析雖然不算太精細, 但是概念的掌握算是寫的最好的,
只是一開始往往看不懂必須等看code看到一定程度再回頭讀才會 豁然開朗。
這應該算是另一個文采不夠強的例子吧,感覺上都講了, 但是就是少了那麼
臨門一腳。
另外單純講Binder有份文件不錯,沒有標題, 作者我也不知道,到處翻到的。
大陸有些文件是照抄這份就是。
最後是怪招,我這個人很懶, 總是在想有沒有輕鬆寫意的方式可以幹活。
讀code有沒有偷雞的方法? 有的,就是靠Google....
一般說來我看到看不懂的東西第一會先去找有沒有人寫過概念性的介 紹,
比如說最近看AudioFlinger我就會敲AudioFli nger,然後配合一些程式
裡面的關鍵字做搜尋,巴特....重點就是那個巴特...
先找圖片....這真是個盲點啊...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 :超好文..雖然沒碰,但感覺這是很有趣 :)
推 akasan :最近 soft_job 噴好多好文出來喔
推 tac0wu :讚
推 andymai :推一下~不過說那些畫圖的人是閒人~會讓人家很受傷吧...
→ fissh :推看圖,不過我現在在做冷門(?)的module orz
推 alongalone :agree~~~ 可是binder好難懂阿...(爆)
推 littlebau :推 最近好文真的很多
→ leiyan :最近是淡季大家比較閒
推 howdonc :thanks
推 lwecloud :
推 CGary :這篇文章好 推...
推 Asciiss :推 :D
推 yangyr :讚喔~ 等linux kernel的書k完再來trace
推 atpx :好文!! 不過看不懂 0rz....想來自修點iOs開發
推 saxer :高老的書有時寫的很玄 但他OOP的概念是很精通的
→ saxer :但他的演講真的很嘴砲XD
→ zekewang :其實簡而言之就是要對OS設計模式很熟啦...
→ zekewang :對面的不光android,連MTK的code都流出來了...
→ zekewang :其實資訊的書籍~這幾年,仔細觀察..會發現國內能寫敢寫的
→ zekewang :越來越少了~反而對岸最近幾年進步神速~很多都可以找到
→ zekewang :簡體版的文章或是書籍~~因此如果自認基礎不夠的話
→ zekewang :可以看簡體版幫助釐清android設計概念
→ iincho :某種程度上Android在設計上遠超過傳統的OS設計....
→ iincho :所以說傳統OS很熟我想應該是不大夠的...
→ zekewang :如果自認底子好的話..相信看source以及SDK就足以了
→ andymai :但我有點覺得對岸進步是一定的~怎麼可能那麼多人全都廢材?
→ andymai :而且...已經一堆人都跑去對岸了...Orz
→ iincho :當初有東西拆了兩個禮拜看出門道,結果上網一翻早有人寫了
→ iincho :就速成來說看對面寫的東西的確會快很多...
→ zekewang :當然..android這台拼裝車~用了很多非傳統OS課本所說的
→ iincho :不過也很很多東西沒人寫或是講不清楚,對面也一堆東西抄的
→ iincho :當初在看zygote的東西也找過資料,幾乎都只講到皮毛..
→ iincho :關鍵點不是沒人寫就是腦補,所以很多地方還是要自己看啦
→ andymai :噗~常常看到一字不漏copy貼上的~而且還是錯的...XD
→ iincho :所以說這是歪招啊,對自己能力有把握的才能用這種方法加速
→ iincho :靠這方法賺了不少打電動時間就是, 初學者的話就怕看不出錯
→ zekewang :其實如果能夠的話...想摸android kernel建議dalvik是捷徑
→ iincho :我反而不大建議從dalvik開始看,如果就台灣硬體廠的工作
→ iincho :看這塊投報率太低,當興趣倒是無妨。
→ zekewang :投報率太低??錯了~~這塊是增進功力最快的地方~
→ zekewang :我不以可以找的工作內容來論...但增進功力的成果是自己的
→ iincho :大部分的工作用不到, 我是說真的...XD
→ iincho :雖然我自己看得很爽但是我不會建議人家從這裡開始看
推 akasan :最近 soft_job 噴好多好文出來喔
推 tac0wu :讚
推 andymai :推一下~不過說那些畫圖的人是閒人~會讓人家很受傷吧...
→ fissh :推看圖,不過我現在在做冷門(?)的module orz
推 alongalone :agree~~~ 可是binder好難懂阿...(爆)
推 littlebau :推 最近好文真的很多
→ leiyan :最近是淡季大家比較閒
推 howdonc :thanks
推 lwecloud :
推 CGary :這篇文章好 推...
推 Asciiss :推 :D
推 yangyr :讚喔~ 等linux kernel的書k完再來trace
推 atpx :好文!! 不過看不懂 0rz....想來自修點iOs開發
推 saxer :高老的書有時寫的很玄 但他OOP的概念是很精通的
→ saxer :但他的演講真的很嘴砲XD
→ zekewang :其實簡而言之就是要對OS設計模式很熟啦...
→ zekewang :對面的不光android,連MTK的code都流出來了...
→ zekewang :其實資訊的書籍~這幾年,仔細觀察..會發現國內能寫敢寫的
→ zekewang :越來越少了~反而對岸最近幾年進步神速~很多都可以找到
→ zekewang :簡體版的文章或是書籍~~因此如果自認基礎不夠的話
→ zekewang :可以看簡體版幫助釐清android設計概念
→ iincho :某種程度上Android在設計上遠超過傳統的OS設計....
→ iincho :所以說傳統OS很熟我想應該是不大夠的...
→ zekewang :如果自認底子好的話..相信看source以及SDK就足以了
→ andymai :但我有點覺得對岸進步是一定的~怎麼可能那麼多人全都廢材?
→ andymai :而且...已經一堆人都跑去對岸了...Orz
→ iincho :當初有東西拆了兩個禮拜看出門道,結果上網一翻早有人寫了
→ iincho :就速成來說看對面寫的東西的確會快很多...
→ zekewang :當然..android這台拼裝車~用了很多非傳統OS課本所說的
→ iincho :不過也很很多東西沒人寫或是講不清楚,對面也一堆東西抄的
→ iincho :當初在看zygote的東西也找過資料,幾乎都只講到皮毛..
→ iincho :關鍵點不是沒人寫就是腦補,所以很多地方還是要自己看啦
→ andymai :噗~常常看到一字不漏copy貼上的~而且還是錯的...XD
→ iincho :所以說這是歪招啊,對自己能力有把握的才能用這種方法加速
→ iincho :靠這方法賺了不少打電動時間就是, 初學者的話就怕看不出錯
→ zekewang :其實如果能夠的話...想摸android kernel建議dalvik是捷徑
→ iincho :我反而不大建議從dalvik開始看,如果就台灣硬體廠的工作
→ iincho :看這塊投報率太低,當興趣倒是無妨。
→ zekewang :投報率太低??錯了~~這塊是增進功力最快的地方~
→ zekewang :我不以可以找的工作內容來論...但增進功力的成果是自己的
→ iincho :大部分的工作用不到, 我是說真的...XD
→ iincho :雖然我自己看得很爽但是我不會建議人家從這裡開始看
沒有留言:
張貼留言