眾所周知,Android是一個(gè)基于Linux實(shí)現(xiàn)的操作系統(tǒng)。但對(duì)于Linux內(nèi)核來(lái)說(shuō),Android也僅僅只是一個(gè)運(yùn)行在內(nèi)核之上的應(yīng)用程序,與其他運(yùn)行在內(nèi)核之上的應(yīng)用程序沒(méi)有任何區(qū)別。
所以Android也需要運(yùn)行環(huán)境,需要Linux內(nèi)核在啟動(dòng)完成后加載Android Framework運(yùn)行所需要的資源。當(dāng)Framework完成初始化后才能繼續(xù)啟動(dòng)相應(yīng)的APK應(yīng)用程序。
Framework這么重要,那我們?cè)撊绾螌W(xué)習(xí)呢?
關(guān)于如何學(xué)習(xí)Android Framework開(kāi)發(fā)知識(shí),最近有幸在前阿里技術(shù)總監(jiān)手里扒到這份Android framework高級(jí)開(kāi)發(fā)筆記,部分知識(shí)章節(jié)發(fā)布到了在知乎上竟然1000 點(diǎn)贊,今天就拿出來(lái)分享給大家。
本筆記講解了Framework的主要模塊,從環(huán)境的部署到技術(shù)的應(yīng)用,再到項(xiàng)目實(shí)戰(zhàn),讓我們不僅是學(xué)習(xí)框架技術(shù)的使用,而且可以學(xué)習(xí)到使用架構(gòu)如何解決實(shí)際的問(wèn)題,由淺入深,詳細(xì)解析Framework,讓你簡(jiǎn)單高效學(xué)完這塊知識(shí)!
在介紹面試考察內(nèi)容前,先來(lái)看看我認(rèn)為的“中級(jí)安卓”需要掌握的知識(shí)點(diǎn),這些是結(jié)合一些面經(jīng)、自己實(shí)際面試以及請(qǐng)教前輩總結(jié)而來(lái)的,主要包括兩部分:
基礎(chǔ)知識(shí)
進(jìn)階知識(shí)
面試中級(jí)及以下崗位時(shí),在電話(huà)面試、一面、或者你簡(jiǎn)歷沒(méi)有突出亮點(diǎn)時(shí),一般都會(huì)先問(wèn)基礎(chǔ),目的是確定你基本功扎不扎實(shí)。
如果基礎(chǔ)知識(shí)有太多不會(huì)的就危險(xiǎn)了,必須好好準(zhǔn)備,這是躲不過(guò)的。電話(huà)面試、一面考察基本功過(guò)關(guān)后,就會(huì)進(jìn)入下一階段 --- 問(wèn)些進(jìn)階的,看看你最高水平在哪里。
這個(gè)階段有不會(huì)的很正常,因?yàn)閷?duì)方正在確定你的水平,但態(tài)度一定要積極主動(dòng),即使之前沒(méi)有研究過(guò),也要結(jié)合一些經(jīng)驗(yàn)說(shuō)出推測(cè)的結(jié)果,切忌直接說(shuō)“我不會(huì)”。
基礎(chǔ)知識(shí)主要包括以下幾點(diǎn):
Java 基礎(chǔ)
并發(fā)/異步
安卓基礎(chǔ)
設(shè)計(jì)模式
常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)算法
網(wǎng)絡(luò)基礎(chǔ)
1. Java 基礎(chǔ)
雖然現(xiàn)在 Kotlin 挺火的,但我面了幾家大公司都沒(méi)問(wèn) Kotlin,問(wèn)了很多 Java 。所以一定要保證當(dāng)前知識(shí)掌握熟練了,再學(xué)習(xí)新知識(shí),不然真成了狗熊掰苞米。
Java 基礎(chǔ)主要包括以下知識(shí)點(diǎn):
內(nèi)部類(lèi)、靜態(tài)內(nèi)部類(lèi)區(qū)別、使用場(chǎng)景
抽象類(lèi)、接口繼承實(shí)現(xiàn)區(qū)別
集合
注解
反射
泛型
異常
IO
問(wèn)的比較少
我只貼上我寫(xiě)過(guò)內(nèi)容的鏈接,剩下的朋友們?nèi)ゾW(wǎng)上一搜,或者去買(mǎi)本書(shū)看下就好了,建議看 《Java 編程思想》,不僅解答了 What 還有探討 Why。
2. 并發(fā)/異步
主要包括兩部分:
安卓并發(fā)類(lèi)
Java 并發(fā)知識(shí)
安卓的主線(xiàn)程模型,要求我們必須將耗時(shí)操作放到線(xiàn)程異步執(zhí)行,否則會(huì)影響 app 的流暢甚至卡頓。
因此必須掌握安卓提供的 Handler
, HandlerThread
, IntentService
, AsyncTask
,這是安卓為我們封裝好的異步類(lèi),從使用到原理,都要理解,面試???。
接著就需要了解 Java 的線(xiàn)程、內(nèi)存模型和 Java 并發(fā)包下提供的類(lèi)了,這也是大公司考察基礎(chǔ)的???。
除了面試,如果你去看過(guò)開(kāi)源框架,會(huì)發(fā)現(xiàn)里面有很多 ConcurrentHashMap
, Lock
, Condition
,一開(kāi)始看的你一臉懵逼,在掌握了 Java 并發(fā)知識(shí)后,再去看框架就會(huì)省力許多。
Java 并發(fā)主要知識(shí)點(diǎn):
同步鎖 synchronized 與 Lock 區(qū)別
什么是可重入鎖
線(xiàn)程通信方法
wait 和 sleep區(qū)別
wait-notify 模型
生產(chǎn)者消費(fèi)者模型
線(xiàn)程池
建議閱讀書(shū)籍:《Android 開(kāi)發(fā)藝術(shù)探索》、《Java 并發(fā)編程藝術(shù)》、《Java 并發(fā)編程實(shí)戰(zhàn)》
3. 安卓基礎(chǔ)
安卓基礎(chǔ)愛(ài)問(wèn)的來(lái)來(lái)回回就那些點(diǎn):
四大組件,生命周期啟動(dòng)方式等常見(jiàn)問(wèn)題
自定義 View 相關(guān)
繪制流程
事件傳遞
滑動(dòng)沖突
這部分是常見(jiàn)的,應(yīng)該大多數(shù)人都掌握差不多了,書(shū)的話(huà)還是看 《藝術(shù)探索》。
4. 設(shè)計(jì)模式
我這次找工作,筆試?yán)锍霈F(xiàn)了兩次寫(xiě)單例模式,記得幾年前校招的時(shí)候就因?yàn)閱卫ミ^(guò)一次好機(jī)會(huì),單例模式的重要性,你自己掂量一下。
設(shè)計(jì)模式考察的也不算太復(fù)雜,知道常用的幾種設(shè)計(jì)模式使用場(chǎng)景,會(huì)手寫(xiě)單例的關(guān)鍵幾種(靜態(tài)內(nèi)部類(lèi) double-check 知道區(qū)別)就可以了。
5. 數(shù)據(jù)結(jié)構(gòu)算法
我這次面試算法問(wèn)的比較少,只手寫(xiě)過(guò)插入排序,建議把冒泡、插入、歸并時(shí)間復(fù)雜度和實(shí)現(xiàn)熟悉熟悉,最好手寫(xiě)下,不然現(xiàn)場(chǎng)手寫(xiě)的時(shí)候容易出錯(cuò)。
作為一個(gè)有追求的程序員,這些數(shù)據(jù)結(jié)構(gòu)、算法是需要掌握的:
數(shù)組鏈表區(qū)別
鏈表插入刪除
棧及使用場(chǎng)景
隊(duì)列及使用場(chǎng)景(有可能拓展到阻塞隊(duì)列)
這些是基礎(chǔ),學(xué)好才能掌握其他的。
紅黑樹(shù)、KMP、最短路徑、動(dòng)態(tài)規(guī)劃、背包問(wèn)題這些都屬于進(jìn)階了,問(wèn)的比較少,了解下即可。
6. 網(wǎng)絡(luò)基礎(chǔ)
網(wǎng)絡(luò)其實(shí)問(wèn)的也不算多,因?yàn)楫吘共挥梦覀冏约喝?shí)現(xiàn)一個(gè) HTTP Client,常見(jiàn)的網(wǎng)絡(luò)問(wèn)題大概以下內(nèi)容:
七層模型
HTTP 內(nèi)容
常見(jiàn)響應(yīng)碼
緩存相關(guān)
TCP 三次握手、四次揮手
Socket 的使用
在確定你的基礎(chǔ)夠用后,二三面就會(huì)考察你的進(jìn)階能力。就應(yīng)用開(kāi)發(fā)來(lái)說(shuō),進(jìn)階知識(shí)主要有以下內(nèi)容:
框架原理
緩存
網(wǎng)絡(luò)
圖片
性能優(yōu)化
架構(gòu)模式
JVM
插件化
1. 框架原理
作為有追求的安卓開(kāi)發(fā),怎么可能只滿(mǎn)足使用框架而不知其原理呢?
在面試時(shí)也經(jīng)常會(huì)被問(wèn)到:你熟悉什么框架的源碼?
這個(gè)時(shí)候如果沒(méi)有準(zhǔn)備就尷尬了,失去了給自己加分的機(jī)會(huì)。
現(xiàn)在主流框架是 RxJava Retrofit OkHttp Picasso/Glide EventBus3,你可以選擇其中兩個(gè)左右熟悉一下源碼和大概流程,重要的是理解為什么要有這個(gè)框架,解決的問(wèn)題,如何解決的。
建議閱讀書(shū)籍:《Android 進(jìn)階之光》
2. 性能優(yōu)化
性能優(yōu)化又是另外一個(gè)高頻問(wèn)題,一般主要問(wèn)內(nèi)存方面、UI 方面的優(yōu)化。
常見(jiàn)問(wèn)題:
內(nèi)存優(yōu)化
內(nèi)存泄漏如何避免、檢測(cè)
內(nèi)存抖動(dòng)怎么辦
有使用過(guò)什么工具嗎?
如何避免 OOM
UI 優(yōu)化
布局卡頓怎么辦
如何判斷布局是否需要優(yōu)化
有哪些工具
另外也可以閱讀《高性能 Android 應(yīng)用開(kāi)發(fā)》。
3. 架構(gòu)模式
高級(jí)的安卓開(kāi)發(fā)不僅需要完成一個(gè)模塊,還需要負(fù)責(zé)整個(gè)項(xiàng)目的設(shè)計(jì)與開(kāi)發(fā)。
常見(jiàn)的架構(gòu)模式是按項(xiàng)目分層分,MVC MVP MVVM 這些,可以選其中兩個(gè)進(jìn)行學(xué)習(xí)、實(shí)踐,對(duì)比了解優(yōu)勢(shì)和劣勢(shì)就可以了,網(wǎng)上文章很多的。
另外就是設(shè)計(jì)思想,OOP 面向?qū)ο箝_(kāi)發(fā)的思想一般都知道,繼承封裝多態(tài),什么時(shí)候用接口什么時(shí)候用抽象類(lèi),其實(shí)和設(shè)計(jì)模式相輔相成的。
還有 AOP,面向切面編程,大型項(xiàng)目一般都會(huì)用到,在不入侵代碼的同時(shí)添加功能,建議了解。
還有路由,現(xiàn)在都流行組件化,組件化的一個(gè)問(wèn)題就是組件間如何依賴(lài),如何通信,這些都需要有良好的架構(gòu)設(shè)計(jì)思想。我自己也在摸索中。
這部分的知識(shí)屬于個(gè)人經(jīng)驗(yàn),不同的人不同的體會(huì),沒(méi)有適合所有人的相關(guān)書(shū)籍,需要自己多寫(xiě)、多總結(jié)出來(lái)。
4. JVM
在去一家公司面試時(shí),隔壁屋也在面試一個(gè)后臺(tái),在等待面試官時(shí)我偷偷聽(tīng)了下他們的對(duì)話(huà)。其中有一段對(duì)話(huà)記憶深刻:
請(qǐng)介紹下 CMS 垃圾收集器。
額,對(duì)不起,我只畢業(yè)一年,這方面了解的比較少。
JVM 的知識(shí)究竟需要工作幾年再了解呢?
不同的人有不同的看法,我的看法是:盡可能早。
JVM 主要內(nèi)容大概有這些(來(lái)自《深入理解 Java 虛擬機(jī)》):
JMM(Java 內(nèi)存模型)
GC(垃圾回收策略)
虛擬機(jī)性能監(jiān)控、調(diào)優(yōu)
類(lèi)文件結(jié)構(gòu)
類(lèi)加載機(jī)制
程序編譯優(yōu)化
聯(lián)系客服