插件化框架shadow的總結

1啸如、插件框架有兩個作用:一是“自解耦”迹蛤,二是“免安裝”样刷。

目標:“像Web一樣開發(fā)App”則是一個我們后期達成的目標蒜撮,這大概是“自解耦”和“免安裝”的組合形式

1.自解耦指的是:一個應用原本由一份代碼編譯而成暴构,希望改成將其中的一些功能單獨編譯,像插件一樣動態(tài)插在主應用上段磨。這樣一來可是使主應用體積變小取逾,下載安裝更方便。二來可以是比較獨立的功能可以單獨開發(fā)調試苹支,甚至單獨更新版本砾隅。
2.免安裝指的是:一個應用原本需要安裝過程才能啟動運行,希望改為無需安裝即可從一個已經安裝運行的App中啟動起來债蜜。這一需求的主要目的是提高流量復用的能力晴埂。

還未具備的能力:1、下載一部分啟動一部分的能力寻定。2儒洛、ContentProvider

2、宿主和插件使用同一個包名的好處

在執(zhí)行插件代碼的過程中狼速,系統(tǒng)可能會調用一些(公有的或私有的)接口獲取應用的applicationId琅锻,
然而插件從真正意義上來說并沒有安裝到設備上,如果插件的applicationId和宿主的applicationId不相同,系統(tǒng)獲取到插件的applicationId是一個沒有安裝過的包名恼蓬,系統(tǒng)就因此crash惊完。
為了避免出現上述情況,有兩種方法:

  1. hook系統(tǒng)接口处硬,需要兼容各種OEM系統(tǒng)以及Android各版本
  2. 插件的applicationId和宿主的applicationId保持一致
3小槐、Fragment調試很麻煩:

比如業(yè)務插件里有一個com.xx.GiftFragment類,實際運行時這個類的名字就變成了com.xx.GiftFragment_郁油。這就導致在com.xx.GiftFragment的源碼上打斷點是斷不下來的本股。必須在程序運行起來之后,用IDE的重命名功能把它改名為com.xx.GiftFragment_桐腌,使得源碼和運行時類名字一致才能斷點。

4苟径、缺點:

Shadow開源的代碼目前沒有包括插件下載和版本檢查實現的案站。
加固
卸載插件
ContentProvider
Fragment調試很麻煩
插件A同插件B有沖突so

插件化要解決的關鍵問題是:插件Activity能收到生命周期回調

舊框架使用反射的地方:attach初始化activity,super.onCreate()獲取私有變量傳遞給我們自己的new的activity

shdow的關鍵點:使用AOP和字節(jié)碼編輯將插件activity繼承自activity的類替換為插件Activity繼承shadowActivity

Activity和Service最大的區(qū)別是Activity是有狀態(tài)的棘街,Service是無狀態(tài)的蟆盐。

對于插件框架來說,有兩點十分必要遭殉。

一是插件一般都是熱更新的石挂,質量上要求可能會降低一些,一旦出現Crash不會影響其他進程的組件险污。
二是Android的JVM虛擬機不支持Native動態(tài)庫反加載痹愚,所以在同一個進程中相同so庫的不同版本即不能同時加載,也不能換著加載蛔糯,會造成插件和宿主存在so庫沖突拯腮。

動態(tài)化原理:

C語言需要編譯和連接兩個步驟,java則編譯成字節(jié)碼蚁飒,在運行時才會去查找用到的類动壤,在用到的時候再去替換對應真正要啟動的類

container代理殼子:

我們可以通過修改ClassLoader的parent,為ClassLoader新增一個parent淮逻。將原本的PathClassLoader->BootCalssLoader結構變?yōu)镻athClassLoader ——> DexClassLoader ——> BootCalssLoader
Container的動態(tài)化是使用了唯一一次反射修改私有變量琼懊。ClassLoader的parent域不屬于非公開API,甚至不是Android的代碼爬早,而是JDK的代碼

view同名問題:

插件和宿主存在同名的view會報錯哼丈,因為LayoutInflater在inflated的時候做了一層緩存,以View的類名作為Key保存了Class對象凸椿。

一個自定義的Factory削祈,然后復制了原本內置構造邏輯的代碼。在這段邏輯中,也有緩存機制髓抑。但是我們將緩存的Key添加了標記插件apk的“partKey”作為一部分咙崎,這樣相同名字的View在緩存中就是不同的Key了

webview加載插件資源的問題:

替換ShadowWebView,攔截請求吨拍,將file:///android_asset/協(xié)議都修改成http://android.asset/協(xié)議

so加載的問題

插件A同插件B有沖突so褪猛,又需要在同一個進程中工作,也需要so的設計方自行解決羹饰。
Android系統(tǒng)不允許在一個進程中混用64位的so和32位的so伊滋,目前的解決方案是讓宿主先加載一個32位的so

看完shadow的分析文章,對于拿來主義的人是不適合的队秩,因為需要很多二次開發(fā)或者完善的東西笑旺,至于在這些東西中存在了多少坑需要多長時間填就不知道了,對于快速驗證可行性馍资,產品解決方案快速落地的公司或者個人也是不適合的筒主,需要做的東西太多了。

對于個人研究鸟蟹,完善shadow乌妙,讓這個框架快速成熟起來是可以的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末建钥,一起剝皮案震驚了整個濱河市藤韵,隨后出現的幾起案子,更是在濱河造成了極大的恐慌熊经,老刑警劉巖泽艘,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異奈搜,居然都是意外死亡悉盆,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門馋吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焕盟,“玉大人,你說我怎么就攤上這事宏粤〗徘蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵绍哎,是天一觀的道長来农。 經常有香客問我,道長崇堰,這世上最難降的妖魔是什么沃于? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任涩咖,我火速辦了婚禮,結果婚禮上繁莹,老公的妹妹穿的比我還像新娘檩互。我一直安慰自己,他們只是感情好咨演,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布闸昨。 她就那樣靜靜地躺著,像睡著了一般薄风。 火紅的嫁衣襯著肌膚如雪饵较。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天遭赂,我揣著相機與錄音循诉,去河邊找鬼。 笑死嵌牺,一個胖子當著我的面吹牛打洼,可吹牛的內容都是我干的。 我是一名探鬼主播逆粹,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炫惩!你這毒婦竟也來了僻弹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤他嚷,失蹤者是張志新(化名)和其女友劉穎蹋绽,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體筋蓖,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡卸耘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了粘咖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚣抗。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瓮下,靈堂內的尸體忽然破棺而出翰铡,到底是詐尸還是另有隱情,我是刑警寧澤讽坏,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布锭魔,位于F島的核電站,受9級特大地震影響路呜,放射性物質發(fā)生泄漏迷捧。R本人自食惡果不足惜织咧,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漠秋。 院中可真熱鬧笙蒙,春花似錦、人聲如沸膛堤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肥荔。三九已至绿渣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燕耿,已是汗流浹背中符。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留誉帅,地道東北人淀散。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像蚜锨,于是被迫代替她去往敵國和親档插。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容