Android動(dòng)態(tài)加載jar(jar中包含第三方j(luò)ar)

1.動(dòng)態(tài)加載jar的作用及意義

a.反破解瑟押,關(guān)于加密等比較隱蔽及隱私的的代碼放在遠(yuǎn)端加載彪薛,即使別人破解了你的apk文件寂呛,也無法獲取這些關(guān)鍵的代碼缤灵,可以隨時(shí)更換安全策略伦籍,提高應(yīng)用的安全性;

b.間接解決方法數(shù)超過65535的限制腮出,不再將jar打入apk文件中

c.可以進(jìn)一步研究鸽斟,拓展成apk的動(dòng)態(tài)加載

2.原理

? ? Dalvik虛擬機(jī)如同其他Java虛擬機(jī)一樣,在運(yùn)行程序時(shí)首先需要將對應(yīng)的類加載到內(nèi)存中利诺。而在Java標(biāo)準(zhǔn)的虛擬機(jī)中,類加載可以從class文件中讀取剩燥,也可以是其他形式的二進(jìn)制流慢逾,因此,我們常常利用這一點(diǎn)灭红,在程序運(yùn)行時(shí)手動(dòng)加載Class侣滩,從而達(dá)到代碼動(dòng)態(tài)加載執(zhí)行的目的,然而Dalvik虛擬機(jī)畢竟不算是標(biāo)準(zhǔn)的Java虛擬機(jī)变擒,因此在類加載機(jī)制上君珠,它們有相同的地方,也有不同之處娇斑。我們必須區(qū)別對待策添,Dalvik虛擬機(jī)識別的是dex文件,而不是class文件毫缆。因此唯竹,我們供類加載的文件也只能是dex文件,或者包含有dex文件的.apk或.jar文件苦丁。

? ? ?Android中和類加載相關(guān)的兩個(gè)類:DexClassLoader和PathClassLoader

? DexClassLoader :可以加載jar/apk/dex浸颓,也可以從SD卡中加載,通過其靜態(tài)方法loadDex(path, outpath, 0) 得到DexFile對象;

? PathClassLoader: 只能加載已經(jīng)安裝到Android系統(tǒng)中的apk文件产上,通過構(gòu)造函數(shù)new DexFile(path)來產(chǎn)生DexFile對象棵磷。?

? 這兩者的區(qū)別在于DexClassLoader需要提供一個(gè)可寫的outpath路徑,用來釋放.apk包或者.jar包中的dex文件晋涣。也就是說PathClassLoader不能主動(dòng)從zip包中釋放出dex仪媒,因此只支持直接操作dex格式文件,或者已經(jīng)安裝的apk(因?yàn)橐呀?jīng)安裝的apk在cache中存在緩存的dex文件)姻僧, 而DexClassLoader可以支持.apk规丽、.jar和.dex文件,并且會(huì)在指定的outpath路徑釋放出dex文件撇贺。

? ?加載好類后赌莺,通常我們可以通過Java反射機(jī)制來使用這個(gè)類但是這樣效率相對不高,而且也比較復(fù)雜凌亂松嘶。更好的做法是定義一個(gè)interface艘狭,并將這個(gè)interface寫進(jìn)容器端。待加載的類翠订,繼承自這個(gè)interface巢音,并且有一個(gè)參數(shù)為空的構(gòu)造函數(shù),以使我們能夠通過Class的newInstance方法產(chǎn)生對象然后將對象強(qiáng)制轉(zhuǎn)換為interface對象尽超,就可以直接調(diào)用成員方法了官撼。

? 當(dāng)你的jar中包含或者使用了第三方的類庫你也可以定個(gè)規(guī)范的interface,并在你要加載的jar中實(shí)現(xiàn)這個(gè)interface似谁,我們稱這個(gè)實(shí)現(xiàn)為proxy類傲绣,通過proxy類調(diào)用你引用的第三方j(luò)ar。我們將這個(gè)規(guī)范interface單獨(dú)打成jar包放在主工程里巩踏,原理同上秃诵。

3.實(shí)現(xiàn)

創(chuàng)建一個(gè)規(guī)范interface,將其單獨(dú)導(dǎo)出一個(gè)jar塞琼,我們叫interface jar,放在主工程及你要導(dǎo)入的jar項(xiàng)目中:

interface規(guī)范

導(dǎo)出時(shí)只選這個(gè)interface就行了:

只導(dǎo)出這個(gè)ITest

由于我們需要將第三方j(luò)ar一起導(dǎo)出到一個(gè)jar中,還用這個(gè)方法導(dǎo)出的話我們無法將第三方j(luò)ar一起導(dǎo)入菠净,需要將引用的jar一起放入主工程才行,這違背了我們的初衷彪杉。這里我們用Idea編譯器毅往,新建一個(gè)項(xiàng)目DynamicLoadDemo,引用 interface jar派近,并實(shí)現(xiàn)ITest:


測試時(shí)我們引用 commons-io-2.2.jar 中的FileUtils煞抬,用來測試引用第三方j(luò)ar。

將我們的DynamicLoadDemo導(dǎo)出成一個(gè)jar:


選取我們要導(dǎo)出的jar代碼

這時(shí)候我們導(dǎo)出的jar并不包含dex文件构哺,需要我們用dx命令去處理革答,用命令行進(jìn)入你的sdk->build-tools目錄找到這個(gè)文件:


利用命令:

dx --dex --output=testjar1_temp.jar ?*\testJar1.jar ?

經(jīng)過處理后你的testjar1_temp.jar 中包含dex文件就可以用DexClassLoader加載其中的類了

新建一個(gè)測試項(xiàng)目DynamicLoadJar(主工程),引入interface jar,并將testjar1_temp.jar放在你的手機(jī)sd卡中,

DexClassLoader(java.lang.String dexPath, java.lang.String optimizedDirectory, java.lang.String libraryPath, java.lang.ClassLoader parent)

參數(shù)意義:

java.lang.String dexPath,? 需要裝載的APK或者Jar文件的路徑

java.lang.String optimizedDirectory, 優(yōu)化后的dex文件存放目錄战坤,不能為null

java.lang.String libraryPath,? 目標(biāo)類中使用的C/C++庫的列表, 可以為 null

?java.lang.ClassLoader parent? 該類裝載器的父裝載器,一般用當(dāng)前執(zhí)行類的裝載器


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

完美残拐!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末途茫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溪食,更是在濱河造成了極大的恐慌囊卜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错沃,死亡現(xiàn)場離奇詭異栅组,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)枢析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門玉掸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人醒叁,你說我怎么就攤上這事司浪。” “怎么了把沼?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵啊易,是天一觀的道長。 經(jīng)常有香客問我饮睬,道長租谈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任捆愁,我火速辦了婚禮垦垂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牙瓢。我一直安慰自己,他們只是感情好间校,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布矾克。 她就那樣靜靜地躺著,像睡著了一般憔足。 火紅的嫁衣襯著肌膚如雪胁附。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天滓彰,我揣著相機(jī)與錄音控妻,去河邊找鬼。 笑死揭绑,一個(gè)胖子當(dāng)著我的面吹牛弓候,可吹牛的內(nèi)容都是我干的郎哭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼菇存,長吁一口氣:“原來是場噩夢啊……” “哼夸研!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起依鸥,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亥至,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贱迟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姐扮,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年衣吠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茶敏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒸播,死狀恐怖睡榆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袍榆,我是刑警寧澤胀屿,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站包雀,受9級特大地震影響宿崭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜才写,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一葡兑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赞草,春花似錦讹堤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沾凄,卻和暖如春梗醇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撒蟀。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工叙谨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人保屯。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓手负,卻偏偏與公主長得像涤垫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子虫溜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

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