Android 開發(fā)核心知識體系與面試指南精簡版

概述

本文系統(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
原子性 保證 不保證
可見性 保證 保證
有序性 保證(通過內存屏障) 保證(禁止指令重排)
作用范圍 方法或代碼塊 變量
性能開銷 高(阻塞、上下文切換)

使用建議

  • 保證原子性 + 可見性 → synchronizedReentrantLock
  • 僅需可見性 → volatile(如狀態(tài)標志位)

3.3 線程池(ThreadPoolExecutor)

new ThreadPoolExecutor(
    corePoolSize,      // 核心線程數(shù)
    maximumPoolSize,   // 最大線程數(shù)
    keepAliveTime,     // 空閑線程存活時間
    unit,              // 時間單位
    workQueue,         // 任務隊列(BlockingQueue)
    threadFactory,     // 線程工廠
    handler            // 拒絕策略
);

任務執(zhí)行流程

  1. 任務提交 → 若當前線程 < corePoolSize → 創(chuàng)建新線程
  2. 否則 → 加入 workQueue
  3. 隊列滿 → 若線程 < maxPoolSize → 創(chuàng)建新線程
  4. 否則 → 觸發(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 已廢棄,推薦 LiveDataFlow

1.4 ContentProvider

核心組件

  • URIcontent://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 與緩存機制

四級緩存

  1. Scrap:屏幕內臨時移除的 ViewHolder(可快速復用)
  2. mCachedViews:最近移出屏幕的 ViewHolder(默認 2 個)
  3. ViewCacheExtension:開發(fā)者自定義緩存(極少使用)
  4. 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é)程:替代 AsyncTaskRxJava
  • 跨平臺:Flutter(Dart)、React Native(JS)、KMM(Kotlin Multiplatform)

七、場景題與開放性問題(補充回答模板)

“請介紹最有挑戰(zhàn)的項目”

使用 STAR 法則

  • Situation:項目背景
  • Task:你的職責
  • Action:采取的技術方案
  • Result:量化成果(性能提升 X%)

總結:本文覆蓋 Android 開發(fā)全棧知識,建議結合源碼(AOSP、Jetpack)、實戰(zhàn)項目與持續(xù)學習,構建可落地的技術能力。

下一步建議

  • 將本文作為知識地圖,逐項深入
  • 閱讀官方文檔與源碼
  • 參與開源項目或技術社區(qū)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容