安卓開發大軍浩浩蕩蕩,經過近十年的發展,Android技術優化日異月新,如今Android 11.0 已經發布,Android系統性能也已經非常流暢,可以在體驗上完全媲美iOS。
但是,到了各大廠商手里,改源碼、自定義系統,使得Android原生系統變得魚龍混雜,然后到了不同層次的開發工程師手里,因為技術水平的參差不齊,即使很多手機在跑分軟件性能非常高,打開應用依然存在卡頓現象。
另外,隨著產品內容迭代,功能越來越復雜,UI頁面也越來越豐富,也成為流暢運行的一種阻礙。綜上所述,對APP進行性能優化已成為開發者該有的一種綜合素質,也是開發者能夠完成高質量應用程序作品的保證。
為此,我把阿里、騰訊、字節跳動、美團等公司Android性能優化實戰整合成了一個PDF文檔,由于內容過多的,我先介紹實戰部分,之后再介紹理論部分。
安卓跳槽需要復習的知識
在介紹面試考察內容前,先來看看我認為的“中級安卓”需要掌握的知識點,這些是結合一些面經、自己實際面試以及請教前輩總結而來的,主要包括兩部分:
- 基礎知識
- 進階知識
面試中級及以下崗位時,在電話面試、一面、或者你簡歷沒有突出亮點時,一般都會先問基礎,目的是確定你基本功扎不扎實。
如果基礎知識有太多不會的就危險了,必須好好準備,這是躲不過的。電話面試、一面考察基本功過關后,就會進入下一階段 — 問些進階的,看看你最高水平在哪里。
這個階段有不會的很正常,因為對方正在確定你的水平,但態度一定要積極主動,即使之前沒有研究過,也要結合一些經驗說出推測的結果,切忌直接說“我不會”。
基礎知識
基礎知識主要包括以下幾點:
- Java 基礎
- 并發/異步
- 安卓基礎
- 設計模式
- 常見的數據結構算法
- 網絡基礎
1. Java 基礎
雖然現在 Kotlin 挺火的,但我面了幾家大公司都沒問 Kotlin,問了很多 Java 。所以一定要保證當前知識掌握熟練了,再學習新知識,不然真成了狗熊掰苞米。
Java 基礎主要包括以下知識點:
-
內部類、靜態內部類區別、使用場景
-
抽象類、接口繼承實現區別
-
集合
-
注解
-
反射
-
泛型
-
異常
-
IO
問的比較少
我只貼上我寫過內容的鏈接,剩下的朋友們去網上一搜,或者去買本書看下就好了,建議看 《Java 編程思想》,不僅解答了 What 還有探討 Why。
2. 并發/異步
主要包括兩部分:
- 安卓并發類
- Java 并發知識
安卓的主線程模型,要求我們必須將耗時操作放到線程異步執行,否則會影響 app 的流暢甚至卡頓。
因此必須掌握安卓提供的 Handler
, HandlerThread
, IntentService
, AsyncTask
,這是安卓為我們封裝好的異步類,從使用到原理,都要理解,面試常客。
接著就需要了解 Java 的線程、內存模型和 Java 并發包下提供的類了,這也是大公司考察基礎的常客。
除了面試,如果你去看過開源框架,會發現里面有很多 ConcurrentHashMap
, Lock
, Condition
,一開始看的你一臉懵逼,在掌握了 Java 并發知識后,再去看框架就會省力許多。
Java 并發主要知識點:
- 同步鎖 synchronized 與 Lock 區別
- 什么是可重入鎖
- 線程通信方法
- wait 和 sleep區別
- wait-notify 模型
- 生產者消費者模型
- 線程池
建議閱讀書籍:《Android 開發藝術探索》、《Java 并發編程藝術》、《Java 并發編程實戰》
3. 安卓基礎
安卓基礎愛問的來來回回就那些點:
-
四大組件,生命周期啟動方式等常見問題
-
自定義 View 相關
繪制流程
事件傳遞
滑動沖突
這部分是常見的,應該大多數人都掌握差不多了,書的話還是看 《藝術探索》。
4. 設計模式
我這次找工作,筆試里出現了兩次寫單例模式,記得幾年前校招的時候就因為單例失去過一次好機會,單例模式的重要性,你自己掂量一下。
設計模式考察的也不算太復雜,知道常用的幾種設計模式使用場景,會手寫單例的關鍵幾種(靜態內部類 double-check 知道區別)就可以了。
5. 數據結構算法
我這次面試算法問的比較少,只手寫過插入排序,建議把冒泡、插入、歸并時間復雜度和實現熟悉熟悉,最好手寫下,不然現場手寫的時候容易出錯。
作為一個有追求的程序員,這些數據結構、算法是需要掌握的:
- 數組鏈表區別
- 鏈表插入刪除
- 棧及使用場景
- 隊列及使用場景(有可能拓展到阻塞隊列)
這些是基礎,學好才能掌握其他的。
紅黑樹、KMP、最短路徑、動態規劃、背包問題這些都屬于進階了,問的比較少,了解下即可。
6. 網絡基礎
網絡其實問的也不算多,因為畢竟不用我們自己去實現一個 HTTP Client,常見的網絡問題大概以下內容:
-
七層模型
-
HTTP 內容
-
常見響應碼
-
緩存相關
-
TCP 三次握手、四次揮手
-
Socket 的使用
進階知識
在確定你的基礎夠用后,二三面就會考察你的進階能力。就應用開發來說,進階知識主要有以下內容:
-
框架原理
緩存
網絡
圖片
-
性能優化
-
架構模式
-
JVM
-
插件化
1. 框架原理
作為有追求的安卓開發,怎么可能只滿足使用框架而不知其原理呢?
在面試時也經常會被問到:你熟悉什么框架的源碼?
這個時候如果沒有準備就尷尬了,失去了給自己加分的機會。
現在主流框架是 RxJava Retrofit OkHttp Picasso/Glide EventBus3,你可以選擇其中兩個左右熟悉一下源碼和大概流程,重要的是理解為什么要有這個框架,解決的問題,如何解決的。
建議閱讀書籍:《Android 進階之光》
2. 性能優化
性能優化又是另外一個高頻問題,一般主要問內存方面、UI 方面的優化。
常見問題:
-
內存優化
內存泄漏如何避免、檢測
內存抖動怎么辦
有使用過什么工具嗎?
如何避免 OOM
-
UI 優化
布局卡頓怎么辦
如何判斷布局是否需要優化
有哪些工具
另外也可以閱讀《高性能 Android 應用開發》。
3. 架構模式
高級的安卓開發不僅需要完成一個模塊,還需要負責整個項目的設計與開發。
常見的架構模式是按項目分層分,MVC MVP MVVM 這些,可以選其中兩個進行學習、實踐,對比了解優勢和劣勢就可以了,網上文章很多的。
另外就是設計思想,OOP 面向對象開發的思想一般都知道,繼承封裝多態,什么時候用接口什么時候用抽象類,其實和設計模式相輔相成的。
還有 AOP,面向切面編程,大型項目一般都會用到,在不入侵代碼的同時添加功能,建議了解。
還有路由,現在都流行組件化,組件化的一個問題就是組件間如何依賴,如何通信,這些都需要有良好的架構設計思想。我自己也在摸索中。
這部分的知識屬于個人經驗,不同的人不同的體會,沒有適合所有人的相關書籍,需要自己多寫、多總結出來。
4. JVM
在去一家公司面試時,隔壁屋也在面試一個后臺,在等待面試官時我偷偷聽了下他們的對話。其中有一段對話記憶深刻:
- 請介紹下 CMS 垃圾收集器。
- 額,對不起,我只畢業一年,這方面了解的比較少。
JVM 的知識究竟需要工作幾年再了解呢?
不同的人有不同的看法,我的看法是:盡可能早。
JVM 主要內容大概有這些(來自《深入理解 Java 虛擬機》):
- JMM(Java 內存模型)
- GC(垃圾回收策略)
- 虛擬機性能監控、調優
- 類文件結構
- 類加載機制
- 程序編譯優化
尾聲
開發是需要一定的基礎的,我是08年開始進入Android這行的,在這期間經歷了Android的鼎盛時期,和所謂的Android”涼了“。中間當然也有著,不可說的心酸,看著身邊朋友,同事一個個轉前端,換行業,其實當時我的心也有過猶豫,但是我還是堅持下來了,這次的疫情就是一個好的機會,大浪淘沙,優勝劣汰。再等等,說不定下一個黃金浪潮就被你等到了。
這是我在這行工作10幾年積累的一些資料,如果還想繼續在這行業走下去的,或者現在打算跳槽,可以**私信【學習】**我愿意把資料免費分享給大家。
或者直接點擊下面鏈接領取
Android學習PDF+架構視頻+面試文檔+源碼筆記
- 330頁 PDF Android核心筆記
- 幾十套阿里 、字節跳動、騰訊、華為、美團等公司2020年的面試題
- PDF和思維腦圖,包含知識脈絡 + 諸多細節
- Android進階系統學習視頻
2zff3k-1618563161993)]
- 幾十套阿里 、字節跳動、騰訊、華為、美團等公司2020年的面試題
[外鏈圖片轉存中…(img-BxVALSgJ-1618563161996)]
[外鏈圖片轉存中…(img-v9gXm5jN-1618563161998)]
- PDF和思維腦圖,包含知識脈絡 + 諸多細節
[外鏈圖片轉存中…(img-nwSzdzL9-1618563162001)]
- Android進階系統學習視頻