楊云君,《Android的設(shè)計(jì)與實(shí)現(xiàn) 卷Ⅰ》作者,資深A(yù)ndroid系統(tǒng)專家,不僅在Android應(yīng)用開發(fā)方面積累了豐富的經(jīng)驗(yàn),而且精通Android系統(tǒng)級(jí)開發(fā)和性能優(yōu)化,對(duì)整個(gè)Android系統(tǒng)的架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)原理有十分深入的研究和透徹的認(rèn)識(shí)。
[[77393]]
以下為小編對(duì)楊云君作者的訪談內(nèi)容:
小編:請(qǐng)和大家介紹下您及所從事的工作?
楊云君:
2006年大學(xué)本科畢業(yè),此后在企業(yè)級(jí)應(yīng)用領(lǐng)域做過網(wǎng)銀中間件和運(yùn)營系統(tǒng)。
2009年初涉足移動(dòng)通信平臺(tái),開始接觸Symbian和Android。
到目前為止,一直從事Android應(yīng)用層,系統(tǒng)框架層的研發(fā)工作,主要解決ANR,OOM,System Server Watchdog、性能優(yōu)化以及系統(tǒng)級(jí)調(diào)試等問題。
小編:您是如何踏上Android開發(fā)這技術(shù)領(lǐng)域的?
楊云君:
踏上Android領(lǐng)域可以說有點(diǎn)陰差陽錯(cuò),起因要從2008年開始說起。2008年可以說是一個(gè)讓大多數(shù)人悲喜交加的年份,雪災(zāi)、地震、奧運(yùn)、金融危機(jī)、企業(yè)大裁員以及后來的房價(jià)大跌。這么多大事集中在一個(gè)年份,人總是要有些改變的,不能改變的那只有神了。那一年Java EE及其衍生品SSH(Struct+Hibernate+Spring)在很多領(lǐng)域已經(jīng)是遍地開花,掌握這個(gè)領(lǐng)域技術(shù)的人才已經(jīng)飽和,一些有規(guī)模的公司已經(jīng)具備完善的程序庫并形成了自己的開發(fā)模式。很多時(shí)候,開發(fā)變成了“配置+Copy/Paste+數(shù)據(jù)庫”的簡單模式,Java EE再也不是那個(gè)熟悉EJB便被奉為牛人的輝煌時(shí)代了。隨之而來的是大量低技能從業(yè)者的涌入,在此期間也遇到過不少有趣的事情,下面列舉一二:
a.公司招聘的新人問為什么String s = “abc”這句要加String?
b.新人不懂指針,我問:大學(xué)里都學(xué)過C語言,指針應(yīng)該都學(xué)過了。新人答曰:我們老師都不會(huì),講到指針就略過去了。
c.公司里很多人,不會(huì)使用Linux和Oracle數(shù)據(jù)庫,甚至都不會(huì)安裝,甚至多次不會(huì)安裝。
大家可能會(huì)說,你這什么公司啊,我們公司的人就比這個(gè)強(qiáng)!!實(shí)不相瞞,上述事件就發(fā)生在國際知名的世界500強(qiáng)軟件公司。
上述事件,不足以說明問題,但我已經(jīng)隱隱感覺到這個(gè)領(lǐng)域是沒有出路了。改變的種子已經(jīng)埋下了,但不知道改變什么,如何改變。
上述事件發(fā)生后,時(shí)間就到了2008年的下半年,我有幸被派去國外總部出差學(xué)習(xí),接觸了國外的軟件從業(yè)者。本以為國外從業(yè)者的狀況會(huì)比國內(nèi)好一些,可一個(gè)月過去了,我發(fā)現(xiàn),他們也好不到哪去,只有核心的幾個(gè)人承擔(dān)核心的工作,其余的人還是在打醬油。于是我開始慌了,都是打醬油,那老人如何比新人更優(yōu)秀呢?難道打更多的醬油?
就在此時(shí),美國金融危機(jī)全面爆發(fā)(以美國兩大房貸巨頭暴跌為標(biāo)志),公司在其母國開始重組并裁員。那時(shí)候我并沒有意識(shí)到問題的嚴(yán)重性,或許大多數(shù)人都沒意識(shí)到,都沉浸在奧運(yùn)的歡樂中(呵呵!有朋友炒了幾張奧運(yùn)門票賺了幾萬)。
時(shí)間過的飛快,一段時(shí)間的學(xué)習(xí)結(jié)束后,我便回國了,在國內(nèi)分公司繼續(xù)任職。趁著奧運(yùn)的余溫,我也樂呵了一段時(shí)間,暫時(shí)忘記了煩惱,晃蕩到2009年。
可好景不長,金融危機(jī)遠(yuǎn)比想象的嚴(yán)重,國內(nèi)分公司也開始裁員了,裁員規(guī)模遠(yuǎn)超想象,幾乎每天都有多名同事離開。離開的還好,反正橫豎都是走人,最痛苦的是沒離開的,天天沉浸在折騰中,那種心情可想而知。
大半年折騰過去了,發(fā)現(xiàn)500多人的公司還剩下一100來人,我就被剩下了。總算做了回“剩人”,好歹不是“剩男”。在有些人看來,剩下總是好的,據(jù)說有離開的同事,1年沒找到工作。
大裁員過后,我雖然被委以重任,但我已經(jīng)不想繼續(xù)在這個(gè)領(lǐng)域里發(fā)展了,此時(shí)我突然想到在國外出差時(shí)候,有幾個(gè)同事在擺弄一個(gè)叫Android的東西,于是開始看Android方面的資料,周圍的同事看到我在學(xué)習(xí)android,便給我推薦了Symbian系統(tǒng),于是我Symbian和Android一起看,后來覺得Symbian沒有前途,便毅然學(xué)習(xí)Android。現(xiàn)在想想當(dāng)初真懸,如果學(xué)了Symbian,現(xiàn)在不知道去哪哭了,看來獨(dú)立思考的能力是很重要的。
打定主意后,便開始準(zhǔn)備了,之后又發(fā)生了一些足以改變我一生的事情,就不便多說了。再后來,告別了器重我的國外領(lǐng)導(dǎo),降薪進(jìn)入一家國內(nèi)領(lǐng)先的Android方案公司。
小編:您從事Android開發(fā)這么多年,已然是一個(gè)老兵,您是如何一路堅(jiān)持走到今天的?
楊云君:
從2009年從事Android至今已經(jīng)4年多了。09年降薪從Java EE領(lǐng)域轉(zhuǎn)入Android領(lǐng)域,主要是因?yàn)檫@個(gè)領(lǐng)域基本是一片空白,如果后續(xù)普及,自己可以有先入者的優(yōu)勢(shì),冒點(diǎn)險(xiǎn)是值得的。2011年Android大爆發(fā),用人需求大增,最多的時(shí)候一天接到70多個(gè)面試電話,周圍陸續(xù)有同事另謀高就,這時(shí)候我覺得Android市場(chǎng)已經(jīng)有很大的泡沫了,一旦泡沫破滅,很多公司都要玩完(可以參考上次手機(jī)泡沫破滅的例子)。于是我也隨大流迅速換公司,進(jìn)入一家更穩(wěn)定的公司。一路堅(jiān)持至今,是想自己的技能獲取***的價(jià)值。
小編:據(jù)了解,最近您推出了一本新書——《Android的設(shè)計(jì)與實(shí)現(xiàn) 卷Ⅰ》,而這書是針對(duì)Android四層架構(gòu)中的某一層編寫的,什么原因促使您寫了這本書?可以分享一下寫書過程中印象深刻的經(jīng)歷么?是否還有著書的計(jì)劃?
楊云君:
《Android的設(shè)計(jì)與實(shí)現(xiàn) 卷Ⅰ》是我的***本書,這本書主要針對(duì)框架層的核心模塊的運(yùn)行機(jī)制進(jìn)行詳細(xì)分析。我的初衷是想寫一本性能優(yōu)化的專著,可后來發(fā)現(xiàn),如果讀者不理解框架層的運(yùn)行機(jī)制,性能優(yōu)化一說只能泛泛而談。因?yàn)樾阅軆?yōu)化涉及應(yīng)用層,框架層,運(yùn)行庫和內(nèi)核層等,應(yīng)用程序開發(fā)者往往只在應(yīng)用層理解應(yīng)用程序的運(yùn)行機(jī)制,而系統(tǒng)層面的問題很少涉獵,這樣的話,很難以系統(tǒng)的視角分析性能問題以及ANR,OOM等問題。以ANR為例,其成因大約有十幾類,其中大多數(shù)都是系統(tǒng)層面的問題,而非應(yīng)用程序本身的問題。至于是否還有著書計(jì)劃,要看市場(chǎng)和讀者的反饋。
小編:Android Framework在Android系統(tǒng)中處于怎樣的地位?
楊云君:
Framework在Android系統(tǒng)中處于一種承上啟下的地位。承上的意思是框架為上層應(yīng)用提供api和運(yùn)行機(jī)制;啟下的意思是框架屏蔽了下層的復(fù)雜性,為上下層的交互定義了一套規(guī)范。
小編:Android Framework運(yùn)行在Linux內(nèi)核之上,Binder 是Android對(duì)Linux內(nèi)核層的一個(gè)擴(kuò)展,您能簡單介紹下Binder的機(jī)制和實(shí)現(xiàn)么?
楊云君:
從Android體系結(jié)構(gòu)的角度看,Binder是Android對(duì)Linux內(nèi)核層的一個(gè)擴(kuò)展,屬于字符設(shè)備驅(qū)動(dòng),Android便是通過這個(gè)驅(qū)動(dòng)程序?qū)崿F(xiàn)不同進(jìn)程之間的間接通信。Android通過對(duì)Binder驅(qū)動(dòng)的封裝,提高了一套Binder操作的框架,便于上層使用,這樣Binder的概念便不僅僅是一個(gè)驅(qū)動(dòng),而是拓展為一種架構(gòu)。通過這種架構(gòu),Binder實(shí)際上成為“框架的框架“,Binder框架分成Native層和Java層兩部分。Android吸收了組件化的設(shè)計(jì)思想,將大量核心功能放在不同的Service組件中實(shí)現(xiàn),需要使用這些功能的其他組件,可以通過系統(tǒng)提供的接口訪問這些Service。提供服務(wù)的組件和使用服務(wù)的組件可以運(yùn)行在不同的進(jìn)程中,通常把Service組件所在的進(jìn)程稱為Server進(jìn)程,把使用Service的組件所在的進(jìn)程稱為Client進(jìn)程,這其實(shí)是一個(gè)C/S體系結(jié)構(gòu)。Binder變?yōu)檫@種體系結(jié)構(gòu)提供進(jìn)程間通信功能。
小編:您有這么些年的Android開發(fā)經(jīng)歷,對(duì)Android應(yīng)用層,框架層源碼開發(fā)以及性能優(yōu)化有著深入的研究和認(rèn)識(shí),在學(xué)習(xí)上有什么心得可分享?Android應(yīng)用開發(fā)者和系統(tǒng)開發(fā)者怎么高效的學(xué)習(xí)Framework呢?需要掌握哪些技能?
楊云君:
學(xué)習(xí)一門技能,最重要的是兩個(gè)方面:合適的項(xiàng)目經(jīng)歷和主動(dòng)的自學(xué)能力。技術(shù)總是在變化的,但核心的東西萬變不離其宗。學(xué)習(xí)者應(yīng)該把一個(gè)模塊徹底搞明白,即便后續(xù)版本有變化,也能很快適應(yīng)。理解框架層的運(yùn)行機(jī)制是一個(gè)合格應(yīng)用開發(fā)者必備的技能,但框架層浩如煙海,學(xué)習(xí)框架層必須循序漸進(jìn)各個(gè)擊破,不能眉毛胡子一把抓,比較好的入門路線可以參考《Android的設(shè)計(jì)與實(shí)現(xiàn) 卷Ⅰ》的論述,***以Binder框架層、Package Manager、消息機(jī)制、Activity Manager等模塊入手。
小編:您作為一位專門從事Android手機(jī)定制和開發(fā)的工程師,可以談?wù)剬?duì)Android系統(tǒng)的認(rèn)識(shí)么?
楊云君:
Android系統(tǒng)是一款優(yōu)秀的智能手機(jī)操作系統(tǒng)之一。沒有Android的普及,大多數(shù)人可能還停留在以Symbian為代表的功能機(jī)時(shí)代。Android的優(yōu)點(diǎn)不必多說,相信大家都比較認(rèn)同。Android不足的地方主要體現(xiàn)在性能方面,這個(gè)隨著系統(tǒng)的完善,或許會(huì)進(jìn)一步優(yōu)化。
小編:目前有很多Android的手機(jī),商家為滿足一些需求都會(huì)修改rom然后定制它們,這樣很容易導(dǎo)致開發(fā)的功能在不同的手機(jī)上顯示各不同,產(chǎn)生各種問題。面對(duì)這樣的情況,解決此類問題您有什么建議?
楊云君:
Android既然是開源的操作系統(tǒng),廠商定制是不可避免的,這個(gè)就需要應(yīng)用程序開發(fā)者和美工配合做好不同機(jī)型的適配工作。
小編:要成為一位優(yōu)秀的開發(fā)者,是否存在快速成長的捷徑?普通程序員如何一步步向優(yōu)秀的開發(fā)者目標(biāo)靠近?
楊云君:
我想,快速成長的捷徑只存在于天賦極好的人身上,大多數(shù)人還是需要不斷的主動(dòng)學(xué)習(xí)和項(xiàng)目鍛煉才能快速成長。普通程序員要想一步步向優(yōu)秀開發(fā)者的目標(biāo)靠近,不斷的主動(dòng)學(xué)習(xí)和項(xiàng)目鍛煉是很必要的。不斷的主動(dòng)學(xué)習(xí),就是要不斷夯實(shí)自己的編程基礎(chǔ),對(duì)Java、C++、C等基礎(chǔ)語言需要有一定的掌握,對(duì)基本的算法有一個(gè)足夠的理解。項(xiàng)目鍛煉指的是要早項(xiàng)目中鍛煉自己分析問題和解決問題的能力,并總結(jié)經(jīng)驗(yàn)。
小編:不同的Android開發(fā)階段,需要掌握的知識(shí)也不同,更清晰的了解自己處于哪一階段哪一水平對(duì)開發(fā)者來說很重要,您可否對(duì)學(xué)習(xí)Android的開發(fā)者提供一個(gè)發(fā)展規(guī)劃呢?
楊云君:
要清晰自己所處的階段,必須首先熟悉Android的體系結(jié)構(gòu)中各層涉及的技術(shù)。初學(xué)者往往以為Android是以Java編寫的,這是極大的錯(cuò)誤。Android是集Java、JNI、C++、C、匯編,腳本,Linux,modem、硬件體系結(jié)構(gòu)等等于一身的集大成者。通常應(yīng)用層主要以Java為主,框架層以JNI、C++和C為主,編譯模塊以腳本為主,內(nèi)核層會(huì)涉及l(fā)inux操作系統(tǒng),以C和ARM匯編語言為主,此外還有特定硬件的實(shí)現(xiàn)庫以及modem主要也以C和匯編為主。可見框架層是Java和C語系的分水嶺。以Java為主的開發(fā)者,可以應(yīng)用層和框架層為重心,以C語系為主的開發(fā)者,可以內(nèi)核、modem為重心。我的初衷是以《Android的設(shè)計(jì)與實(shí)現(xiàn)》系列圖書為引線,規(guī)劃一個(gè)完整的框架層學(xué)習(xí)路線圖,卷1以JNI,Android啟動(dòng),Binder,消息通信異步處理,Package Manager,Activity Manager為主,卷2則主要分析UI系統(tǒng)
小編寄語:生活在變化、科技在更新,世界萬物的改變,或潛移默化,或轟轟烈烈,但萬變不離其宗,技術(shù)也不會(huì)例外。快速成長的捷徑就如作者說的,只可能發(fā)生在少數(shù)人身上,大多數(shù)人需要不斷的自我學(xué)習(xí)以及項(xiàng)目的磨礪成長起來。只要我們肯堅(jiān)持,不放棄,我想一定會(huì)成功的!