Android動(dòng)態(tài)加載Jar(包含第三方依賴(lài)Jar)

? ? ? ? 最近項(xiàng)目有一個(gè)需求捻悯,需要根據(jù)用戶(hù)需求動(dòng)態(tài)加載APP內(nèi)某功能模塊匆赃,且當(dāng)該部分功能模塊代碼有變動(dòng),只需更新該功能JAR今缚,無(wú)需更新整個(gè)APK算柳,基于這個(gè)需求,決定采用動(dòng)態(tài)加載Jar的方式去實(shí)現(xiàn)姓言,于是各種查資料進(jìn)行驗(yàn)證瞬项,終于搞定,由于最近腦子容量不夠何荚,所以將實(shí)現(xiàn)方式整理出來(lái)并開(kāi)放給大家進(jìn)行參考囱淋。

實(shí)現(xiàn)過(guò)程需要注意的點(diǎn):

1、當(dāng)我們實(shí)現(xiàn)功能的Library工程中還依賴(lài)了其他第三方Jar餐塘,我們需要將其合并妥衣,否則你生成的Library對(duì)應(yīng)的Jar包不含第三方文件會(huì)報(bào)錯(cuò);

2戒傻、Android的虛擬機(jī)(Dalvik VM)是無(wú)法識(shí)別Java打出jar的class文件税手,DVM識(shí)別的是dex文件,所以需要通過(guò)dx工具轉(zhuǎn)換成包含有dex文件的jar;

所以整個(gè)過(guò)程可以分為以下三個(gè)步驟來(lái)實(shí)現(xiàn):

第一步:創(chuàng)建Library工程需纳,導(dǎo)出Jar冈止;

第二步:將主Jar和依賴(lài)Jar進(jìn)行合并(ANT),將合并后的Jar進(jìn)行DX處理候齿;

第三步:利用DexClassLoader動(dòng)態(tài)加載熙暴;


下面通過(guò)一個(gè)例子來(lái)介紹具體實(shí)現(xiàn)闺属,首先看一下整個(gè)項(xiàng)目組成部分:

app:主工程Module;

commoninterfacelibrary:用于定義標(biāo)準(zhǔn)接口周霉,供主項(xiàng)目集成掂器,第三方實(shí)現(xiàn)具體功能;

dynamiclibrary:第三方實(shí)現(xiàn)功能庫(kù)俱箱,在主項(xiàng)目中国瓮,動(dòng)態(tài)加載該庫(kù);

utillibrary:工具庫(kù)狞谱,模擬動(dòng)態(tài)加載庫(kù)中引用的第三方類(lèi)庫(kù)乃摹;

一、生成Jar

1跟衅、在commoninterfacelibrary中定義通用接口及方法:

定義完成后孵睬,生成common_interface.jar;

注:生成jar包方法比較簡(jiǎn)單伶跷,直接Build——>Make Project后掰读,在build/intermediates/bundles/debug下找到classes.jar進(jìn)行重命名。

2叭莫、將common_interface.jar拷貝到dynamiclibrary項(xiàng)目app/libs下蹈集,然后在dynamiclibrary下的gradle中添加對(duì)此jar的依賴(lài):

定義ICommonInterface的實(shí)現(xiàn)類(lèi)DynamicImp并實(shí)現(xiàn)具體方法:

注:MathUtil是定義在utillibrary下的一個(gè)工具類(lèi),生成出common_util.jar后拷貝到dynamiclibrary進(jìn)行依賴(lài)雇初,此處實(shí)現(xiàn)比較簡(jiǎn)單忽略該步拢肆。

按照上面生成jar的方法,生成出dynamiclibrary對(duì)應(yīng)的dynamic.jar靖诗;

經(jīng)過(guò)上述步驟后郭怪,我們得到三個(gè)jar包,分別是:

common_interface.jar? 定義了標(biāo)準(zhǔn)接口呻畸;

common_util.jar 定義了工具類(lèi);

dynamic.jar 標(biāo)準(zhǔn)接口的實(shí)現(xiàn)類(lèi)悼院,我們需要?jiǎng)討B(tài)加載的jar伤为;

二、合并JAR并使用DX工具處理JAR包

? ? ? ? 下面我們開(kāi)始介紹合并Jar的流程据途,由于common_interface.jar是標(biāo)準(zhǔn)接口绞愚,我們會(huì)在主項(xiàng)目中引用,所以不需要合并它颖医,我們只需要合并common_util.jar和dynamic.jar位衩。

? ? ? ? 對(duì)于合并Jar的方式,網(wǎng)上有很多方式熔萧,如fatjar插件糖驴、或者用IDEA工具僚祷,具體操作方法自行百度,我這里用的是ANT合并的方式贮缕,首先我們需要安裝并配置ANT環(huán)境:

ANT下載官網(wǎng)地址:http://ant.apache.org/bindownload.cgi

下載完成后辙谜,解壓,然后在我的電腦 –> 右鍵屬性 –> 高級(jí)系統(tǒng)配置 -> 環(huán)境變量中配置ANT:

然后加入到系統(tǒng)變量的path中:

驗(yàn)證ANT環(huán)境是否已配置好:

看到上面的信息感昼,證明ANT配置成功装哆,下面來(lái)合并包,將需要合并的jar包放在同一個(gè)文件夾下定嗓,了解ant的都知道蜕琴,ant構(gòu)建的文件默認(rèn)為build.xml,所以在文件夾下我們還需要?jiǎng)?chuàng)建該文件宵溅,并進(jìn)行如下配置:

name? : 表示的是你即將合成的jar包的名字 凌简;

basedir :? 表示你存放jar包的目錄;

上面配置文件的含義就是层玲,將當(dāng)前目錄下所有jar進(jìn)行合并号醉,并在該目錄下載生成名字為dynamic_combine.jar的新包,文件配置好后辛块,執(zhí)行下面的命令:

執(zhí)行成功后畔派,我們需要將該jar包使用dx工具進(jìn)行轉(zhuǎn)化:

將合并后的jar包拷貝到android-sdk/buildtools下的任意一個(gè)版本目錄下,執(zhí)行“dx --dex --output=dynamic_combine_dx.jar dynamic_combine.jar”

三润绵、動(dòng)態(tài)加載

執(zhí)行成功后线椰,我們得到最終的dynamic_combine_dx.jar,下面我們可以在主項(xiàng)目中進(jìn)行動(dòng)態(tài)加載了尘盼,通過(guò)兩步來(lái)介紹動(dòng)態(tài)加載過(guò)程:

1憨愉、下載dynamic_combine_dx.jar到SD卡:

首先將dynamic_combine_dx.jar拷貝到app/assets下(這里是為了模擬下載過(guò)程,實(shí)際項(xiàng)目中可配置到后臺(tái)卿捎,從后臺(tái)下載)

注:需在manifest添加權(quán)限

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2配紫、下載到SD卡成功后,進(jìn)行動(dòng)態(tài)加載調(diào)用相應(yīng)方法:

先執(zhí)行下載方法午阵,后執(zhí)行加載方法:

執(zhí)行結(jié)果為:

成功躺孝,撒花!5坠稹植袍!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市籽懦,隨后出現(xiàn)的幾起案子于个,更是在濱河造成了極大的恐慌,老刑警劉巖暮顺,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厅篓,死亡現(xiàn)場(chǎng)離奇詭異秀存,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贷笛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)应又,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人乏苦,你說(shuō)我怎么就攤上這事株扛』慵觯” “怎么了洞就?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掀淘。 經(jīng)常有香客問(wèn)我旬蟋,道長(zhǎng),這世上最難降的妖魔是什么革娄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任倾贰,我火速辦了婚禮,結(jié)果婚禮上拦惋,老公的妹妹穿的比我還像新娘匆浙。我一直安慰自己,他們只是感情好厕妖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布首尼。 她就那樣靜靜地躺著,像睡著了一般言秸。 火紅的嫁衣襯著肌膚如雪软能。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天举畸,我揣著相機(jī)與錄音查排,去河邊找鬼。 笑死抄沮,一個(gè)胖子當(dāng)著我的面吹牛跋核,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播合是,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼了罪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锭环!你這毒婦竟也來(lái)了聪全?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辅辩,失蹤者是張志新(化名)和其女友劉穎难礼,沒(méi)想到半個(gè)月后娃圆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛾茉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年讼呢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谦炬。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悦屏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出键思,到底是詐尸還是另有隱情础爬,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布吼鳞,位于F島的核電站看蚜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赔桌。R本人自食惡果不足惜供炎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疾党。 院中可真熱鬧音诫,春花似錦、人聲如沸仿贬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茧泪。三九已至蜓氨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間队伟,已是汗流浹背穴吹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗜侮,地道東北人港令。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锈颗,于是被迫代替她去往敵國(guó)和親顷霹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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