如何評論 360 開源的 Android 插件機制 Droid Plugin?
GitHub
https://github.com/Qihoo360/DroidPlugin『DroidPlugin 是360手機助手在Android系統上實現了一種新的插件機制:它可以在無需安裝、修改的情況下運行APK文件,此機制對改進大型APP的架構,實現多團隊協作開發具有一定的好處。』
有亮點:
//解決小米JLB22.0 4.1.1系統自帶的小米安全中心(lbe.security.miui)廣告攔截組件導致的插件白屏問題
private void fuckMiUiLbeSecurity()
---------------------華麗麗的分割線---------------------
抖機靈獲得這麼多贊,謝謝大家。很能理解作者起這個方法名的心情,也很慶幸作者很快修改了這個名字,詳見 bugfix · Qihoo360/DroidPlugin@356f341 · GitHub ,當然最應該感謝作者的開源精神,希望該項目越來越好用,再次感謝。
目前正在寫 DroidPlugin 插件框架系列文章,感興趣的可以喵喵:
- Hook機制之動態代理
- Hook機制之Binder Hook
- Hook機制之AMSPMS
- Activity生命周期管理
- 插件載入機制
- 廣播的處理方式
- Service的管理
占坑,看源碼去。
願意分享自己的組件,始終是件好事看到終於有個大公司放出動態載入框架,挺有感慨的,先佔個坑,回頭再詳細補充。
另外,我公司的項目是一個遊戲SDK,整體的框架也用了動態載入的機制,只不過這是幾年前寫的,所以還是很LOW的動態載入。一直以來一直想升級這個框架,最近也做了一點研究,有興趣的同學可以看看:kaedea/android-dynamical-loading · GitHub有亮點2--PluginClassLoader.class :
@Override
protected Class&&> loadClass(String className, boolean resolve) throws ClassNotFoundException {
if (Build.MANUFACTURER != null sPreLoader.contains(Build.MANUFACTURER.toUpperCase())) {
try {
/**
* FUCK QIKU!
* 這裡適配奇酷手機青春版。
* 因為奇酷手機自己載入了自己修改過的的Support V4庫,在插件中也用了這個庫的時候,ClassLoader會優先載入奇酷手機自帶的Support V4庫。
* 原因在於,奇酷手機沒有預載入插件中打的Support V4庫。詳情可以研究super.loadClass(className, resolve)標準實現
* 但是這可能會導致類不兼容,出現java.lang.IncompatibleClassChangeError。因為插件編譯時使用的插件的Support V4,而奇酷手機則使
* 用的是它修改過的Support V4。
*
* SO,在Class Loader載入某個Class的時候,我們優先從自己的ClassLoader中載入Class,如果找不到,再從Parent Class Loader中去載入。
* 這樣修改後,Class的載入順序就跟系統的不一樣了。
*
*/
Class&&> clazz = findClass(className);
if (clazz != null) {
return clazz;
}
} catch (ClassNotFoundException e) {
Log.e("PluginClassLoader", "UCK QIKU:error", e);
}
}
return super.loadClass(className, resolve);
}
做安卓適配真的是有說不完的故事啊...這些狗血的青春啊。
遙想當年為了適配一個妹子的小米機,那是跪著跑去人家學校專程找她當面調bug....
這是一個人寫的?看到manifest 裡面,看覺想很早以前的淘寶,所謂的隔離無非是放倒另一個進程,進程掛了不會影響宿主
前兩天當我進去看到一些類的命名以My開頭時,我就覺得這應該是個人做的demo,而不是一個公司的開源項目,然後就關掉了那個頁面。
占坑,剛開始看,真的挺複雜,作者必然對android framework層各個service很熟悉,基本上對各個主要的service都做了hook。各種反射,各種動態代理,挺有樂趣。
從源碼看這個應該是比較成熟的插件框架了,最起碼相對我們開發的插件框架來說非常成熟。作者動態代理了一切常用的XXManager,並且看的出來作者為兼容性做了很大的努力,光對Manifest.xml的解析就有api15~22不同的版本,無奈於Android對四大組件的嚴格控制,框架們都只能通過在宿主Manifest里提前註冊占坑,當然有些實現可以只註冊一個組件,來管理所有插件的這個組件(比如Service,我們的框架就是這個思路),但隨之而來的就是穩定性問題。總之,要感謝作者能夠把這麼優秀的框架開源出來。撒花
占坑,待研究!
想問下各位對這種插件方式通信怎麼解決?廣播么?廣播靜態當做動態來處理的,有時候不好用,還有這個宿主程序啟動插件的過程中占坑的stub acitvity明顯時間太長了,這個占坑的activity又不好改樣式什麼的,導致啟動插件apk的過程中極其不協調,不知道有沒有大神教下這裡怎麼做,或者作者告知下,我實在是不知道怎麼縮減這個activity的佔用時間
其實這個需求早就有了, 只不過現有的機制來得都沒有這個改得徹頭徹尾. 作者需要很深的功底.暫不評論什麼帶來什麼負面影響, 且說對於更向底層學習android的人來說, 絕對是個大福利.
這也是使用instrumentation欺騙的方式啟動插件apk的activity的。
進步了
準備看,占坑。看看和插件開發有啥關係。
存心不讓我約妹子了?占坑,馬上回來研究代碼
不是吧, 趕緊看。
這個就是能同時運行兩個微信的原因
aidl import activityinfo異常,是我編譯器問題?
推薦閱讀:
※安卓開發工程師到一個新公司的第一天一般幹嘛呢?
※Android 如何賺錢?
※Android中View, SurfaceView的繪圖和GLSurfaceView繪圖有區別嗎?
※過度依賴框架有什麼不好?