一、基礎組件與核心原理
Activity 相關
Q1:請描述 Activity 的完整生命周期,從創建到銷毀經歷哪些關鍵方法?
A:Activity 完整生命周期包括:onCreate(初始化)→ onStart(可見)→ onResume(可交互)→ onPause(失去焦點)→ onStop(不可見)→ onDestroy(銷毀)。若被重新打開,會觸發 onRestart → onStart → onResume。
Q2:Activity 的 onStart () 和 onResume () 有什么本質區別?
A:onStart () 是 Activity 可見但未獲得焦點(后臺狀態),onResume () 是獲得焦點可與用戶交互(前臺狀態)。例如,Activity 被對話框部分遮擋時,會從 onResume 退到 onPause,但不會觸發 onStop。
Q3:什么情況下 Activity 會執行 onRestart () 方法?
A:當 Activity 從停止狀態(onStop 之后)重新回到前臺時觸發,比如按 Home 鍵后再返回應用,或被其他 Activity 遮擋后再次顯示。
Q4:如何在 Activity 被銷毀前保存數據?onSaveInstanceState () 和 onPause () 有何不同?
A:用 onSaveInstanceState () 保存臨時數據,它在 Activity 可能被銷毀前調用(如旋轉屏幕),適合保存輕量數據;onPause () 用于持久化數據(如保存到數據庫),在 Activity 失去焦點時必調用,無論是否銷毀。
Q5:Activity 的四種啟動模式分別是什么?singleTask 和 singleInstance 有何區別?
A:四種模式:standard(默認,每次新建)、singleTop(棧頂復用)、singleTask(棧內唯一,清除上方 Activity)、singleInstance(獨占任務棧)。區別:singleTask 仍可能與其他 Activity 共享任務棧,singleInstance 則完全獨立,其他應用調用也會復用同一實例。
Q6:如何通過 Intent 傳遞數據給另一個 Activity?如何返回數據?
A:正向傳遞用 Intent.putExtra ();返回數據需用 startActivityForResult ()(舊)或 registerForActivityResult ()(新),被啟動 Activity 通過 setResult () 設置返回數據。
Q7:什么是 Activity 棧?系統如何管理多個 Activity 的棧結構?
A:Activity 棧(Task)是管理 Activity 的后進先出隊列。啟動新 Activity 時入棧,按返回鍵時出棧。默認一個應用對應一個棧,可通過 taskAffinity 屬性指定不同棧。
Q8:Activity 與 Fragment 的生命周期有何關聯?
A:Fragment 生命周期依賴 Activity,Activity 的 onCreate 對應 Fragment 的 onAttach→onCreate→onCreateView→onActivityCreated;Activity 的 onStart 對應 Fragment 的 onStart;Activity 的 onResume 對應 Fragment 的 onResume,銷毀階段則相反。
Q9:如何避免屏幕旋轉導致的 Activity 重建問題?
A:在 Manifest 中配置 android:configChanges="orientation|screenSize",讓系統不重建 Activity;或用 ViewModel 保存數據,其生命周期獨立于 Activity。
Q10:什么是 TaskAffinity?它如何影響 Activity 的棧管理?
A:TaskAffinity 是 Activity 的任務親和性,默認與應用包名一致。若指定不同值,Activity 會被放入對應名稱的任務棧,常用于將 Activity 放入另一個應用的任務棧(如分享功能)。
Service 相關
Q11:Service 和 Thread 的本質區別是什么?
A:Service 是 Android 組件,運行在主線程,用于后臺任務的生命周期管理;Thread 是操作系統線程,用于并行處理耗時操作。Service 本身不實現多線程,需在內部創建 Thread。
Q12:startService 和 bindService 兩種啟動方式的生命周期有何不同?
A:startService 啟動后,生命周期為 onCreate→onStartCommand→onDestroy,需顯式停止;bindService 則是 onCreate→onBind→onUnbind→onDestroy,隨綁定組件生命周期結束而銷毀,支持雙向通信。
Q13:如何保證 Service 在后臺被殺死后能自動重啟?
A:在 onStartCommand () 返回 START_STICKY 或 START_REDELIVER_INTENT,系統會在內存充足時重啟 Service;或使用前臺服務,通過通知提升優先級。
Q14:前臺服務和普通服務有什么區別?
A:前臺服務必須顯示通知,優先級高(不易被殺死),用于用戶可感知的后臺任務(如音樂播放);普通服務優先級低,系統內存不足時可能被回收。
Q15:IntentService 的特點是什么?
A:IntentService 是 Service 的子類,內部有工作線程處理任務,任務完成后自動停止,無需手動管理線程和生命周期,適合一次性后臺任務(如下載單個文件)。
Q16:Service 的 onStartCommand () 返回值有哪些類型?
A:有三種:START_STICKY(重啟后不保留 Intent)、START_NOT_STICKY(不自動重啟)、START_REDELIVER_INTENT(重啟后重發 Intent)。
Q17:如何在 Service 和 Activity 之間進行雙向通信?
A:通過 Binder 機制,Service 在 onBind () 中返回自定義 Binder 對象,Activity 綁定后通過 Binder 調用 Service 方法;或用 EventBus、LiveData 等跨組件通信工具。
Q18:為什么不建議在 Service 中執行耗時操作?
A:Service 默認運行在主線程,耗時操作會導致 ANR(應用無響應)。正確做法是在 Service 中創建子線程,或使用 IntentService/WorkManager。
Q19:如何防止 Service 被系統回收?
A:常用策略:提升為前臺服務、重寫 onStartCommand 返回 START_STICKY、通過 AlarmManager 定時喚醒、使用雙 Service 互相守護(不推薦,影響用戶體驗)。
Q20:遠程 Service 和本地 Service 的區別是什么?
A:本地 Service 與應用在同一進程,通信快(直接調用);遠程 Service 獨立進程,需通過 AIDL 跨進程通信,適合給其他應用提供服務,開銷較大。
BroadcastReceiver 相關
Q21:廣播的兩種注冊方式有什么區別?
A:靜態注冊(Manifest 聲明):應用未啟動也能接收,耗電,Android 8.0 后對隱式廣播限制嚴格;動態注冊(代碼中注冊):隨組件生命周期,靈活可控,需手動注銷。
Q22:Android 8.0 后對靜態廣播有哪些限制?
A:8.0 后靜態注冊無法接收大部分隱式廣播,需使用顯式廣播(指定包名)或動態注冊,系統廣播(如開機完成)不受影響。
Q23:有序廣播和無序廣播的區別是什么?
A:有序廣播按優先級接收,可被攔截(abortBroadcast ())和修改數據;無序廣播所有接收者同時收到,無法攔截,效率高。
Q24:本地廣播和全局廣播的區別是什么?
A:本地廣播(LocalBroadcastManager)僅在應用內傳播,安全高效;全局廣播可跨應用,存在安全風險(如數據泄露)。
Q25:如何防止廣播被惡意接收或發送?
A:發送時指定權限(sendBroadcast (intent, permission)),接收時在 Manifest 聲明對應權限;使用顯式廣播,避免隱式廣播被濫用。
Q26:系統常見的廣播事件有哪些?
A:如開機完成(ACTION_BOOT_COMPLETED)、網絡變化(ACTION_CONNECTIVITY_CHANGE)、電量低(ACTION_BATTERY_LOW)、安裝應用(ACTION_PACKAGE_ADDED)等。
Q27:動態廣播為什么必須在 onDestroy () 中注銷?
A:若不注銷,廣播接收器會持有 Activity 引用,導致內存泄漏;Activity 銷毀后,接收器仍可能接收事件,引發空指針異常。
ContentProvider 相關
Q28:ContentProvider 的核心作用是什么?
A:提供跨進程數據共享的標準化接口,封裝數據訪問邏輯,支持細粒度權限控制,常用于系統數據(如聯系人、媒體庫)和應用間數據共享。
Q29:如何實現一個自定義 ContentProvider?
A:繼承 ContentProvider,實現 query/insert/update/delete/getType 方法,在 Manifest 中注冊并指定 authority,通過 Uri 匹配器(UriMatcher)處理不同請求。
Q30:ContentResolver 和 ContentProvider 是什么關系?
A:ContentResolver 是客戶端訪問數據的入口,通過 Uri 統一調用不同 ContentProvider 的方法,隱藏具體實現,實現解耦。
Q31:Uri 的結構是什么?
A:格式為 content://authority/path/id,如 content://com.example.provider/user/1,其中 authority 是唯一標識,path 表示數據集合,id 是具體記錄。
Q32:系統提供了哪些常用的 ContentProvider?
A:聯系人(ContactsContract)、媒體庫(MediaStore)、日歷(CalendarContract)、下載管理(Downloads)等。
二、布局與 UI 渲染
布局與控件
Q33:LinearLayout、RelativeLayout 和 ConstraintLayout 的性能對比如何?
A:LinearLayout(單方向)測量效率最高,適合簡單布局;RelativeLayout 可能需兩次測量,復雜布局性能較差;ConstraintLayout 通過約束實現扁平化,性能優于 RelativeLayout,適合復雜 UI。
Q34:什么是過度繪制?如何優化?
A:過度繪制指同一像素被多次繪制(如多層背景疊加)。優化:移除冗余背景、減少布局嵌套、使用 clipRect () 限制繪制區域、通過開發者選項開啟過度繪制檢測。
Q35:如何減少布局層級?
A:用 ConstraintLayout 替代多層嵌套、使用 merge 標簽合并根布局、用 ViewStub 延遲加載非必要布局、避免不必要的 ViewGroup 嵌套。
Q36:ViewStub 的作用是什么?
A:ViewStub 是輕量級占位控件,默認不加載,需時通過 inflate () 加載布局,適合條件顯示的 UI(如空數據提示),減少初始布局加載時間。
Q37:自定義 View 的基本流程是什么?
A:繼承 View 或現有控件,重寫構造方法(解析屬性),重寫 onMeasure(測量尺寸),重寫 onDraw(繪制內容),必要時重寫 onTouchEvent(處理觸摸)。
Q38:View 的測量模式有哪些?
A:有三種:EXACTLY(精確尺寸,如 match_parent 或固定值)、AT_MOST(最大尺寸,如 wrap_content)、UNSPECIFIED(無限制,如 ScrollView 中的子 View)。
Q39:SurfaceView 和普通 View 的區別是什么?
A:SurfaceView 有獨立繪圖表面,在子線程繪制,適合高頻刷新(如視頻、游戲);普通 View 在主線程繪制,刷新頻繁會卡頓。
繪制原理
Q40:View 的繪制流程包含哪三個核心步驟?
A:測量(onMeasure,確定尺寸)→ 布局(onLayout,確定位置)→ 繪制(onDraw,繪制內容)。父 View 會遞歸調用子 View 的這三個方法。
Q41:什么是 View 樹?系統如何遍歷 View 樹進行繪制?
A:View 樹是由 ViewGroup 和 View 組成的層級結構。系統通過深度優先遍歷,先繪制父 View,再繪制子 View,確保子 View 覆蓋在父 View 之上。
Q42:硬件加速的原理是什么?哪些情況下需要關閉?
A:硬件加速利用 GPU 處理繪制,提升性能。但部分繪制操作(如 PathEffect、LayerType.SOFTWARE)不支持硬件加速,需在 View 級別關閉。
Q43:什么是 Choreographer?
A:Choreographer 協調 UI 繪制、輸入和動畫,與屏幕刷新率同步(通常 60fps),確保繪制在每一幀的正確時機執行,避免卡頓。
Q44:View 的事件分發機制中三個核心方法是什么?
A:dispatchTouchEvent(分發事件)、onInterceptTouchEvent(攔截事件,僅 ViewGroup 有)、onTouchEvent(處理事件)。流程:先分發,再判斷是否攔截,最后處理。
Q45:如何解決滑動沖突?
A:常見方案:在父 View 的 onInterceptTouchEvent 中根據滑動方向判斷是否攔截;或子 View 通過 requestDisallowInterceptTouchEvent () 請求父 View 不攔截。
三、性能優化
內存優化
Q46:常見的內存泄漏場景有哪些?
A:單例持有 Activity 上下文、未取消的監聽器(如 BroadcastReceiver、EventBus)、Handler 匿名內部類持有 Activity 引用、資源未關閉(流、Cursor)、靜態集合持有對象。
Q47:什么是內存抖動?如何解決?
A:內存抖動指短時間頻繁創建和回收對象(如循環中創建對象),導致 GC 頻繁觸發。解決:復用對象、使用對象池、避免在 onDraw () 中創建對象。
Q48:LRU 緩存機制的原理是什么?
A:LRU(最近最少使用)算法優先淘汰最久未使用的對象,通過 LinkedHashMap 實現,適用于圖片緩存(如 Glide)、內存數據緩存。
Q49:如何優化 Bitmap 的內存占用?
A:根據控件尺寸加載對應分辨率圖片(inSampleSize)、使用適當格式(如 WebP)、及時回收(recycle ())、使用緩存、通過 Glide 等庫自動管理。
Q50:弱引用、軟引用和強引用的區別是什么?
A:強引用(默認):GC 不會回收;軟引用(SoftReference):內存不足時回收,適合緩存;弱引用(WeakReference):GC 觸發時回收,適合臨時對象。
啟動與響應優化
Q51:冷啟動、熱啟動和溫啟動的區別是什么?
A:冷啟動:進程首次創建,需初始化 Application 和 Activity,耗時最長;熱啟動:進程存在,Activity 未銷毀,直接恢復;溫啟動:進程存在,但 Activity 需重建,耗時介于兩者之間。
Q52:如何優化應用啟動速度?
A:減少 Application onCreate () 中的初始化(延遲非核心任務)、優化首屏布局(減少層級、避免過度繪制)、使用啟動主題避免白屏、異步加載數據、啟用 R8 混淆縮減代碼。
Q53:什么是 ANR?如何避免?
A:ANR(應用無響應)指主線程阻塞超過一定時間(輸入事件 5 秒,廣播 10 秒,服務 20 秒)。避免:耗時操作放子線程、使用 AsyncTask/HandlerThread/Coroutine、減少布局復雜度。
Q54:如何檢測 ANR 問題?
A:通過 Logcat 查看 ANR 日志(data/anr/traces.txt)、使用 Android Vitals 監控、自定義 ANR 監控(如通過 Handler 定時檢測主線程響應)。
Q55:啟動優化中如何使用 IdleHandler?
A:IdleHandler 在主線程空閑時執行,可用于延遲初始化非核心組件(如統計、推送),避免占用啟動時間:Looper.myQueue ().addIdleHandler (() -> { ...; return false; })。
列表與網絡優化
Q56:RecyclerView 相比 ListView 有哪些優勢?
A:RecyclerView 更靈活,通過 LayoutManager 支持多種布局(線性、網格、瀑布流)、強制使用 ViewHolder、支持動畫、可自定義 ItemDecoration 和 ItemAnimator。
Q57:RecyclerView 的優化策略有哪些?
A:復用 ViewHolder、減少布局層級、圖片懶加載(滑動時暫停)、使用 DiffUtil 更新數據、設置固定高度(setHasFixedSize (true))、優化 onBindViewHolder(避免耗時操作)。
Q58:DiffUtil 的作用是什么?
A:DiffUtil 通過比對新舊數據集,計算差異并更新變化的 Item,替代 notifyDataSetChanged (),減少不必要的刷新,提升性能和動畫效果。
Q59:如何優化網絡請求?
A:合并請求、使用緩存(OkHttp 緩存)、壓縮數據(Gzip)、圖片懶加載、使用 Retrofit+OkHttp 的攔截器統一處理、避免重復請求、根據網絡類型(WiFi / 移動網絡)調整策略。
Q60:列表滑動卡頓的常見原因有哪些?
A:布局層級過深、Item 布局復雜、onBindViewHolder 中執行耗時操作、圖片未優化(過大或未緩存)、過度繪制、主線程做網絡 / IO 操作。
四、數據存儲與安全
數據存儲
Q61:Android 中有哪些數據存儲方式?
A:SharedPreferences(鍵值對,輕量)、文件存儲(內部 / 外部存儲)、SQLite 數據庫(結構化數據,Room 封裝)、ContentProvider(跨應用共享)、網絡存儲(服務器)。
Q62:SharedPreferences 的使用注意事項是什么?
A:不適合存儲大量數據、線程不安全(多進程需用 MODE_MULTI_PROCESS,已廢棄,建議用 ContentProvider)、commit () 同步提交,apply () 異步提交(可能丟失)。
Q63:Room 框架的優勢是什么?
A:Room 是 SQLite 的封裝,提供編譯時語法檢查、簡化 CRUD 操作、支持 LiveData 和 RxJava 響應式查詢、減少模板代碼,避免手寫 SQL 錯誤。
Q64:內部存儲和外部存儲的區別是什么?
A:內部存儲:私有(僅本應用訪問)、應用卸載時刪除、無需權限;外部存儲:分為公共目錄(所有應用可訪問)和私有目錄(Android/data/ 包名,卸載刪除),訪問公共目錄需權限。
Q65:Android 10 的分區存儲(Scoped Storage)是什么?
A:分區存儲限制應用直接訪問外部存儲根目錄,需通過 MediaStore 訪問公共媒體文件,或使用應用私有目錄,增強用戶隱私保護,Android 11 后強制啟用。
安全與權限
Q66:Android 權限分為哪幾類?
A:正常權限(如 INTERNET,自動授予)、危險權限(如 CAMERA,需動態申請)、特殊權限(如 SYSTEM_ALERT_WINDOW,需跳轉設置頁面申請)。
Q67:如何請求危險權限?
A:檢查是否已授權(checkSelfPermission ()),未授權則請求(requestPermissions ()),在 onRequestPermissionsResult () 中處理結果,必要時顯示權限說明(shouldShowRequestPermissionRationale ())。
Q68:如何加密存儲敏感數據?
A:使用 AndroidKeystore 存儲密鑰、AES 加密數據、SharedPreferences 加密(如 EncryptedSharedPreferences)、避免明文存儲密碼(用哈希 + 鹽值)。
Q69:如何防止應用被反編譯?
A:啟用 Proguard/R8 混淆代碼、使用加固工具(如 360 加固)、敏感邏輯用 C++ 實現(NDK)、檢測調試狀態(Debug.isDebuggerConnected ())。
Q70:網絡傳輸中如何保證數據安全?
A:使用 HTTPS(TLS)、證書校驗(避免中間人攻擊)、數據加密后傳輸、敏感參數不放在 URL 中、使用 OKHttp 的 SSLSocketFactory 配置安全連接。
五、框架與第三方庫
Jetpack 組件
Q71:ViewModel 的作用是什么?
A:ViewModel 存儲與 UI 相關的數據,生命周期獨立于 Activity/Fragment,解決屏幕旋轉等配置變化時的數據丟失問題,通常與 LiveData 配合使用。
Q72:LiveData 的特點是什么?
A:LiveData 是可觀察的數據持有者,能感知生命周期,僅在 Activity/Fragment 處于活躍狀態時通知更新,避免內存泄漏,支持數據粘性(新觀察者能收到舊數據)。
Q73:DataBinding 的優勢是什么?
A:DataBinding 將布局與數據直接綁定,減少 findViewById () 代碼,支持雙向綁定(@={}),可在 XML 中寫簡單邏輯,提升開發效率。
Q74:WorkManager 的作用是什么?
A:WorkManager 管理后臺任務(如同步數據),兼容不同 Android 版本,根據設備狀態(充電、網絡、空閑)智能調度,支持周期性任務和鏈式任務。
Q75:Navigation 組件如何管理頁面跳轉?
A:Navigation 通過導航圖(nav_graph.xml)集中管理頁面關系,支持 Fragment 和 Activity 跳轉,自動處理回退棧,可通過 Safe Args 傳遞參數,避免類型錯誤。
網絡與圖片
Q76:Retrofit 的工作原理是什么?
A:Retrofit 通過動態代理將接口方法轉換為 OKHttp 請求,解析注解(如 @GET、@POST)生成請求參數和 URL,通過 ConverterFactory 解析響應數據(如 Gson),CallAdapter 轉換返回類型(如 Observable)。
Q77:OkHttp 的攔截器有什么作用?
A:攔截器用于在請求發送前或響應返回后處理(如添加公共參數、日志打印、緩存控制、token 過期重試),分為應用攔截器和網絡攔截器。
Q78:Glide 的三級緩存機制是什么?
A:內存緩存(LruCache + 弱引用,最快)→ 磁盤緩存(原始圖片 + 處理后圖片,持久化)→ 網絡請求(最慢)。加載圖片時依次檢查三級緩存,未命中則從網絡獲取。
Q79:Glide 如何實現圖片的高效加載?
A:自動根據 ImageView 尺寸加載對應分辨率圖片、支持內存和磁盤緩存、使用線程池管理加載任務、生命周期感知(避免 Activity 銷毀后仍加載)、自動回收資源。
Q80:RxJava 的背壓是什么?
A:背壓指生產者發送數據速度快于消費者處理速度的問題,RxJava 通過 Flowable 和 Subscriber 支持背壓策略(如緩沖、丟棄、錯誤),控制數據流速。
六、高級特性與現代開發
Compose 相關
Q81:什么是 Composable 函數?
A:Composable 是 Compose 中用于構建 UI 的函數,用 @Composable 注解標記,可嵌套調用,系統會根據狀態變化自動重組(重新執行)需要更新的部分。
Q82:Compose 的重組機制是什么?
A:重組是 Compose 根據狀態變化重新執行部分 UI 代碼的過程,只更新變化的組件,而非整個 UI 樹,通過 remember 保存狀態,避免不必要的重組。
Q83:如何在 Compose 中管理狀態?
A:使用 remember 保存臨時狀態,viewModel () 獲取 ViewModel 中的狀態,狀態提升(將子組件狀態移至父組件)實現狀態共享,使用 StateFlow 管理跨組件狀態。
Q84:Compose 和傳統 View 如何混編?
A:在 Compose 中用 AndroidView 包裹傳統 View,在傳統布局中用 ComposeView 承載 Compose 內容,適合漸進式遷移。
Q85:Compose 中的副作用有哪些處理方式?
A:LaunchedEffect(協程中執行副作用,如網絡請求)、DisposableEffect(需要清理的副作用,如注冊監聽器)、SideEffect(每次重組都執行,如更新全局狀態)。
系統特性與適配
Q86:Android 12 的 Material You 設計語言有哪些特點?
A:支持動態色彩(從壁紙提取主題色)、圓角設計、新的組件樣式(如 Button、Card)、手勢導航增強、應用啟動動畫規范。
Q87:如何適配折疊屏設備?
A:檢測屏幕狀態(展開 / 折疊)、使用 Jetpack WindowManager 獲取屏幕信息、避免硬編碼尺寸、測試多窗口模式、適配不同折疊形態(如內折、外折)。
Q88:如何適配暗黑模式?
A:在 styles.xml 中定義 DayNight 主題,使用?attr / 引用主題屬性,在 res/values-night 目錄下定義暗黑模式資源,支持用戶手動切換模式。
Q89:Android 13 對權限有哪些變更?
A:通知權限需動態申請、媒體權限細分(圖片、視頻、音頻)、剪貼板訪問限制、精確位置權限需單獨申請。
Q90:什么是應用休眠(App Hibernation)?
A:Android 13 引入,長期未使用的應用會被標記為休眠狀態,系統限制其后臺活動和網絡訪問,需在 Manifest 中聲明豁免或提示用戶打開應用解除休眠。
七、測試與調試
測試相關
Q91:單元測試和 instrumentation 測試有何區別?
A:單元測試(如 JUnit)在本地 JVM 運行,測試獨立組件,速度快;instrumentation 測試(如 Espresso)在設備 / 模擬器運行,測試組件交互,依賴 Android 框架。
Q92:Espresso 框架的作用是什么?
A:Espresso 用于 UI 測試,提供簡潔 API(onView ().perform ().check ()),自動處理主線程同步,支持匹配器(Matcher)定位 View,驗證 UI 狀態。
Q93:Mockito 的作用是什么?
A:Mockito 是 mocking 框架,用于創建模擬對象(如網絡請求、數據庫),隔離測試對象,驗證方法調用,設置返回值,簡化單元測試。
Q94:如何測試異步代碼?
A:使用 CountDownLatch 等待異步完成、RxJava 的 TestSubscriber、Coroutine 的 runBlockingTest、Espresso 的 IdlingResource 處理異步加載。
Q95:什么是 UI Automator?
A:UI Automator 用于跨應用 UI 測試,可操作系統控件(如通知欄、設置),適合端到端測試,支持通過文本、描述等定位元素。
調試與工具
Q96:ADB 有哪些常用命令?
A:安裝應用(adb install)、卸載(adb uninstall)、查看日志(adb logcat)、重啟(adb reboot)、查看設備(adb devices)、截圖(adb shell screencap)、錄屏(adb shell screenrecord)。
Q97:Android Profiler 的主要功能是什么?
A:Android Profiler 包含 CPU(分析方法耗時)、內存(檢測泄漏)、網絡(監控請求)、電量(分析耗電)分析工具,實時監控應用性能。
Q98:如何使用 Layout Inspector 分析布局問題?
A:Layout Inspector 可實時查看應用的 View 樹結構、屬性和測量信息,識別過度繪制、層級過深等問題,支持 3D 視圖查看布局層次。
Q99:什么是 systrace?
A:systrace 用于分析系統級性能問題,記錄 CPU 調度、UI 渲染、進程狀態等信息,生成 HTML 報告,可識別掉幀、鎖競爭等瓶頸。
Q100:LeakCanary 的工作原理是什么?
A:LeakCanary 在 Activity/Fragment 銷毀后,通過弱引用檢測是否被回收,未回收則觸發 GC 并分析堆內存,生成泄漏路徑報告,幫助定位內存泄漏。