ClassLoader的源碼學(xué)習(xí)路徑:
ClassLoader源碼學(xué)習(xí)-- 學(xué)習(xí)源碼的方法
ClassLoader源碼學(xué)習(xí) -- JVM啟動之 Launcher,ClassLoader構(gòu)建
ClassLoader源碼學(xué)習(xí)-- ClassLoader的創(chuàng)建 -- Android Pie
ClassLoader源碼學(xué)習(xí) -- PathClassLoader姆吭,DexClassLoader
學(xué)習(xí)源碼是一個提升自己的很好的過程已艰,知其一不知其二痊末,會用但不懂原理,是技術(shù)人最忌諱的壞習(xí)慣哩掺。
那么問題來了凿叠,要怎么進(jìn)行源碼學(xué)習(xí)?茫茫多的源碼,量子波動閱速讀盒件?
顯然我們還沒有出現(xiàn)10-16周歲的朋友蹬碧,這個方法不適用。
作為逃課(走捷徑)高手炒刁,我們大部分朋友都沒有吃生牛排的能力恩沽,個人總結(jié)學(xué)習(xí)源碼的方法:
1、需要有一個翔始,明確罗心,明確,明確的目標(biāo)城瞎。
2渤闷、在有了目標(biāo)以后,要用電影思維脖镀,搞清楚為什么會存在這個技術(shù)飒箭。
3、要選擇合適的方法蜒灰,建立完善的步驟弦蹂,去離達(dá)成目標(biāo)。
道理大家都懂卷员,只是很多人打開源碼盈匾,就被淹沒了,看10分鐘還是覺得朋友圈和游戲好玩....
舉個栗子毕骡,最近我對Android的插件化有點興趣削饵,so
1、目標(biāo):手?jǐn)]一個未巫,插件化框架窿撬,并實現(xiàn)demo丟到github
2、了解插件化的故事:(原諒我隨手貼別人的文章)
https://blog.csdn.net/caibaozixiaobai/article/details/80801804
以及插件化的技術(shù)原理:
這玩意好處多多(減少apk體積叙凡,大項目間比組件化要更靈活)劈伴,本質(zhì)上是利用DexClassLoader加載一個未安裝的apk文件(dex文件),獲取別人的Class握爷。
Class都獲取了跛璧,在為所欲為之前,Android 5.0以上要求哪怕是用反射打開別人的Activity新啼,也得在Manifest注冊 追城??(別人的東西燥撞,事先還真注冊不上去)
于是得hook了AMS并寫個ProxyActivity和ProxyApplication座柱, 模仿生命周期去加載別人的Activity和Application迷帜,以及資源文件。
難點在于:
1.得了解類加載機(jī)制色洞,Android還有Java 的編譯過程戏锹,還有ClassLoader先關(guān)知識。
2.由于的Hook AMS火诸, AMS的源碼也得看(創(chuàng)建Application和Activity锦针,怎么加載資源文件)
AS能看到源碼當(dāng)然很好,直觀又快捷惭蹂。但往往都是這個場景
哪怕SDK那把sources for android xx下載了伞插,也是這個命運(yùn)
具體步驟:
1.學(xué)習(xí)源碼,得知道獲取源碼的方式:
jdk源碼:這個在JAVA_HOME目錄下盾碗,有個src.zip ,直接解壓慢慢看
android源碼:https://www.androidos.net.cn/sourcecode
這個網(wǎng)站挺好舀瓢,能把源碼下載廷雅,還方便對比各個版本的差異。
2.有了源碼以后京髓,要把調(diào)用鏈出現(xiàn)的關(guān)鍵字航缀,一個一個mark下來。
如:JVM的類加載: Launcher -> 各個ClassLoader -> 找到loadClass核心方法堰怨,按照這個方法在一步一步展開學(xué)習(xí)芥玉。關(guān)鍵是,每一步都要mark下來备图,不然就無法自拔了灿巧。
3.學(xué)習(xí)的時候,要注意環(huán)境揽涮。比如現(xiàn)在jdk通用是1.8抠藕, android的Api是26,源碼就選定這兩個蒋困。
4.掌握了classLoader和AMS盾似,可以分部逐步實現(xiàn)。如第一步用classLoader雪标,找到第二個apk的類零院。第二步當(dāng)然是hook ams + ProxyActivity,打開別人的Activity村刨,最后慢慢修補(bǔ)細(xì)節(jié)告抄。
廢話這么多,最后強(qiáng)調(diào)重點:注重方法 + 量化步驟烹困。不要看著源碼變書呆子玄妈,找到自己的方法和節(jié)奏是關(guān)鍵。