RePlugin插件化的問(wèn)題和解決辦法

這篇文章基于 Replugin2.2版本的,后續(xù)可能會(huì)隨著框架改動(dòng)和bug修復(fù)有些問(wèn)題可能就不存在了。如果你跟我一樣也是對(duì)插件化開發(fā)躍躍欲試,又在里面栽跟頭了,我想本片文章可能會(huì)對(duì)大家提供點(diǎn)小小的幫助。最終問(wèn)題的解決還是離不開對(duì)框架原理的熟悉。否則遇到了問(wèn)題也不知道從何下手。孤陋寡聞的我可能踩了一些很低級(jí)的錯(cuò)誤,還望各位大大們?cè)诎l(fā)現(xiàn)本文講得不對(duì)的地方指正。

目錄

  • 插件使用宿主的對(duì)象
  • v7包
  • 插件橫屏
  • 熱更新插件
  • 坑位之顯示Intent無(wú)效
  • 插件和宿主同工程的問(wèn)題
  • 幽靈魔術(shù)

插件使用宿主的對(duì)象

1.我想在插件中使用宿主的new出來(lái)的對(duì)象,但是如果在插件中和宿主中同時(shí)依賴一份資源是無(wú)法使用的,會(huì)報(bào)類轉(zhuǎn)化異常。比如宿主和插件都要用okhttp3,但是我不想插件中也要初始化一個(gè)。

答:
只在宿主中通過(guò)dependencies的方式依賴一下,然后將工程切換成Project模式。如下圖

找到這個(gè)依賴文件,在jar文件上右鍵打開目錄。

將這個(gè)jar文件拷貝到你的插件目錄下。然后通過(guò)provided的方式進(jìn)行編譯依賴。

 provided files('libs/xxx.jar')

注意,provided僅僅是編譯依賴,不會(huì)打包進(jìn)apk包里。這樣當(dāng)Replugin框架在dex加載的時(shí)候拿到的就是宿主的class。就不會(huì)造成類轉(zhuǎn)化異常了。

小技巧提示:
如果你的插件需要公共host里面的一些類和基礎(chǔ)服務(wù)。(注意不含資源,資源指圖片和xml)
可以在host里剝離出一個(gè)模塊,讓host去依賴它,然后將該模塊打包成jar的方式,提供給插件使用。猶如sdk的開發(fā)模式,但是一定要注意務(wù)必使用provided關(guān)鍵字。莫打包進(jìn)去了。

模塊打包成jar的方式如下:

在依賴模塊中的gradle里添加配置:

android {
  lintOptions {
        abortOnError false
    }

 }
//注意makeJar放在外層 
task makeJar(type: Jar, dependsOn: ['build']) {
    destinationDir = file('build/outputs/jar/')
    baseName = "AppSDK"
    version = "1.0.0"
    from('build/intermediates/classes/debug')
    exclude('**/BuildConfig.class')
    exclude('**/BuildConfig\$*.class')
    exclude('**/R.class')
    exclude('**/R\$*.class')
    include('**/*.class')
}

打開gradle命令列表(在as的右側(cè),看到?jīng)]?)
找到該模塊的的other選項(xiàng)

找到 makeJar

ok,這樣就編譯好了,接下來(lái)復(fù)制到插件的libs里 provided files一下即可。

這里比較麻煩的事是,每當(dāng)你修改過(guò)這個(gè)依賴模塊的代碼都需要重寫打包一份jar。項(xiàng)目上線后如果宿主沒(méi)有升級(jí),那么最好不要改動(dòng)依賴模塊中的代碼。


v7包

1.插件布局加載后莫名其妙的多了一些外邊距,無(wú)法全屏 獨(dú)立運(yùn)行是正常的

答:
插件不能共享資源宿主的v7包,注意如果你違反這條去嘗試開發(fā)插件。會(huì)導(dǎo)致你的插件apk布局莫名其妙的多出一些邊距。

注意:
即便插件中你沒(méi)有依賴v7包,也是可以使用AppCompatActivity的。但是包里不會(huì)包含v7包的資源。
是因?yàn)镾dkVersion版本過(guò)高所以可以直接使用。

解決辦法:
在插件中單獨(dú)依賴一份v7包,而不是共享宿主的。


2.插件中加載的布局是上一個(gè)宿主的布局

答:
你使用了基礎(chǔ)的Activity,沒(méi)有使用v7包里的AppCompatActivity并且關(guān)閉了 useAppCompat = false

解決辦法:
如果你的拋資源找不到錯(cuò)誤,先嘗試使用RePlugin.getPluginContext() 取獲取資源。
加載布局文件配合 LayoutInflater.from()。塞入View。或者直接替換成AppCompatActivity就沒(méi)有這個(gè)問(wèn)題了。(推薦用AppCompatActivity問(wèn)題會(huì)少很多)


插件橫屏

插件目前manifest配置了橫屏是無(wú)效的。這也許是坑位導(dǎo)致的,可以動(dòng)態(tài)在onCreate的時(shí)候改變一下

  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
          ·····
}


熱更新插件

wiki文檔里已經(jīng)講過(guò)了,對(duì)于沒(méi)有啟動(dòng)(加載過(guò))的插件是可以安裝后就運(yùn)行的。但是若插件被啟動(dòng)過(guò)或正在運(yùn)行時(shí)則不行。針對(duì)特殊的應(yīng)用場(chǎng)景不得不重啟app,而且還是主動(dòng)重啟。
那么發(fā)現(xiàn)如果開啟了 persistentEnable = true 常駐應(yīng)用內(nèi)存。(就是一個(gè)服務(wù))會(huì)導(dǎo)致即便重啟了app,插件安裝后還是沒(méi)有被更新。這里迫使我關(guān)掉了persistentEnable選項(xiàng),隨后重啟后就成功更新了。注意我這里說(shuō)的重啟是非root下,應(yīng)用自己殺死自己,而非用戶主動(dòng)kill掉。


坑位之顯示Intent無(wú)效

比如廣播,這種如果你試圖在配置文件中靜態(tài)注冊(cè)的方式去聲明一個(gè)廣播。并沒(méi)有給出。簡(jiǎn)單來(lái)說(shuō)就是intent-filter沒(méi)有設(shè)置。

正確的做法是使用隱式Intent。

代碼如下:

 <receiver android:name=".xxx$AlarmReceiver" >
            <intent-filter>
                <action android:name="xxx" />
            </intent-filter>
            </receiver>
  Intent intent = new Intent();
  intent.setAction("xxx");

這樣就可以了。因?yàn)榭游簧夏壳皼](méi)有使用顯示調(diào)用的方式。

插件和宿主同工程的問(wèn)題

如果你還沒(méi)有建項(xiàng)目,兄弟,聽我一句勸。別建在同一個(gè)工程下。如果你已經(jīng)建立了,趕快剝離。有毒 有毒。準(zhǔn)備折騰死就放在一起吧。后面的毛病越來(lái)越多。雖然我之前也是放在了一個(gè)工程下強(qiáng)行編譯過(guò)去了。但是實(shí)際后面的體驗(yàn)告訴我出了很多問(wèn)題。
1.編譯會(huì)滿,資源占用更多。
2.開發(fā)混亂,不利于管理。
3.莫名其妙的打包錯(cuò)誤。比如下方這樣的:(注意:這個(gè)錯(cuò)誤是突然莫名其妙出現(xiàn)的,我發(fā)誓在出錯(cuò)誤之前沒(méi)有碰過(guò)依賴和gradle里的配置。)

* What went wrong:
Execution failed for task ':app:rpGenerateReleaseBuiltinJson'.
> java.util.zip.ZipException: zip file is empty

詳細(xì)日志省略,見Issues:
https://github.com/Qihoo360/RePlugin/issues/380

幽靈魔術(shù)

什么叫幽靈魔術(shù)問(wèn)題?就和變魔術(shù)一樣,我好像沒(méi)有改什么邏輯性的代碼,突然bug又好了。
多半是你動(dòng)了rePlugin中的gradle里的配置項(xiàng),可能留下了上一次的緩存在里面,你要做的就是每當(dāng)改動(dòng)了gradle里的配置最好搭配Clean Project一下。如下圖:

然后有其他問(wèn)題可以去參考https://github.com/Qihoo360/RePlugin/issues。如果找不到的情況下可以加官方的群。里面還是比較活躍的。

這里再次說(shuō)明一個(gè)問(wèn)題,跑demo玩測(cè)一測(cè)和距離正式項(xiàng)目使用還是有很大的區(qū)別的。很多問(wèn)題在demo里看不出來(lái)的,只有真正用的時(shí)候才會(huì)踩到。盡管說(shuō)replugin的文章說(shuō)只hook了一個(gè)點(diǎn)來(lái)確保穩(wěn)定性。但是由于開發(fā)人員對(duì)框架本身的不夠熟悉,和存在的一些bug。導(dǎo)致接入成本不能說(shuō)極低了。如果要考慮團(tuán)隊(duì)使用,最好由提前做有一個(gè)人來(lái)做預(yù)研接入再推廣給大家使用。熟悉這種模式后,可能會(huì)是如虎添翼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,430評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,653評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,372評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,888評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,738評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,179評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評(píng)論 1 283
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,610評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,916評(píng)論 2 372

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

  • 前言 replugin-plugin-gradle 是 RePlugin 插件框架中提供給replugin插件用的...
    osan閱讀 7,110評(píng)論 8 33
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,891評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,632評(píng)論 25 708
  • 最近幾年移動(dòng)開發(fā)業(yè)界興起了「 插件化技術(shù) 」的旋風(fēng),各個(gè)大廠都推出了自己的插件化框架,各種開源框架都評(píng)價(jià)自身功能優(yōu)...
    斜杠時(shí)光閱讀 3,988評(píng)論 1 36
  • 凌晨五點(diǎn)起床,六點(diǎn)從武漢出發(fā),新修的武漢西變了樣,路也記不清。多繞了十多分鐘才出市區(qū)。以為夠早,高速上卻已經(jīng)開始蝸...
    裁人閱讀 154評(píng)論 0 0