概述
本文系統(tǒng)梳理了 Android 開發(fā)從基礎到高級的核心知識點,涵蓋 Java 基礎、Android 組件、性能優(yōu)化、架構設計、Framework 原理、主流框架與新技術趨勢,旨在幫助中高級開發(fā)者構建完整的知識體系,高效準備技術面試,并指導實際項目開發(fā)。
適用人群:Android 中高級工程師、面試準備者、技術面試官、團隊技術負責人
建議用法:作為知識地圖逐項深入,結合源碼閱讀與項目實踐,持續(xù)迭代技術認知。
一、Java 基礎與進階
1. 面向對象 (OOP)
1.1 三大特性
| 特性 | 核心概念 | 作用 | 實現(xiàn)方式 |
|---|---|---|---|
| 封裝 | 將數(shù)據(jù)和行為封裝在類中,隱藏實現(xiàn)細節(jié) | 提高安全性、降低耦合、增強可維護性 | 使用 private 字段 + public getter/setter |
| 繼承 | 子類繼承父類的屬性和方法(非私有) | 實現(xiàn)代碼復用,建立類層次結構 |
extends 關鍵字,遵循 "is-a" 關系 |
| 多態(tài) | 同一接口在不同實例下表現(xiàn)出不同行為 | 提高擴展性與靈活性,支持模塊化設計 | 方法重寫 + 動態(tài)綁定(運行時決定調用哪個實現(xiàn)) |
多態(tài)實現(xiàn)機制:基于虛方法表(vtable),JVM 在運行時根據(jù)對象實際類型查找對應方法。
1.2 接口 vs 抽象類
| 對比項 | 接口(Interface) | 抽象類(Abstract Class) |
|---|---|---|
| 定義關系 | “能做什么”(行為規(guī)范) | “是什么”(共性抽象) |
| 多繼承 | 支持(Java 8+ 默認方法) | 不支持 |
| 成員 | 只能有常量和抽象方法(Java 8+ 支持默認/靜態(tài)方法) | 可包含字段、構造器、具體方法 |
| 訪問控制 | 所有方法默認 public
|
可使用 private、protected
|
| 使用場景 | 定義契約、解耦、策略模式 | 共享代碼、模板方法模式 |
最佳實踐:
- 優(yōu)先使用接口(符合“面向接口編程”原則)
- 當需要共享代碼或構造邏輯時使用抽象類
- Java 8+ 可通過接口默認方法實現(xiàn)部分復用
1.3 內部類
| 類型 | 特點 | 使用場景 |
|---|---|---|
| 成員內部類 | 持有外部類引用,可訪問所有成員 | 封裝輔助類,如 Iterator
|
| 靜態(tài)內部類 | 不依賴外部類實例,無隱式引用 | 工具類、Builder 模式 |
| 局部內部類 | 定義在方法內,作用域受限 | 復雜邏輯封裝 |
| 匿名內部類 | 無類名,直接實現(xiàn)接口或繼承類 | 快速實現(xiàn)回調、事件監(jiān)聽 |
注意:
- 成員內部類可能導致內存泄漏(隱式持有外部類引用),建議在
Handler、Thread中使用靜態(tài)內部類 +WeakReference。- 避免過度嵌套,影響可讀性和維護性。
2. 集合框架
2.1 ArrayList vs LinkedList
| 特性 | ArrayList | LinkedList |
|---|---|---|
| 底層結構 | 動態(tài)數(shù)組(連續(xù)內存) | 雙向鏈表(分散內存) |
| 隨機訪問 | O(1) | O(n) |
| 插入/刪除(中間) | O(n) | O(1) |
| 內存占用 | 較?。▋H元素開銷) | 較大(每個節(jié)點含前后指針) |
| 擴容機制 | 擴容 1.5 倍,觸發(fā) Arrays.copyOf
|
無固定容量,動態(tài)添加節(jié)點 |
選擇建議:
- 頻繁讀取 →
ArrayList- 頻繁插入刪除 →
LinkedList- Android 中推薦
ArrayList,因緩存局部性更好,GC 更友好。
2.2 HashMap vs HashTable
| 特性 | HashMap | HashTable |
|---|---|---|
| 線程安全 | ? 非線程安全 | ? 方法加 synchronized
|
| 性能 | 更高(無同步開銷) | 較低 |
| Null 值 | 允許一個 null 鍵和多個 null 值 | 不允許 null 鍵或值 |
| 迭代器 | Fail-fast(快速失?。?/td> | Fail-safe(安全失?。?/td> |
| 替代方案 |
ConcurrentHashMap(推薦) |
已過時,不建議使用 |
HashMap 優(yōu)化(JDK 8+):
- 當鏈表長度 ≥ 8 且哈希表容量 ≥ 64 時,鏈表轉為紅黑樹,查找復雜度從 O(n) 降為 O(log n)。
- 容量始終為 2 的冪,便于通過位運算
(n - 1) & hash計算索引。
2.3 String、StringBuilder、StringBuffer
| 類型 | 線程安全 | 性能 | 使用場景 |
|---|---|---|---|
String |
不可變 | 低(頻繁拼接產(chǎn)生大量對象) | 少量操作、常量 |
StringBuffer |
同步 | 中等 | 多線程環(huán)境拼接 |
StringBuilder |
非同步 | 高 | 單線程大量拼接(推薦) |
原理:
String是 final 類,每次拼接都會創(chuàng)建新對象;后兩者基于可變字符數(shù)組(char[])實現(xiàn)。
3. 并發(fā)與多線程
3.1 線程控制方法對比
| 方法 | 是否釋放鎖 | 是否讓出 CPU | 用途 |
|---|---|---|---|
sleep() |
? 不釋放 | ? 讓出 | 暫停線程指定時間 |
wait() |
? 釋放 | ? 讓出 | 等待條件滿足(需 synchronized) |
join() |
? 不釋放 | ? 讓出 | 等待目標線程結束 |
yield() |
? 不釋放 | ? 讓出 | 提示調度器讓出 CPU(不保證) |
?? 關鍵區(qū)別:
wait()必須在同步塊中調用,且會釋放鎖;sleep()不影響鎖狀態(tài)。
3.2 synchronized vs volatile
| 特性 | synchronized | volatile |
|---|---|---|
| 原子性 | 保證 | 不保證 |
| 可見性 | 保證 | 保證 |
| 有序性 | 保證(通過內存屏障) | 保證(禁止指令重排) |
| 作用范圍 | 方法或代碼塊 | 變量 |
| 性能開銷 | 高(阻塞、上下文切換) | 低 |
使用建議:
- 保證原子性 + 可見性 →
synchronized或ReentrantLock- 僅需可見性 →
volatile(如狀態(tài)標志位)
3.3 線程池(ThreadPoolExecutor)
new ThreadPoolExecutor(
corePoolSize, // 核心線程數(shù)
maximumPoolSize, // 最大線程數(shù)
keepAliveTime, // 空閑線程存活時間
unit, // 時間單位
workQueue, // 任務隊列(BlockingQueue)
threadFactory, // 線程工廠
handler // 拒絕策略
);
任務執(zhí)行流程:
- 任務提交 → 若當前線程 < corePoolSize → 創(chuàng)建新線程
- 否則 → 加入
workQueue- 隊列滿 → 若線程 < maxPoolSize → 創(chuàng)建新線程
- 否則 → 觸發(fā)拒絕策略(如拋出異常、丟棄任務等)
Android 推薦:使用
Executors.newFixedThreadPool()或newSingleThreadExecutor(),但更推薦WorkManager處理后臺任務。
4. JVM 相關
4.1 JVM 核心作用
- 實現(xiàn)“一次編寫,到處運行”(跨平臺)
- 提供字節(jié)碼執(zhí)行引擎
- 自動內存管理(GC)
- 安全沙箱機制
- 多線程支持
- 動態(tài)類加載與鏈接
4.2 運行時數(shù)據(jù)區(qū)
| 區(qū)域 | 線程私有 | 存儲內容 | 異常 |
|---|---|---|---|
| 程序計數(shù)器 | 私有 | 當前線程執(zhí)行的字節(jié)碼行號 | 無 |
| 虛擬機棧 | 私有 | 棧幀(局部變量、操作數(shù)棧、方法出口) |
StackOverflowError / OutOfMemoryError
|
| 本地方法棧 | 私有 | Native 方法調用 | 同上 |
| Java 堆 | 共享 | 對象實例、數(shù)組 | OutOfMemoryError |
| 方法區(qū) | 共享 | 類信息、常量、靜態(tài)變量 | OutOfMemoryError |
Android 注意:ART 虛擬機與 JVM 有差異,如預編譯(AOT)、內存模型優(yōu)化等。
5. 泛型與反射
5.1 泛型
-
編譯期檢查:提供類型安全,避免運行時
ClassCastException -
類型擦除:泛型信息在編譯后被擦除,僅保留原始類型(
Object) -
通配符:
? extends T(上界)、? super T(下界)、?(無界)
局限:不能用于
static字段、不能new T()、不能用于異常類型。
5.2 反射
- 用途:運行時獲取類信息、動態(tài)調用方法、修改字段
-
性能:較慢(需解析字節(jié)碼),建議緩存
Method/Field對象 -
與泛型結合:可通過
getGenericReturnType()獲取泛型類型信息,部分突破類型擦除限制
應用場景:依賴注入(Dagger)、序列化(Gson)、ORM 框架(Room)
6. 類加載機制
雙親委派模型(Parent Delegation)
Bootstrap ClassLoader
↑
Extension ClassLoader
↑
Application ClassLoader
↑
Custom ClassLoader (e.g., Tinker)
- 流程:子加載器收到類加載請求 → 委托父加載器 → 父加載器無法加載 → 子加載器嘗試加載
-
優(yōu)勢:
-
安全性:防止核心類(如
java.lang.String)被惡意替換 - 避免重復加載:保證類的唯一性
- 一致性:同一類由同一加載器加載
-
安全性:防止核心類(如
打破雙親委派:JDBC 使用
Thread.currentThread().getContextClassLoader()加載驅動,由應用類加載器完成。
二、Android 核心組件與機制
1. 四大組件
1.1 Activity
生命周期詳解
| 生命周期 | 觸發(fā)場景 | 注意事項 |
|---|---|---|
onCreate() |
首次創(chuàng)建 | 初始化數(shù)據(jù)、綁定布局 |
onStart() |
可見但不可交互 | 準備 UI 顯示 |
onResume() |
可交互(前臺) | 恢復動畫、傳感器 |
onPause() |
失去焦點 | 保存數(shù)據(jù)、釋放資源 |
onStop() |
完全不可見 | 釋放 UI 相關資源 |
onDestroy() |
銷毀前 | 徹底清理 |
onRestart() |
從 onStop 回到前臺 |
典型場景:
- A → B(普通):
A.onPause()→B.onCreate()→B.onResume()→A.onStop()- A → B(透明):
A.onPause()→B.onCreate()→B.onResume()(A 不會onStop())
Activity Result API
- 替代已廢棄的
startActivityForResult() - 更安全:避免內存泄漏,支持 Fragment
- 使用
ActivityResultLauncher注冊回調
val launcher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
// 處理返回結果
}
launcher.launch("image/*")
1.2 Service
| 類型 | 啟動方式 | 生命周期 | 適用場景 |
|---|---|---|---|
| Started Service | startService() |
onCreate() → onStartCommand() → onDestroy()
|
長時間后臺任務(下載、播放) |
| Bound Service | bindService() |
onCreate() → onBind() → onUnbind() → onDestroy()
|
客戶端-服務端通信 |
| IntentService | startService() |
基于 HandlerThread,任務完成自動停止 |
串行執(zhí)行后臺任務(已廢棄,推薦 WorkManager) |
| 前臺服務 | startForegroundService() |
必須調用 startForeground()
|
長期運行任務(音樂播放、定位) |
注意:Android 9+ 需在
AndroidManifest.xml中聲明FOREGROUND_SERVICE權限。
1.3 BroadcastReceiver
| 注冊方式 | 優(yōu)點 | 缺點 | 適用場景 |
|---|---|---|---|
| 靜態(tài)注冊 | 應用未啟動也可接收 | 耗電、占用系統(tǒng)資源 | 開機啟動、網(wǎng)絡狀態(tài)變化 |
| 動態(tài)注冊 | 靈活、可控制生命周期 | 需手動注銷,否則內存泄漏 | 活動期間監(jiān)聽事件 |
最佳實踐:
- 動態(tài)注冊必須在
onDestroy()中調用unregisterReceiver()onReceive()中禁止耗時操作(>10s 導致 ANR)- 使用
LocalBroadcastManager實現(xiàn)應用內通信(AndroidX 已廢棄,推薦LiveData或Flow)
1.4 ContentProvider
核心組件
-
URI:
content://authority/path/id - ContentResolver:客戶端訪問接口
-
MIME 類型:標識數(shù)據(jù)類型(如
vnd.android.cursor.dir/user)
權限控制
-
android:readPermission/android:writePermission -
android:exported="false":僅限本應用訪問
系統(tǒng)示例:
- 聯(lián)系人:
content://com.android.contacts/contacts- 相冊:
content://media/external/images/media
2. View 體系與事件分發(fā)
事件分發(fā)三要素
-
dispatchTouchEvent():分發(fā)事件 -
onInterceptTouchEvent():ViewGroup 攔截判斷 -
onTouchEvent():處理事件
滑動沖突解決
-
外部攔截法:父容器在
onInterceptTouchEvent()中判斷是否攔截 -
內部攔截法:子 View 調用
requestDisallowInterceptTouchEvent(true)請求不被攔截
3. RecyclerView 與緩存機制
四級緩存
- Scrap:屏幕內臨時移除的 ViewHolder(可快速復用)
- mCachedViews:最近移出屏幕的 ViewHolder(默認 2 個)
- ViewCacheExtension:開發(fā)者自定義緩存(極少使用)
- RecycledViewPool:被廢棄的 ViewHolder 池(可跨 RecyclerView 共享)
性能優(yōu)化:
- 使用
DiffUtil計算最小更新集- 設置
setHasFixedSize(true)若尺寸不變- 避免在
onBindViewHolder中執(zhí)行耗時操作
4. Handler 機制與內存泄漏
核心流程
Handler.send → MessageQueue.enqueue → Looper.loop → Handler.dispatch → handleMessage()
內存泄漏防護
- 使用靜態(tài)內部類 +
WeakReference<Activity> - 在
onDestroy()中調用handler.removeCallbacksAndMessages(null) - 使用
Lifecycle感知組件(如LifecycleCoroutineScope)
三、性能優(yōu)化(補充詳細方案)
1. 內存優(yōu)化
- LeakCanary:自動檢測內存泄漏
-
Bitmap 復用:使用
inBitmap(API 19+) -
對象池:
SparseArray、Pools.SynchronizedPool
2. 布局優(yōu)化
- 使用
ConstraintLayout減少嵌套 -
<merge>消除冗余父布局 -
<ViewStub>延遲加載非關鍵視圖
3. 卡頓優(yōu)化
- Systrace 分析主線程阻塞
- 使用
Choreographer監(jiān)控幀率 - 避免在
onDraw()中創(chuàng)建對象
4. 啟動優(yōu)化
- 異步初始化:第三方 SDK 異步加載
- 延遲初始化:非關鍵組件延后
-
ContentProvider 初始化:避免在
onCreate()中做耗時操作
5. APK 瘦身
| 方法 | 工具/配置 |
|---|---|
| 代碼壓縮 |
minifyEnabled true + R8 |
| 資源壓縮 | shrinkResources true |
| 圖片優(yōu)化 | WebP、矢量圖、APK 字典 |
| So 庫分包 | abiFilters |
四、架構與設計模式(補充 MVVM 實踐)
MVVM + Jetpack 推薦架構
View (Activity/Fragment)
↓ (UI Events)
ViewModel
↓ (Data Request)
Repository → Local (Room) / Remote (Retrofit)
↑
LiveData / Flow
優(yōu)勢:生命周期安全、數(shù)據(jù)驅動、易于測試。
五、開源框架原理(補充)
| 框架 | 核心原理 |
|---|---|
| Retrofit | 動態(tài)代理 + 注解處理器生成 ServiceMethod
|
| OkHttp | 攔截器鏈(Retry、Bridge、Cache、Connect、CallServer) |
| Glide | 四級緩存(內存、磁盤、活動資源、變換緩存)+ 生命周期感知 |
| EventBus | 注解生成索引,通過 HandlerPoster 發(fā)送事件 |
六、新技術趨勢
- Jetpack Compose:聲明式 UI,取代 XML
-
Kotlin 協(xié)程:替代
AsyncTask、RxJava - 跨平臺:Flutter(Dart)、React Native(JS)、KMM(Kotlin Multiplatform)
七、場景題與開放性問題(補充回答模板)
“請介紹最有挑戰(zhàn)的項目”
使用 STAR 法則:
- Situation:項目背景
- Task:你的職責
- Action:采取的技術方案
- Result:量化成果(性能提升 X%)
總結:本文覆蓋 Android 開發(fā)全棧知識,建議結合源碼(AOSP、Jetpack)、實戰(zhàn)項目與持續(xù)學習,構建可落地的技術能力。
下一步建議:
- 將本文作為知識地圖,逐項深入
- 閱讀官方文檔與源碼
- 參與開源項目或技術社區(qū)