不想看我的廢話堂污,直接點擊[導(dǎo)航]王小二的技術(shù)棧站目錄
前言
我是一個從2014年畢業(yè)到目前為止一直在Android領(lǐng)域工作的工程師家肯,我想分享一下個人的成長之路,幫助大家可以少走一些彎路盟猖,或者有一些新的啟發(fā)讨衣。
2014年2月-2015年1月:
當(dāng)時我是大四下半學(xué)期换棚,公司希望我去實習(xí),因為我之前是做javaweb方向的反镇,所以我在寒假里差不多7天時間固蚤,學(xué)完了《瘋狂android講義》,剛開始實習(xí)歹茶,主要是解決bug夕玩,這時候改一個UI的字符串的異常,就已經(jīng)很開心了惊豺,正好有同事要離職燎孟,他把一個已經(jīng)開發(fā)差不多的APP交給我開發(fā),這個時候我漸漸掌握了自定義控件尸昧,動畫揩页,Handler,四大組件的基礎(chǔ)用法烹俗。由于是在手機廠商工作爆侣,所以也有了APK編譯流程的概念,了解源碼下編譯APK和Eclipse編譯的相似之處幢妄。
2015年2月-2015年5月:
去印度出差累提,增長了很多見識,也是第一次知道什么叫native crash磁浇,發(fā)現(xiàn)高通工程師分析log的能力非常強,這個時候我對整個android系統(tǒng)有了一丟丟的概念朽褪。最關(guān)鍵是了解到高通在手機廠商中角色置吓。
2015年5月-2017年5月:
從印度回來之后,我被分配到了FWK組缔赠,主要是負責(zé)手機的穩(wěn)定性衍锚,這個時候就會有大量的crash,手機重啟等問題嗤堰,漸漸的對system_server進程戴质,開機流程,開機動畫踢匣,zygote進程告匠,Input子系統(tǒng)有了一些概念,幸運的是我參加了一個有關(guān)于VR的項目离唬,讓我對SurfaceFlinger有了一定的概念后专,但是這個時候說實話,我對native開發(fā)能力输莺,也就能看看代碼戚哎,有時候還看不明白裸诽,而且找了好多資料,都無法掌握native的開發(fā)能力型凳,而且我持續(xù)不斷的在學(xué)Binder機制丈冬,但是總是感覺沒有學(xué)明白,老羅的《Android系統(tǒng)源代碼》無數(shù)次的打開甘畅,又失望的合上埂蕊。
2017年6月-2018年6月:
我認真的研究JNI,等研究完JNI之后橄浓,我發(fā)現(xiàn)不管是Binder機制粒梦,還是原來一些看不大懂的FWK的native代碼,也能看懂了荸实,還有Looper源碼也更加理解了匀们,但是說讓我去開發(fā)一個native的程序,還是有一點虛的
2018年6月-2019年6月
我開始慢慢接觸Linux kernel准给,復(fù)習(xí)C語言泄朴,慢慢的了解了Linux的一些IO復(fù)用機制例如Epoll機制,跨進程通信例如socket通信露氮,pipe祖灰,匿名共享內(nèi)存,對Binder驅(qū)動也差不多理解了百分之70畔规,一下子把我前幾年所學(xué)的知識串聯(lián)起來了局扶。
Looper:Epoll + eventfd
Input子系統(tǒng):Socket + Epoll + Binder機制
Surface GUI:Binder + 匿名共享內(nèi)存
虛擬機的fork:Socket
2019年6月-至今
我開始正式學(xué)習(xí)Linux kernel,主要方法是IO方向叁扫,正好學(xué)習(xí)了VFS三妈,也看了Linux驅(qū)動開發(fā)的書籍,一下子發(fā)現(xiàn)了差不多完全理解Binde機制莫绣,而且通過Binder機制反過來了解Linux的進程管理畴蒲,內(nèi)存管理,同步鎖等对室,我又看了《程序員的自我修養(yǎng)》這本書模燥,對一個C語言程序在Linux系統(tǒng)上運行的狀態(tài),有了一個充分的了解掩宜,一下子我發(fā)現(xiàn)自己把整個Kernel+Fwk+App都打通了蔫骂。腦海中可以浮現(xiàn)出整個手機運行狀態(tài)的每個進程,每一個線程在干嘛锭亏。
借用gityuan的一段話描述我目前的一個狀態(tài):
Android系統(tǒng)之博大精深纠吴,包括Linux內(nèi)核、Native慧瘤、虛擬機戴已、Framework固该,通過系統(tǒng)調(diào)用連通內(nèi)核與用戶空間,通過JNI打通用戶空間的Java層和Native層糖儡,通過Binder伐坏、Socket、Handler等打通跨進程握联、跨線程的信息交換桦沉。只有真正閱讀并理解系統(tǒng)核心架構(gòu)的設(shè)計,解決問題和設(shè)計方案才能做到心中無劍勝有劍金闽,才能做到知其然知其所以然纯露。當(dāng)修煉到此,恭喜你對系統(tǒng)有了更高一個層次的理解代芜,正如太極劍法埠褪,忘記了所有招式,也就練成了太極劍法挤庇。
再回過頭去看看那些API钞速,看到的將不再是一行行代碼、一個個接口的調(diào)用嫡秕,而是各種信息的傳遞與交互工作渴语,而是背后成千上萬個小蝌蚪的動態(tài)執(zhí)行流。記得《俠客行》里面的龍木二島主終其一生也無法參透太玄經(jīng)昆咽,石破天卻短短數(shù)日練成絕世神功菩佑,究其根源是龍木二島主以靜態(tài)視角去解讀太玄經(jīng)买雾,而石破天把墻壁的圖案想象成無數(shù)游動的蝌蚪竞帽,最終成就絕世神功罪既。一言以蔽之,程序代碼是死的汇在,系統(tǒng)運轉(zhuǎn)是活的,要以動態(tài)視角去理解系統(tǒng)架構(gòu)脏答。
未來
目前我的主要工作是負責(zé)android手機的性能優(yōu)化糕殉,kernel的IO優(yōu)化,我發(fā)現(xiàn)工作那么多年殖告,只能說目前的自己真正有能力去研究一些東西了阿蝶,自己的知識體系已經(jīng)建立起來了,可以添磚加瓦了黄绩。
這些年我看過的書
但是我還是推薦這五本書
總結(jié)
1.從APP層-FWK層-Kernel層打通的難度和周期遠遠大于Kernel層-FWK層-APP層羡洁,我就是屬于前者,走了太多的彎路爽丹,后者的發(fā)展之路筑煮,我相信會比我快很多辛蚊,gityuan就是屬于后者。
2.Binder機制一定能要研究真仲,否則你基本不可能可以打通整個android系統(tǒng)袋马。跨進程通信秸应,跨線程通信都是我們需要去仔細研究的虑凛。
3.你可以不精通C++,但是一定要達到Linux C語言的開發(fā)能力软啼,其實我們?nèi)钡牟皇茿ndroid NDK的能力桑谍,而是缺的是Linux C的開發(fā)能力。
4.多看看書祸挪,我文章中用了好多次的一下子锣披,整個一下子真的是一下子頓悟了,因為我之前已經(jīng)有大量知識的積累了匕积,所以捅破窗戶紙盈罐,就可以豁然開讓,當(dāng)然我的同事也很牛逼闪唆,也幫我捅破的很多窗戶紙盅粪。
5.多去回答同事和網(wǎng)友的問題,在一次次回答問題悄蕾,被反問中票顾,你自己對知識的理解會不斷的加深。
6.當(dāng)你發(fā)現(xiàn)自己不懂的知識越來越多的時候帆调,證明你懂的知識越來越多奠骄。