android replugin插件化實(shí)踐

????實(shí)際項(xiàng)目開發(fā)過(guò)程中經(jīng)常會(huì)遇到和各種第三方app的對(duì)接邓嘹,實(shí)際產(chǎn)品中也開發(fā)了SDK便于與第三方二次開發(fā)险胰,但是這樣第三方還是會(huì)有不少開發(fā)成本汹押。件化的好處在于宿主和插件分開編譯,宿主和插件的可以并行開發(fā)起便、互不干涉棚贾,宿主可以按實(shí)際需求進(jìn)行相應(yīng)插件的下載、安裝及運(yùn)行榆综。網(wǎng)上開源的插件化框架也很多妙痹,都有各自的特點(diǎn)和不足,在項(xiàng)目中應(yīng)客戶的實(shí)際需求鼻疮,采用了360的replugin插件化框架怯伊。

? ??Replugin是360手機(jī)衛(wèi)士2017年開源的安卓插件化開發(fā)框架,屬于占坑類插件化開發(fā)框架陋守。相比于其他插件化方案震贵,replugin的hook點(diǎn)更少,經(jīng)過(guò)360手機(jī)衛(wèi)士眾多插件多年的驗(yàn)證水评,穩(wěn)定性值得信賴猩系。Replugin宿主無(wú)需升級(jí),即可支持新增的四大組件中燥,hook點(diǎn)只有Classloader一處寇甸,易于集成,插件管理穩(wěn)定成熟疗涉,支持插件安裝拿霉、升級(jí)、卸載咱扣、版本管理等绽淘。

1、replugin的接入

????對(duì)replugin插件的開發(fā)及集成進(jìn)行了些研究闹伪,從小demo試驗(yàn)到將app相關(guān)組件進(jìn)行插件化改造沪铭,并編寫demo進(jìn)行插件集成后的測(cè)試,將其中遇到的問(wèn)題進(jìn)行一些總結(jié)偏瓤。

① 插件的開發(fā)

插件的接入主要是一些gradle配置杀怠,首先需要在項(xiàng)目工程的build.gradle文件(不是module的build.gradle文件)中添加360 replugin的gradle依賴,包括host和plugin的依賴厅克。

然后在插件的build.gradle文件中添加相關(guān)配置赔退,需要引入replugin的gradle插件,在repluginPluginConfig中配置插件的名稱、包名及l(fā)auncher activity硕旗,然后在dependencies中引入'com.qihoo360.replugin:replugin-plugin-lib:2.2.4'庫(kù)。

插件gradle配置

????然后在插件的AndroidManifest.xml文件中進(jìn)行配置慧域,填寫插件名稱浪读,”com.qihoo360.plugin.version.ver”的value為100碘橘,不做改動(dòng)痘拆。????

插件的AndroidManifest文件

????以上配置完成后纺蛆,插件的配置就算完成了桥氏,將插件打包成apk后將plugin1.apk后綴名改掉字支,改為plugin1.jar堕伪,插件的名稱自己取欠雌。

② 宿主的接入

????宿主的接入包括gradle配置疙筹、application的繼承以及插件的引入腌歉。

????在宿主module的build.gradle中引入replugin的host插件翘盖,在dependencies中引入庫(kù)” com.qihoo360.replugin:replugin-host-lib:2.2.4”

宿主gradle配置

????然后在宿主的application中需要繼承RePluginApplication并實(shí)現(xiàn)相應(yīng)的接口馍驯,如果沒(méi)采用繼承方式的話玛痊,需要在application生命周期的方法中進(jìn)行相應(yīng)的一些初始化操作擂煞。這里采用繼承的方式对省。最后將插件放到宿主的assets/plugins目錄下蒿涎。

插件存放目錄

至此完成了宿主中插件的接入劳秋,而要在宿主中調(diào)起插件胖齐,只需啟動(dòng)插件的launcher activity呀伙。

插件啟動(dòng)方式

2区匠、對(duì)接過(guò)程中遇到的問(wèn)題

? ? 宿主apk單獨(dú)運(yùn)行正常并不代表集成到宿主apk能運(yùn)行不出差錯(cuò)驰弄。

① 權(quán)限問(wèn)題

? ?????插件中在AndroidManifest.xml中聲明的權(quán)限戚篙,宿主中也相應(yīng)要聲明這些使用權(quán)限岔擂,或者動(dòng)態(tài)檢查申請(qǐng)權(quán)限。

② so庫(kù)目錄問(wèn)題

????集成后開始運(yùn)行塑崖,運(yùn)行時(shí)發(fā)現(xiàn)了so庫(kù)找不到的問(wèn)題规婆。

java.lang.UnsatisfiedLinkError: com.qihoo360.replugin.PluginDexClassLoader[DexPathList[[zip file "/data/data/hik.xxx/app_plugins_v3/xxx10-10-100.jar"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] couldn't find "libstlport_shared.so"

at java.lang.Runtime.loadLibrary(Runtime.java:366)

at java.lang.System.loadLibrary(System.java:988)

? ??so庫(kù)找不到的問(wèn)題抒蚜,一般是由于app中jniLibs下有多個(gè)so庫(kù)目錄嗡髓,但實(shí)際的so庫(kù)并沒(méi)有這些目錄中所有的cpu架構(gòu)的so庫(kù)饿这,導(dǎo)致so庫(kù)找不到蛹稍。把a(bǔ)pp依賴的幾個(gè)module都看了一遍后,發(fā)現(xiàn)確實(shí)有一個(gè)module中jniLibs目錄下有除了armeabi及armeabi-v7a以外的目錄,多了mips及x86目錄奉芦,將其刪了之后剧蹂,重新編譯插件宠叼,然后在宿主工程中運(yùn)行冒冬,發(fā)現(xiàn)仍然報(bào)這個(gè)錯(cuò)誤。最終查了些相關(guān)資料简烤,自己嘗試了多種方法后挥萌,發(fā)現(xiàn)要現(xiàn)在host的jniLibs目錄下先定好所采用的cpu架構(gòu)枉侧,并放上一個(gè)空so庫(kù)文件進(jìn)去榨馁。

so庫(kù)

????LibNativeTest.so無(wú)任何實(shí)際用途,純粹為了占坑黍特。但為何是這樣呢灭衷,這2天看了下replugin源碼翔曲,偶然間瞥到如下中文注釋瞳遍。代碼在PluginNativeLibsHelper.java中掠械。

③ 資源未找到引起崩潰

資源未找到

????插件內(nèi)部跳轉(zhuǎn)猾蒂,跳轉(zhuǎn)到一個(gè)activity時(shí)報(bào)資源文件abc_fade_out.xml未找到引起崩潰,找了一圈發(fā)現(xiàn)abc_fade_out.xml并不是插件apk中引入的資源罩缴,而是系統(tǒng)資源烙荷。

????然錯(cuò)誤提示指示系統(tǒng)的資源沒(méi)找到奢讨,但實(shí)際問(wèn)題肯定應(yīng)該是自身程序代碼問(wèn)題導(dǎo)致的焰薄。定位到出問(wèn)題的代碼片段塞茅,打日志野瘦,發(fā)現(xiàn)確實(shí)在調(diào)用AudioPlayUtil.getInstance()之后就沒(méi)往下執(zhí)行了飒泻。那這個(gè)方法中究竟為何會(huì)導(dǎo)致崩潰呢泞遗。跟蹤一下代碼史辙,看下整個(gè)的執(zhí)行流程聊倔。

????如上圖所示耙蔑,AudioPlayUtil單例初始化時(shí)傳入了application甸陌,在構(gòu)造函數(shù)中邀层,通過(guò)getApplicationContext獲取到Context并保存起來(lái),因?yàn)槭琴Y源找不到引起的問(wèn)題涛目,所以我們主要關(guān)注與資源相關(guān)的代碼霹肝。得到上下文Context后沫换,其中調(diào)用了context.getResources去拿資源讯赏,最終去res的raw目錄找資源冷尉。插件運(yùn)行沒(méi)問(wèn)題漱挎,但集成后運(yùn)行出現(xiàn)了問(wèn)題,而整個(gè)方法只有一個(gè)參數(shù)傳進(jìn)去雀哨。所以肯定是context出現(xiàn)了問(wèn)題磕谅。

? ??實(shí)際運(yùn)行中只是一個(gè)apk私爷,一個(gè)應(yīng)用绽昼,所以在activity中通過(guò)getApplication()獲取到的是宿主的application而不是插件的贷币。我們實(shí)際是想拿到插件中的資源,所以應(yīng)該使用插件的上下文來(lái)獲取啄糙。查找了RePlugin的相關(guān)api放刨,發(fā)現(xiàn)只有一個(gè)getPluginContext()方法來(lái)獲取插件的上下文工秩。所以對(duì)代碼進(jìn)行了下改造,傳入插件的上下文宏榕,資源獲取問(wèn)題得到解決拓诸。獲取資源的地方很多倍谜,像很多Activity中使用getResources().getText()都沒(méi)有報(bào)錯(cuò)褥民,所以需要通過(guò)Context獲取資源時(shí),如果傳入的是application上下文,則需要判斷是宿主還是插件的上下文逞刷。

3题篷、總結(jié)

? ?replugin的接入確實(shí)很方便葫笼,但是實(shí)際集成過(guò)程中還是會(huì)出現(xiàn)各種問(wèn)題。replugin插件可以以兩種方式進(jìn)行集成,內(nèi)置模式和外置模式,插件以內(nèi)置模式方式進(jìn)行集成時(shí)掷漱,需打包到宿主apk中。以外置方式插件可以下載后再安裝、運(yùn)行怀薛。插件化除了集成靈活外创倔,插件有獨(dú)立的版本號(hào)知押,升級(jí)時(shí)可以對(duì)插件獨(dú)立進(jìn)行升級(jí)而不需要整個(gè)app進(jìn)行升級(jí)良价。而且各插件可以獨(dú)立并行開發(fā)痊银,增強(qiáng)開發(fā)效率鬓照。但同時(shí)插件化也有不少問(wèn)題号显,插件化技術(shù)一般都使用了hook次屠,針對(duì)不同手機(jī)廠商的定制安卓系統(tǒng),兼容性需要經(jīng)過(guò)測(cè)試檢驗(yàn)怔昨,穩(wěn)定性也可能會(huì)是個(gè)問(wèn)題原叮,而且如果出現(xiàn)了問(wèn)題唯欣,排查問(wèn)題時(shí)對(duì)開發(fā)者的技術(shù)要求更高。這只是簡(jiǎn)單的集成挡鞍,集成后,插件宿主間通信等,還有很多細(xì)節(jié)還需繼續(xù)深入。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市僧凰,隨后出現(xiàn)的幾起案子怀大,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熟菲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朴恳,警方通過(guò)查閱死者的電腦和手機(jī)抄罕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)于颖,“玉大人呆贿,你說(shuō)我怎么就攤上這事。” “怎么了做入?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵冒晰,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我竟块,道長(zhǎng)壶运,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任浪秘,我火速辦了婚禮蒋情,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秫逝。我一直安慰自己恕出,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布违帆。 她就那樣靜靜地躺著浙巫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刷后。 梳的紋絲不亂的頭發(fā)上的畴,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音尝胆,去河邊找鬼丧裁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛含衔,可吹牛的內(nèi)容都是我干的煎娇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贪染,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缓呛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起杭隙,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哟绊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后痰憎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體票髓,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年铣耘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洽沟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜗细,死狀恐怖玲躯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤跷车,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站橱野,受9級(jí)特大地震影響朽缴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜水援,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一密强、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜗元,春花似錦或渤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惯豆,卻和暖如春池磁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背楷兽。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工地熄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芯杀。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓端考,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親揭厚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子却特,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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