Activity相關
- Android 基礎知識
- Activity 的幾種啟動模式及應用場景
- taskAffinity 屬性詳解
- onSaveInstanceState()和onRestoreInstanceState()使用詳解
測試下來發(fā)現(xiàn):onSaveInstanceState()在onStop之后調用,onRestoreInstanceState在onStart()之后調用。可以在ActivityThread類的callActivityOnStop()方法和handleStartActivity()方法中看出來。
Fragment相關



Service相關
Android一般的進程優(yōu)先級劃分:
1.前臺進程 (Foreground process)
2.可見進程 (Visible process)
3.服務進程 (Service process)
4.后臺進程 (Background process)
5.空進程 (Empty process)
安卓系統(tǒng),根據(jù)oom_adj, 占用內存大小,進程活躍程度,來綜合決定回收哪個進程。oom_adj 存儲在proc/PID/oom_adj文件中,其中PID是進程的id,直接 adb shell進入手機根目錄查看這個文件即可。
比如我現(xiàn)在進程是在最前面和我交互的,是前臺進程,進程id是18303,這樣查看。
1|HWNOH:/ $ cat /proc/18303/oom_adj
0
HWNOH:/ $
然后我退到后臺,再次查看。
1|HWNOH:/ $ cat /proc/18303/oom_adj
11
HWNOH:/ $
Service的運行線程,Service啟動方式以及如何停止直接看 ServiceDemo
Android布局優(yōu)化之ViewStub、include、merge
BroadcastReceiver 相關
AsyncTask相關
Android 事件分發(fā)機制
Android View 繪制流程
- Android LayoutInflater原理分析,帶你一步步深入了解View(一)
- Android視圖繪制流程完全解析,帶你一步步深入了解View(二)
- Android視圖狀態(tài)及重繪流程分析,帶你一步步深入了解View(三)
- Android invalidate是如何導致View重繪的
Android Window、Activity、DecorView以及ViewRoot
Android的核心Binder多進程AIDL
AMS,WMS,PMS
git clone https://android.googlesource.com/platform/frameworks/base
替換成
git clone https://aosp.tuna.tsinghua.edu.cn/platform/frameworks/base
- Android 鏡像使用幫助
- Android解析ActivityManagerService(一)AMS啟動流程和AMS家族
- ActivityManagerService是什么?有什么作用?
- Android解析WindowManagerService(一)WMS的誕生
Android ANR
Android 內存相關
Android 屏幕適配
Android 緩存機制
Android 性能優(yōu)化
- Android App優(yōu)化之內存優(yōu)化(序)
- Android性能優(yōu)化(三)之內存管理
- Android 性能優(yōu)化(四)之內存優(yōu)化實戰(zhàn)
- 最全的Android內存優(yōu)化技巧
Android MVC、MVP、MVVM
Android Gradle 知識
RxJava
OkHttp
OkHttp是一個高效HTTP客戶端,原因如下:
- HTTP/2支持請求同一個host的多個請求共享一個socket連接。
- 連接池降低請求延遲(HTTP/2不可用的情況)。
- 透明的GZIP壓縮下載體積。
- 響應緩存,避免完全重復的request發(fā)起網(wǎng)絡請求,可以直接從緩存里面獲取響應。
當OkHttp遇到網(wǎng)絡問題的時候,它會靜默的從常見的連接問題中恢復。如果你的服務有多個IP地址,當?shù)谝淮芜B接失敗的時候,OkHttp會嘗試其他的地址。對于IPv4+IPv6以及服務放在多個數(shù)據(jù)中心的情況,這是很重要的。OkHttp支持先進的TLS(傳輸層安全協(xié)議)特性。
使用OkHttp很簡單。它的request/response API都是使用構建模式創(chuàng)建,并且是不可變的。OkHttp支持同步和異步請求。
HTTP1.0、HTTP1.1 和 HTTP2.0 的區(qū)別
三次握手四次揮手
-
TCP建立連接為什么是三次握手,為什么不是兩次或四次?
為什么要四次揮手呢?
- 主動結束端發(fā)送消息給被動結束端,說明主動結束端已經(jīng)沒有數(shù)據(jù)發(fā)送了。
- 被動結束端收到消息后,被動結束端的數(shù)據(jù)可能還沒有發(fā)送完畢,所以他先發(fā)送一個消息告訴主動結束端:"我知道了"。
- 被動結束端數(shù)據(jù)發(fā)送完畢后,通知主動結束端:“我數(shù)據(jù)發(fā)送完了,可以關閉連接了?!?。
- 主動結束端發(fā)送一個消息給被動結束端,如果在兩倍超時間內沒有收到響應,就斷開連接。
Retrofit
Android 熱更新與插件化
Android組件化
Android模塊開發(fā)之SPI 通過
ServiceLoader來加載所有的接口的實現(xiàn)類也可以了解一下。
卡頓相關
卡頓原因是什么,如何檢測卡頓,怎么判斷是頁面響應卡頓還是邏輯處理造成的卡頓?
卡頓原理是什么:60幀每秒是目前最合適的圖像顯示速度,也是絕大部分Android設備設置的調試頻率,如果在16ms內順利完成界面刷新操作可以展示出流暢的畫面,而由于任何原因導致接收到VSYNC信號的時候無法完成本次刷新操作,就會產(chǎn)生掉幀的現(xiàn)象,刷新幀率自然也就跟著下降(假定刷新幀率由正常的60fps降到30fps,用戶就會明顯感知到卡頓)
造成卡頓的常見原因:
- 過度繪制
- 去除不必要的背景
- 布局文件扁平化
- merge、ViewStub標簽的使用
- UI線程中有耗時操作,I/O讀寫、數(shù)據(jù)庫訪問等;
- 減少ui線程中的耗時操作
- 頻繁的GC
- 避免內存抖動,瞬間創(chuàng)建大量的臨時對象。不要在for循環(huán)中去new對象或在onDraw方法中創(chuàng)建對象等。
- 避免內存泄漏。
如何檢測卡頓?
- StickMode
- TraceView(已被棄用,考慮使用 Android Studio自帶的CPU Profiler)
- AndroidPerformanceMonitor
- ANR-WatchDog
- Choreographer
推薦使用 AndroidPerformanceMonitor和Android Studio自帶的CPU Profiler
怎么判斷是頁面響應卡頓還是邏輯處理造成的卡頓?
關于運算阻塞導致的卡頓的分析可以使用TraceView(已被棄用,考慮使用 Android Studio自帶的CPU Profiler)android studio:profiler調試閃退解決方法
備注:我的理解頁面響應卡頓就是指布局過于復雜、過度繪制造成的卡頓。可以打開發(fā)開者選項里的OverDraw(調試GPU過度繪制)和GPU呈現(xiàn)模式來查看
- AndroidPerformanceMonitor(BlockCanary)源碼分析參考這篇文章 Android中UI性能分析原理。源碼可以參考:https://github.com/humanheima/AndroidPerformanceMonitor
Handler 機制原理,IdleHandler 什么時候調用。
LeakCanary 原理,為什么檢測內存泄漏需要兩次?
我的理解為什么要檢測兩次? 其實就是為了準確性唄。寧可錯殺一百,不愿放過一個。
- 如果在activity destroy以后并且在5秒鐘之后系統(tǒng)沒有進行gc,那么activity對象是沒有被回收的,此時我們檢測發(fā)現(xiàn)activity對象沒有被回收,然后我們再手動調用一次gc,gc過后,我們再檢測一次activity對象是否被回收,如果被回收了,那么結束,如果activity對象還是沒有被回收說明很可能出現(xiàn)了內存泄漏無法被回收,所以我們就并dump出當前的內存文件供之后進行分析。
屬性動畫、補間動畫、幀動畫的區(qū)別和使用場景;
Android 動畫框架詳解,第 1 部分 這篇文章講了補間動畫實現(xiàn)原理
APK 瘦身是怎么做?
冷啟動優(yōu)化
Android性能優(yōu)化(一)之啟動加速35%
https://zhuanlan.zhihu.com/p/86283192
RecyclerView相關
- Android RecyclerView內部機制
- RecyclerView第一次設置LayoutManager和Adapter之后的源碼分析
- RecyclerView源碼分析之二 滾動時候的ViewHolder的回收和復用
- RecyclerView notifyDataSetChanged 之后的源碼分析
- RecyclerView notifyItemInserted 之后的源碼分析
- RecyclerView notifyItemRemoved 之后的源碼分析
- RecyclerView 調用 notifyItemInserted 自動滾動到底部的問題
如何判斷一個 APP 在前臺還是后臺?
代碼可以參考
https://github.com/humanheima/ActivityDemo
如何做應用保活?全家桶原理?
Retrofit 在 OkHttp 上做了哪些封裝?
invalidate和requestLayout的區(qū)別
Parcelable & Parcel
Parcel是一個可以通過IBinder來發(fā)送的消息 (data and object references) 容器。Parcel不是一個通用的序列化機制。Parcelable & Parcel和被設計成一個高性能的IPC傳輸。因此,Parcel數(shù)據(jù)不適合持久存儲(存儲在文件中)。
Parcelable的原理
如何將 Parcelable 保存到本地文件里
ButterKnife
加載超級大的圖片
SurfaceView 和 TextureView 的區(qū)別。
Android 打包流程
Android中的Dalvik和ART區(qū)別分析
進程管理
V1 V2 V3 簽名
Walle渠道包生成工具基于V2簽名:
對新的應用簽名方案生成的APK包中的ID-value進行擴展,提供自定義ID-value(渠道信息),并保存在APK中
而APK在安裝過程中進行的簽名校驗,是忽略我們添加的這個ID-value的,這樣就能正常安裝了
在App運行階段,可以通過ZIP的EOCD(End of central directory)、Central directory等結構中的信息(會涉及ZIP格式的相關知識,這里不做展開描述)找到我們自己添加的ID-value,從而實現(xiàn)獲取渠道信息的功能
新一代渠道包生成工具完全是基于ZIP文件格式和APK Signing Block存儲格式而構建,基于文件的二進制流進行處理,有著良好的處理速度和兼容性,能夠滿足不同的語言編寫的要求,目前筆者采用的是Java+Groovy開發(fā), 該工具主要有四部分組成: 1. 用于寫入ID-value信息的Java類庫 2. Gradle構建插件用來和Android的打包流程進行結合 3. 用于讀取ID-value信息的Java類庫 4. 用于供com.android.application使用的讀取渠道信息的AAR
這樣,每打一個渠道包只需復制一個APK,然后在APK中添加一個ID-value即可,這種打包方式速度非常快,對一個30M大小的APK包只需要100多毫秒(包含文件復制時間)就能生成一個渠道包,而在運行時獲取渠道信息只需要大約幾毫秒的時間。
下面的代碼獲取渠道信息:
WalleChannelReader的 getChannel 方法。
@Nullable
public static String getChannel(@NonNull final Context context) {
return getChannel(context, null);
}
@Nullable
public static String getChannel(@NonNull final Context context, @NonNull final String defaultChannel) {
final ChannelInfo channelInfo = getChannelInfo(context);
if (channelInfo == null) {
return defaultChannel;
}
return channelInfo.getChannel();
}
硬件加速相關
在Target API level >=14 硬件加速默認開啟。在 Android 里,硬件加速專指把View中繪制的計算工作交給 GPU來處理。啟用硬件加速需要更多資源,因此應用會占用更多內存。簡單來說,開啟硬件加速主要在繪制和執(zhí)行動畫的過程中可以提升性能。
WindowManagerService
WindowManagerService的作用:
- 窗口管理(WindowManager)
- 輸入系統(tǒng)的中轉站(InputManagerService)
- 窗口動畫(WindowAnimator)
- Surface管理(SurfaceFlinger)