Android 插件化的過去-如今-將來

本文原創,轉載請以連接形式註明地址:http://kymjs.com/code/2016/05/04/01
第一篇文章,做爲序文,並無什麼實質性內容,僅僅是一些八卦和歷史,重效率的朋友能夠選擇直接跳過。java

##過去android

三年前,一款名叫【23code】的應用讓廣大 Android 開發者都"紅了眼",並非他作的多麼酷炫,論內容,他僅僅是一個自定義UI控件集合應用,真正讓人捉摸不透的是他的實現,他能夠直接下載一個自定義控件的demo,而且運行起來,這是我知道的最先的插件化開發的應用。
當時,Github上有一個開源的插件化框架,叫 AndroidDynamicLoader ,他使用一個Activity做爲外殼,動態加載一個未安裝apk中的Fragment,並經過外殼Activity來處理Fragment的所有生命週期,達到動態加載一個Android視圖界面的效果。 儘管在如今看來這種實現複雜而麻煩,但在當時應該算是很先進的動態加載思路了。他應該是最先的開源 Android 插件化框架。
兩年前,在 2014 年 4月,一位中國人開源了一個插件化框架,叫 DL。這個名字是做者本身取的,全名爲:dynamic-load-apk。 其實現原理是建立一個靜態代理 Activity,將動態加載到未安裝的 Activity 中的所有方法(包括生命週期方法)使用靜態代理類調用執行。然而因爲是動態加載的類,靜態代理調用後沒有辦法拿到super,只能在編寫插件時使用that來替代super,而這個that對象實際上就是靜態代理類。這應該是最先的國產開源插件化框架了。
同年5月,我在讀了DL的所有源碼後,完成了本身的第一個插件化框架:CJFrameForAndroid,其實就只是在DL的基礎上加入了 Service 的動態加載和Activitylaunchmode 以及插件頁面間的數據傳遞。
一樣是 2014年7月(或者8月),一位名叫 null 的朋友(中國人),寫了一個插件化加載框架,叫android-pluginmgr 利用 java 虛擬機字節碼操做方式,經過動態生成一個插件類的子類,達到插件化的功能。儘管熱編譯(或者叫熱部署)首次建立時效率很是低,可是首次建立後下次加載就能達到比起反射調用快的多的效果,同時能夠作到插件代碼沒必要遵循任何限定。這個新的思路讓我眼前一亮。然而如今,看到他的master分支已經與 lody 一塊兒,改爲了Instrumentation加載,而 dev 分支還保留着個人first commit真的很抱歉,當時答應 null 的到如今也沒作到,很遺憾,也感謝你一直保留 dev tree 到如今。
2014年11月,11月份,當時高一剛入學3個月的 lody 也寫了一個插件化框架,叫Direct-Load-apk這個庫已經被刪除了,如今你看到的是一個別人fork的倉庫,緣由我們最後講八卦 ) 這個庫我給他起名 DLA,最初跟 lody 說的時候他還鬧着跟我爭冠名權,明明就是我先說的。DLA使用的應該是當時最早進方案了,以致於第二年的DroidPluginDynamicAPK都採用的是這套方案,只不過實現起來更爲嚴謹。經過找到一切Activity啓動的根源:Instrumentation經過替換這個類,來加載一個假裝的Activity欺騙系統的校驗,而實際上加載的是未安裝的插件Activity。git

##如今github

今年彷佛並無什麼新的插件化項目了,因此就從去年提及了。
15年最先出的是阿里的熱修復技術:AndFix 經過加載器讀取一個dex文件中的類,並找到被註解標記到的要修復的方法,再經過jni在C層替換掉本來出BUG的方法的指針,從而達到熱修復的目的。這套方案做爲熱修復而言並無任何問題可言,可是熱修復畢竟是熱修復,不能達到動態添加的目的。
隨後還有QQ空間的熱修復方案:MultiDex的思路,在應用啓動的時候,往ClassloaderPathList裏面插入一個Dex,經過覆蓋掉出BUG的類來作到熱修復。QQ空間只出了理論方案,而這套方案的開源代碼實現,則是由 賈吉鑫 寫了一個 nuwa 託管在了 Github 上。
相關的熱修復項目還有幾個就不一一講解了,我們繼續看下半年出的幾個插件化項目。web

2015年8月,當時還在360手機助手的張勇開源了一個插件化框架,叫:DroidPlugin 跟上面說的DLA同樣,經過修改Instrumentation實現Activity動態加載,經過修改ActivityThread實現Service動態加載。提及來很是容易,可是實際上實現起來應該是困難重重。做者幾乎是徹底本身實現了一套Framework層中對Service和Activity加載的方案,替換掉了系統幾乎所有相關的Binder
同年10月,攜程的也開源了其插件化框架:DynamicAPK,內容沒細看,聽說最成功的是本身實現了一個aapt,替換掉SDK的aapt後能夠作到對插件資源重排,達到資源通用。
2016年初開源的一個項目:Small,不光有Android的插件化功能,同時做者還提供了IOS的實現代碼。這個項目融合了熱修復的類替換思路和插件化的資源加載,是一個很是好的思路。項目的 java 代碼自己並無什麼特殊的地方,跟上面講的差很少,主要內容是在 groovy 腳本里面,經過腳本修改了編譯後生成的插件資源id。還沒看完,不敢作評價。swift

##將來瀏覽器

說到將來,也不得不提去年出來的ReactNative,儘管我一直說他不可能會成爲最終方案,但移動應用web化必定是一個必然的趨勢,就好像曾經的桌面應用由C/S到B/S的轉變。而怎麼web化纔是關鍵之處。
馮老師以前說過,他走的時候已經開始有團隊着手研究基於頁面級別的動態加載了。什麼是基於頁面級別,想一想今天的瀏覽器,只有在你真正想要瀏覽那個頁面時,纔去加載那個頁面的內容。移動應用中的2/8定律,80%的用戶訪問20%的頁面,那麼剩下80%的頁面是不必用戶去下載的,只有在用到的時候去下載。隨着最近從新撿起被我扔掉兩年的插件化開發知識,也慢慢感觸到這種方案彷佛真的是可行的。
再說回RN,呵呵噠,一個HelloWorld項目就是8M+,這什麼概念?一個so文件6M什麼概念?我敢下斷言,拋開阿里的 WeeX 不提,今年下半年絕對還會出基於RN這種思路的web應用框架,並且只會作的更好。
不過這裏提一個思路,也是最近團隊內部分享的時候想到的,既然RN僅僅是so包很大,他的增量bundle仍是很小的,那麼有沒有可能經過插件化的方案,動態加載這些so包,來解決這個問題?雖然立刻就被同事拋來:"那沒網怎麼辦?"這種尷尬的問題。。。框架

##聊點別的ui

上文講了一個叫DL的項目,相信若是是瞭解過的人,應該都清楚,做者叫任玉剛,原點心桌面的後來被百度收購後到了百度衛士,不少人叫他主席由於最初在他QQ羣裏面等級排行最高的稱呼叫主席。任老師寫過一篇博客,叫:《樹立我的品牌:讓名企hr們主動來找你》講的很在理,原文的點擊量已經有15225了。前幾天五一去北京,跟廖祜秋 聊到一件事,說如今的技術社區愈來愈浮躁了。swiftcon剛剛結束,會上某嘉賓打醬油被各類吐槽,一個技術會議竟然找了一些辣妹去跳舞,以及直播寫代碼的美女也作技術分享了。微博上各位大V網紅也都開始創建收費羣,粉絲紅利時代你們都想分到一杯羹。
但是各位想成爲網紅的朋友,有沒有想過在你樹立我的品牌的時候,是否有想過拿什麼來支撐你的品牌,站在風口豬也能飛,可飛遠了之後是沒有風了的,須要靠你本身的翅膀了。
最初在寫 CJFrameForAndroid 的時候,被某我的威逼利誘過,說項目涉及抄襲,要求加上協做者聲明,並在項目主頁加上連接,若是這樣作了,能夠在他火起來了之後,在博客幫我作宣傳推廣。一樣的DLA爲何會刪庫,據我所知也是有些外力摻和,雖然 lody 並無跟我說什麼。
再說到前幾個月,有人利用Github的watchlist,擅自將不少GitHub排名較高的人加入了列表中,從那之後,該項目無論作了什麼改動,在列表中的人都會收到一份通知郵件。爲此 JakeWharton 還特地回復他讓他不要再這麼作了。.net

相關文章
相關標籤/搜索