目錄
- OkHttp
- Retrofit
- RxJava2
- Glide
- LeakCanary
- LeakCanary2
- BlockCanary
- Legend
- RetrofitUrlManager
- Lieric
- EventBus(在寫)
- 插件化
- Proguard (在寫)
- Gson
- 再看還有哪些
OkHttp
1.初始化喊儡,用的是Builder建造者模式,把什么SocketFactory啊巍佑,HostVerifier啊配置設(shè)置好,了解什么是Build模式,挑幾個組件看一下
延展閱讀
如何做證書固定防止抓包
http://www.reibang.com/p/f2bdcb96c210
如何做加密
http://www.520monkey.com/archives/1234
2.發(fā)送請求琅攘,這里不講同步,只講異步
異步就是看equeue的內(nèi)部實現(xiàn),比如線程池
延展閱讀
必須理清的線程池
https://mp.weixin.qq.com/s/eyFVplFcZoN6-4WTMojtMw
3.如何對請求還有響應(yīng)的處理估灿,這里就是講Interceptor攔截器扫沼,也就是責(zé)任鏈模式出爹,了解責(zé)任鏈模式的好處庄吼,及OkHttp用到的幾個責(zé)任鏈內(nèi)部實現(xiàn)。
比如ConnectInterceptor严就,CacheInterceptor
延展閱讀
緩存機(jī)制
http://www.reibang.com/p/fb81207af121
攔截器的區(qū)別
http://www.reibang.com/p/d04b463806c8
4.鏈接機(jī)制比較復(fù)雜总寻,涉及了連接池等一系列概念,這個就不能是只看部分了梢为,要看就得全套
延展閱讀
連接機(jī)制
http://www.reibang.com/p/4801587c8a1b
連接的三個核心
http://www.reibang.com/p/6166d28983a2
5.最后是讀寫機(jī)制OkIO
http://www.reibang.com/p/f5941bcf3a2d
6.一些應(yīng)用擴(kuò)展方面的渐行,比如HttpDns啊,域名容災(zāi)啊
延展閱讀
Android HttpDns OkHttp踩坑記錄
http://www.reibang.com/p/a0967bed8756
動態(tài)切換域名的庫RetrofitUrlManager(這個其實是攔截器的應(yīng)用)
http://www.reibang.com/p/222b62c06497
完整解析OkHttp的參考鏈接
拆輪子系列
https://blog.piasy.com/2016/07/11/Understand-OkHttp/index.html
隔壁李老頭系列
http://www.reibang.com/p/82f74db14a18
野生的安卓獸系列
http://www.reibang.com/u/6e5ebce41b4f
Retrofit2.0
1.初始化铸董,也就是實例創(chuàng)建祟印,用的是Builder建造者模式
Retrofit的構(gòu)造方法是default的,通過靜態(tài)內(nèi)部類
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fanyi.youdao.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
配置好
serviceMethod:包含所有網(wǎng)絡(luò)請求信息的對象
baseUrl:網(wǎng)絡(luò)請求的url地址
callFactory:網(wǎng)絡(luò)請求工廠
adapterFactories:網(wǎng)絡(luò)請求適配器工廠的集合
converterFactories:數(shù)據(jù)轉(zhuǎn)換器工廠的集合
callFactory在Retrofit2.0之后是默認(rèn)OkHttp粟害。
這里是一個外觀模式的創(chuàng)建方式旁理,至于怎么生成一個對象
就是這個create方法內(nèi)部調(diào)用Proxy.newProxyInstance方法。
實現(xiàn)接口InvocationHandler我磁。
這個invoke方法里
主要就是生產(chǎn)serviceMethod
這個ServiceMethod是給后邊OkHttpCall去用的
調(diào)用順序呢
Retrofit.build.create
ServiceMethod.loadServiceMethod
ServiceMethod.build
內(nèi)部parseMethodAnnotation方法孽文,把Api.class內(nèi)的代碼根據(jù)注解全部解析,解析完之后放到一個Map<Method, ServiceMethod<?, ?>> 緩存起來夺艰。
剩下的網(wǎng)絡(luò)請求基本跟okhttp一樣芋哭。
里面
延展閱讀
主要講api的
Android Retrofit 2.0 的詳細(xì) 使用攻略(含實例講解)
http://www.reibang.com/p/a3e162261ab6
完整解析Retrofit2.0的參考鏈接
野生的安卓獸系列
http://www.reibang.com/nb/16181158
Carson_ho系列
http://www.reibang.com/p/0c055ad46b6c
Rxjava2
http://www.reibang.com/c/299d0a51fdd4
Glide
幾個圖片加載庫的對比
http://www.reibang.com/p/97994c9693f9
1.初始化,與Retrofit差不多郁副,外觀模式
Glide.with(this).load(url).into(imageView);
with里面?zhèn)魅胧裁搭愋偷膮?shù)決定了這個圖片的生命周期减牺。
比如傳view,找對應(yīng)的activty或者fragment存谎,傳context去判斷是不是applicationContext拔疚。
當(dāng)然,內(nèi)部還會判斷是不是后臺線程既荚,是的話也返回getApplicationManager稚失。
如果是applicationContext那么返回getApplicationManager來管理圖片生命周,
其余的情況都是attach上一個fragment恰聘,監(jiān)聽這個fragment的生命周期來管理圖片的生命周期句各。
2.三級緩存
讀取過程在Engine類的load方法里
內(nèi)部依次
keyFactory.buildKey生成key---提高圖片命中率可以從這里入手
EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);---從activeResource拿,本質(zhì)上是key晴叨,weakReference的map
EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);---從lru拿凿宾,拿到就從lru里刪除,放到activeResouce里
EngineResource用一個acquired來計數(shù)兼蕊,類似方法計數(shù)器初厚。
計數(shù)為0就listener.release
diskLru什么時候讀
EngineRunnable的run方法內(nèi)部調(diào)用decode方法。
3.內(nèi)存回收
Application的triLowMem里面有回收方法孙技,
最終都是解析bitmap产禾,原因也是方便recycle內(nèi)存排作。
以上兩條沒深究了。
4.緩存圖的key生成方法
EngineKey key = keyFactory.buildKey(id, signature, width, height, loadProvider.getCacheDecoder(),
loadProvider.getSourceDecoder(), transformation, loadProvider.getEncoder(),
transcoder, loadProvider.getSourceEncoder());
延展閱讀
郭霖老師的glide解析下愈,在第三部分最后段有講如何提高url命中率
https://blog.csdn.net/guolin_blog/article/details/53759439
完整解析Glide參考鏈接
野生的安卓獸系列
http://www.reibang.com/nb/23459686
Carson_ho系列
http://www.reibang.com/p/c3a5518b58b2
LeakCanary
時刻記住纽绍,檢測Android內(nèi)存泄漏永遠(yuǎn)圍繞 “對象被引用蕾久,無法被GC” 的概念
這個庫實際上就是势似,檢查activity的引用,然后導(dǎo)出引用樹僧著。
核心原理在 weakReference和weakReferenceQueue的使用履因,所以一定要充分了解。
何時去注冊盹愚,何時去dump栅迄,在什么線程,這個都是次要的皆怕。
這個庫比較原理比較簡單毅舆,直接貼別人總結(jié)整理好的
https://mp.weixin.qq.com/s/UfxG41HInNfv9nkDvKpcZQ
延展閱讀
順帶可以學(xué)好好學(xué)習(xí)四大引用
http://www.reibang.com/p/50b9db5924b8
LeakCanary 2
http://www.reibang.com/p/80f18e8f330d
Leoric
BlockCanary
說到內(nèi)存泄漏的庫愈腾,就不得不提到這個檢測卡頓的庫憋活。
這是作者寫的原理解析
http://blog.zhaiyifan.cn/2016/01/16/BlockCanaryTransparentPerformanceMonitor/
Android UI卡頓監(jiān)測框架BlockCanary原理分析
http://www.reibang.com/p/e58992439793
這一篇源碼閱讀還有流程分析也寫得很好
http://www.reibang.com/p/55c08d21e63b
本質(zhì)上,就是對Looper.loop方法內(nèi)的dispatchMsg進(jìn)行了監(jiān)聽虱黄,該庫認(rèn)為卡頓都是有誰阻塞了消息的派發(fā)悦即。
這個庫的源碼也比較簡單,一般是會被發(fā)散問到 handler的機(jī)制橱乱。
比如辜梳,為什么handler里的sendMsgDelay不會阻塞,為什么loop死循環(huán)不會卡UI
前者關(guān)健是loop的needAwake字段泳叠,后者關(guān)鍵是是pipe管道機(jī)制
延展閱讀
線程學(xué)習(xí)作瞄,上面兩個阻塞問題看handler部分
http://www.reibang.com/p/fb07e8b77eb1
Legend
免root的hook框架
兩個方式調(diào)用,注解和api危纫。
通過注解的方式粉洼,最終也是調(diào)用api方式。
說白了叶摄,就是一個靈活調(diào)用反射的庫属韧,然后把需要反射的方法放入一個map里緩存。
但是又和普通的反射調(diào)用不一樣蛤吓,它不是直接invoke調(diào)用宵喂,
它是構(gòu)造了一個舊方法的結(jié)構(gòu)體信息,把hook的新數(shù)據(jù)寫進(jìn)去会傲,然后用Native方法锅棕,把這個結(jié)構(gòu)體數(shù)據(jù)寫入內(nèi)存(實際是指針重新指向這個新的結(jié)構(gòu)體)拙泽。
延展閱讀
http://www.reibang.com/p/55ac341ca6cb
RetrofitUrlManager
這是一個用于動態(tài)域名切換的庫
本質(zhì)呢,是利用OkHttp的攔截器完成域名攔截替換的工作裸燎,
內(nèi)部維護(hù)三種不同級別的解析器顾瞻,結(jié)合Retrofit的ServiceMethod解析方法(實際上就是注解的方式)解析url,解析完放入cache里德绿。
還提供里兩個callback荷荤,用來提示替換過程。
延展閱讀
http://www.reibang.com/p/222b62c06497
EvnetBus
在寫這一部分之前移稳,要了解什么是注解蕴纳,如何使用注解
延展閱讀
http://www.reibang.com/p/1544b7f119bf
插件化
這個總結(jié)在另一篇了
http://www.reibang.com/p/9f392c46e670
要重點理解,生命周期如何管理(一般是activity的為主)个粱,資源R文件重名怎么辦古毛,如何調(diào)用插件類。
關(guān)鍵詞都许,hook稻薇,classLoader的雙親委派機(jī)制,反射原理
實際應(yīng)用胶征,換膚
https://github.com/hongyangAndroid/ChangeSkin
Proguard
各種工廠類進(jìn)行參數(shù)/方法名替換的工作
沒啥好重點的
延展閱讀
http://www.reibang.com/p/734424a14eff