Android 插件化開發(fā)(一) - 動態(tài)代理

因為項目和團隊的需要蛋济,個人開始對插件化技術預研」鞅睿現(xiàn)在這個技術已經(jīng)在Android開發(fā)領域變得相當?shù)幕馃幔蟾艔?014年開始已經(jīng)有很多優(yōu)秀的流派產(chǎn)生碗旅,到最近的滴滴插件化項目的開源渡处,目前插件化技術越來越成熟。對大型項目從架構到實施都是一種優(yōu)秀的解決方案祟辟。閑話不多說骂蓖,從基數(shù)到深入在學習過程中所需的各方面的知識點在此都一一做個整理。

插件化開發(fā)的優(yōu)勢

1川尖、大型項目業(yè)務繁雜登下,需要多個部門協(xié)同合作。人多則亂叮喳,所以需要合適的架構對業(yè)務進行最大的程度的解耦被芳,插件化可以使各個部門獨立開發(fā)個字業(yè)務的app,同時在需要的情況將各自的應用集成進一個整體的應用中馍悟,使其可以獨立開發(fā)和發(fā)布畔濒,但又可以相互依賴和合并。

2锣咒、應用無需發(fā)布更新侵状,可以通過下載插件或者補丁的方式在后臺完成修復或者更新。

動態(tài)代理在插件化技術中的使用

動態(tài)代理是java設計模式中代理模式的另一種實現(xiàn)毅整,通過JVM在運行期通過反射為委托的接口類動態(tài)的生成代理的一種技術趣兄。目前最火熱的Android網(wǎng)絡請求的開源庫Retrofit就是基于這種技術實現(xiàn)的一款Restful Api風格的Android網(wǎng)絡客戶端框架(本篇主要講的是具體的實例技術在插件化中的應用,所以此處不詳細提悼嫉,但是推薦大家去看下Retrofit源碼艇潭,通過動態(tài)代理去做接口配置的代理,這種設計思想很棒)。

在目前市面上流行的插件化框架中蹋凝,動態(tài)代理同樣被廣泛使用÷尘溃現(xiàn)在我們來看一下最近滴滴才開源的插件化框-VirtualApk中如何使用動態(tài)代理對系統(tǒng)的服務進行hook接管的。

load plugin

如上圖在demo的MainActivity中鳍寂,加載插件第一步是初始化了插件的管理器PluginManager這個類改含。該類為插件化管理的核心類,將加載的插件放在了一個ConcurrentHashMap中進行管理迄汛。PluginManager.getInstance(base)中實例化了PluginManager并在初始化的時候調用了prepare()方法捍壤。接著看一下這個prepare()方法中的操作。

hookService 圖1


hookService 圖2

上圖可以看出隔心,hookSystemServices()方法先通過反射獲取到系統(tǒng)ActivityManagerNative中的IActivityManager接口,然后通過動態(tài)代理的方式尚胞,對IActivityManager接口進行代理硬霍,再用其替換掉系統(tǒng)的達到接管系統(tǒng)服務的目的。我們再看該動態(tài)代理的實現(xiàn)笼裳。

proxy 圖1
proxy 圖2
proxy 圖3

如上圖所示(部分代碼截圖)唯卖,該動態(tài)代理類對需要接管的服務,如:startService等進行了修改和接管躬柬,繞開了系統(tǒng)的限制拜轨,判斷了是否是本地啟動和遠程啟動進行了不同的處理。

關于動態(tài)代理的概念允青,推薦大家參考這篇文章:www.ibm.com/developerworks/cn/java/j-lo-proxy1/index.html

此處startService方法中根據(jù)入?yún)bject[] args數(shù)組(代理對應方法的入?yún)?shù)數(shù)組橄碾,此處是IActivityManager接口中方法startService(IApplicationThread caller, Intent service,String resolvedType, String callingPackage,int userId)的入?yún)ⅲ┤^(qū)分來源為本地或插件服務來進行不同的分發(fā)操作。

總結

代理模式在JAVA中廣泛的應用颠锉,是AOP編程的一種實現(xiàn)手段法牲。本文只是列舉了動態(tài)代理技術在插件化框架中的某個功能的實現(xiàn)。其實不管是動態(tài)代理還是靜態(tài)代理琼掠,在插件化框架中都有大量的使用去繞過系統(tǒng)的限制達到加載插件去執(zhí)行宿主中的功能拒垃。大家可以先從Android Activity等服務的啟動流程的源碼閱讀去更深入的了解系統(tǒng)服務的運行過程,從而找到合適的切入點去代理系統(tǒng)的服務達到自己的定制化需求瓷蛙。此外悼瓮,JVM的動態(tài)代理技術只能代理接口,原因是在代理類最后都繼承了Proxy這個類艰猬,根據(jù)Java的單一繼承規(guī)則横堡,所以只能為接口動態(tài)代理。如果想對抽象類或者類做動態(tài)代理可以采取cglib來實現(xiàn)冠桃,具體的就不在本文中討論了翅萤,大家可以查找相關的實現(xiàn)或自己去嘗試。關于插件化中使用到的其他技術,我會一邊學習一邊分享給大家套么,后續(xù)會整理出對應的demo培己。

引用

VirtualApk:github.com/didi/VirtualAPK

動態(tài)代理的概念:www.ibm.com/developerworks/cn/java/j-lo-proxy1/index.html

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胚泌,隨后出現(xiàn)的幾起案子省咨,更是在濱河造成了極大的恐慌,老刑警劉巖玷室,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件零蓉,死亡現(xiàn)場離奇詭異,居然都是意外死亡穷缤,警方通過查閱死者的電腦和手機敌蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來津肛,“玉大人章喉,你說我怎么就攤上這事∩碜” “怎么了秸脱?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長部蛇。 經(jīng)常有香客問我摊唇,道長,這世上最難降的妖魔是什么涯鲁? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任巷查,我火速辦了婚禮,結果婚禮上抹腿,老公的妹妹穿的比我還像新娘吮便。我一直安慰自己,他們只是感情好幢踏,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布髓需。 她就那樣靜靜地躺著,像睡著了一般房蝉。 火紅的嫁衣襯著肌膚如雪僚匆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天搭幻,我揣著相機與錄音咧擂,去河邊找鬼。 笑死檀蹋,一個胖子當著我的面吹牛松申,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼贸桶,長吁一口氣:“原來是場噩夢啊……” “哼舅逸!你這毒婦竟也來了?” 一聲冷哼從身側響起皇筛,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤琉历,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后水醋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旗笔,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年拄踪,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝇恶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡惶桐,死狀恐怖撮弧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耀盗,我是刑警寧澤想虎,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布卦尊,位于F島的核電站叛拷,受9級特大地震影響,放射性物質發(fā)生泄漏岂却。R本人自食惡果不足惜忿薇,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躏哩。 院中可真熱鬧署浩,春花似錦、人聲如沸扫尺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽正驻。三九已至弊攘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姑曙,已是汗流浹背襟交。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伤靠,地道東北人捣域。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焕梅。 傳聞我的和親對象是個殘疾皇子迹鹅,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,769評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)丘侠,斷路器徒欣,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 引言 先簡單介紹一下Android插件化。很早之前已經(jīng)有公司在研究這項技術蜗字,淘寶做得比較早打肝,但淘寶的這項技術一直是...
    流水潺湲閱讀 11,149評論 8 149
  • 我發(fā)現(xiàn)我對自己越來越?jīng)]有自信了,也的確有太多事情挪捕,事實證明自己越來越做不好了粗梭!曾經(jīng)覺得自己教學能力雖不會大言不慚地...
    薛薛閑扯閱讀 125評論 0 0
  • 文/雪諾 微信公眾號:迷茫人生路 還有幾天就二十三了,在我年少的日子里二十三是一個多么好的年紀啊级零,有自由断医、...
    Snow鳳閱讀 536評論 0 0