在2017年至今各大公司推出的插件化技術(shù)越來越成熟,,發(fā)展到了頂峰,,井噴了許多高質(zhì)量的插件化框架,以應(yīng)對大型App的開發(fā),。但是時不湊巧 2018年,,Google官方祭出了大殺器 -- 禁止調(diào)用私有API(經(jīng)過@hide修飾的方法),也意味著賴以生存的插件化技術(shù)走向了終結(jié),。隨著Android P的發(fā)布,,使用插件化的你做好應(yīng)對方案了嗎?
這如何做到呢,? 在類加載機(jī)制分析中,我們可以發(fā)現(xiàn),,系統(tǒng)的Class是被BootStrapClassLoader加載的,,BootStrapClassLoader也稱為系統(tǒng)類加載器 應(yīng)用層經(jīng)過反射調(diào)用系統(tǒng)的Api最終會調(diào)用BootStrapClassLoader的加載類的方法。 那我們能否將我們apk中定義的某個工具類的ClassLoader變成BootStrapClassLoader呢,?如果能實現(xiàn)那該怎樣才能使工具類能夠正常調(diào)用經(jīng)@hide注解修飾的系統(tǒng)api 答案是肯定可以的,! 查看Android系統(tǒng)源碼 在art/runtime/mirror/class.h頭文件中 有一個SetClassLoader這個函數(shù),該函數(shù)的作用是將ClassLoader添加進(jìn)系統(tǒng)的類加載器集合,,添加進(jìn)去的ClassLoader會成為系統(tǒng)的類加載器,,這個ClassLoader非java對象的ClassLoader類,是虛擬機(jī)內(nèi)核真正做加載類的c 對象,,如何獲取到這個對象呢,? 通過在Android源碼中查找,在art/runtime/well_known_classes.h中剛好有一個函數(shù)ToClass能夠?qū)ava的class 轉(zhuǎn)變成 虛擬機(jī)內(nèi)核中的ClassLoader,, 只不過該ClassLoader在封裝在 該函數(shù)返回的 mirror::Class 結(jié)構(gòu)體的成員變量 reference_中 |
|