一个大神的Android成长之路
這篇文章是我的一個朋友寫的,總結(jié)了這些年的技術(shù)成長之路,我覺得對于很多技術(shù)人都有借鑒的作用,技術(shù)是相通的,不要整天想一口氣吃成一個胖子,不積跬步無以至千里,既然選擇了技術(shù)這條路,就不畏艱辛,苦中有甜,甜中有苦,我看了小二哥的總結(jié),自己也覺得很羞愧,我看書的毅力沒有二哥這樣強(qiáng)。
每個人的學(xué)習(xí)方法可能存在一些差異,但是目的都是一樣的,你覺得你看書很容易進(jìn)入狀態(tài),那就去看書,如果你看視頻很容易進(jìn)入狀態(tài),那就去看視頻,如果你動手操作很容易進(jìn)入狀態(tài),那就買開發(fā)板回來研究。但是,一定要有自己的積累。
下面文章中的我,指的是作者王小二C。
前言
我是一個已經(jīng)接近6年工作經(jīng)驗(yàn)的Android工程師,我想通過分享一下個人的成長之路,幫助大家可以少走一些彎路,或者有一些新的啟發(fā)。
2014年2月-2015年1月:
當(dāng)時我是大四下半學(xué)期,公司希望我去實(shí)習(xí),因?yàn)槲抑笆亲鰆avaweb方向的,所以我在寒假里差不多7天時間,學(xué)完了《瘋狂android講義》,剛開始實(shí)習(xí),主要是解決bug,這時候改一個UI的字符串的異常,就已經(jīng)很開心了,正好有同事要離職,他把一個已經(jīng)開發(fā)差不多的APP交給我開發(fā),這個時候我漸漸掌握了自定義控件,動畫,Handler,四大組件的基礎(chǔ)用法。由于是在手機(jī)廠商工作,所以也有了APK編譯流程的概念,了解源碼下編譯APK和Eclipse編譯的相似之處。
2015年2月-2015年5月:
去印度出差,增長了很多見識,也是第一次知道什么叫native crash,發(fā)現(xiàn)高通工程師分析log的能力非常強(qiáng),這個時候我對整個android系統(tǒng)有了一丟丟的概念。最關(guān)鍵是了解到高通在手機(jī)廠商中角色。
2015年5月-2017年5月:
從印度回來之后,我被分配到了FWK組,主要是負(fù)責(zé)手機(jī)的穩(wěn)定性,這個時候就會有大量的crash,手機(jī)重啟等問題,漸漸的對system_server進(jìn)程,開機(jī)流程,開機(jī)動畫,zygote進(jìn)程,Input子系統(tǒng)有了一些概念,幸運(yùn)的是我參加了一個有關(guān)于VR的項目,讓我對SurfaceFlinger有了一定的概念,但是這個時候說實(shí)話,我對native開發(fā)能力,也就能看看代碼,有時候還看不明白,而且找了好多資料,都無法掌握native的開發(fā)能力,而且我持續(xù)不斷的在學(xué)Binder機(jī)制,但是總是感覺沒有學(xué)明白,老羅的《Android系統(tǒng)源代碼》無數(shù)次的打開,又失望的合上。
2017年6月-2018年6月:
我認(rèn)真的研究JNI,等研究完JNI之后,我發(fā)現(xiàn)不管是Binder機(jī)制,還是原來一些看不大懂的FWK的native代碼,也能看懂了,還有Looper源碼也更加理解了,但是說讓我去開發(fā)一個native的程序,還是有一點(diǎn)虛的
2018年6月-2019年6月
我開始慢慢接觸Linux kernel,復(fù)習(xí)C語言,慢慢的了解了Linux的一些IO復(fù)用機(jī)制例如Epoll機(jī)制,跨進(jìn)程通信例如socket通信,pipe,匿名共享內(nèi)存,對Binder驅(qū)動也差不多理解了百分之70,一下子把我前幾年所學(xué)的知識串聯(lián)起來了。
Looper:Epoll + Pipe
Input子系統(tǒng):Socket + Epoll + Binder機(jī)制
Surface GUI:Binder + 匿名共享內(nèi)存
虛擬機(jī)的fork:Socket
2019年6月-至今
我開始正式學(xué)習(xí)Linux kernel,主要方法是IO方向,正好學(xué)習(xí)了VFS,也看了Linux驅(qū)動開發(fā)的書籍,一下子發(fā)現(xiàn)了差不多完全理解Binde機(jī)制,而且通過Binder機(jī)制反過來了解Linux的進(jìn)程管理,內(nèi)存管理,同步鎖等,我又看了《程序員的自我修養(yǎng)》這本書,對一個C語言程序在Linux系統(tǒng)上運(yùn)行的狀態(tài),有了一個充分的了解,一下子我發(fā)現(xiàn)自己把整個Kernel+Fwk+App都打通了。腦海中可以浮現(xiàn)出整個手機(jī)運(yùn)行狀態(tài)的每個進(jìn)程,每一個線程在干嘛。
借用gityuan的一段話描述我目前的一個狀態(tài):
Android系統(tǒng)之博大精深,包括Linux內(nèi)核、Native、虛擬機(jī)、Framework,通過系統(tǒng)調(diào)用連通內(nèi)核與用戶空間,通過JNI打通用戶空間的Java層和Native層,通過Binder、Socket、Handler等打通跨進(jìn)程、跨線程的信息交換。只有真正閱讀并理解系統(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)運(yùn)轉(zhuǎn)是活的,要以動態(tài)視角去理解系統(tǒng)架構(gòu)。
未來
目前我的主要工作是負(fù)責(zé)android手機(jī)的性能優(yōu)化,kernel的IO優(yōu)化,我發(fā)現(xiàn)工作那么多年,只能說目前的自己真正有能力去研究一些東西了,自己的知識體系已經(jīng)建立起來了,可以添磚加瓦了。
這些年我看過的書
但是我還是推薦這五本書
目前在看的書
總結(jié)
1.從APP層-FWK層-Kernel層打通的難度和周期遠(yuǎn)遠(yuǎn)大于Kernel層-FWK層-APP層,我就是屬于前者,走了太多的彎路,后者的發(fā)展之路,我相信會比我快很多,gityuan就是屬于后者。
2.Binder機(jī)制一定能要研究,否則你基本不可能可以打通整個android系統(tǒng)??邕M(jìn)程通信,跨線程通信都是我們需要去仔細(xì)研究的。
3.你可以不精通C++,但是一定要達(dá)到Linux C語言的開發(fā)能力,其實(shí)我們?nèi)钡牟皇茿ndroid NDK的能力,而是缺的是Linux C的開發(fā)能力。
4.多看看書,我文章中用了好多次的一下子,整個一下子真的是一下子頓悟了,因?yàn)槲抑耙呀?jīng)有大量知識的積累了,所以捅破窗戶紙,就可以豁然開讓,當(dāng)然我的同事也很牛逼,也幫我捅破的很多窗戶紙。
5.多去回答同事和網(wǎng)友的問題,在一次次回答問題,被反問中,你自己對知識的理解會不斷的加深。
6.當(dāng)你發(fā)現(xiàn)自己不懂的知識越來越多的時候,證明你懂的知識越來越多。
掃碼或長按關(guān)注
回復(fù)「?籃球的大肚子」進(jìn)入技術(shù)群聊
總結(jié)
以上是生活随笔為你收集整理的一个大神的Android成长之路的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python分布式定时任务_分布式定时任
- 下一篇: android sina oauth2.