Android 中動(dòng)態(tài)加載.jar的實(shí)現(xiàn)步驟
第二個(gè)是,Android 里面雖然也提供了 URLClassLoader 的實(shí)現(xiàn),但是并不能用。要?jiǎng)討B(tài)加載其它類(lèi),可以用的 Class Loader 有:
DexClassLoader,PathClassLoader,其中,DexClassLoader 可以加載 apk, jar 或者 dex 文件,例如:
File jarFile = new File("/sdcard/test.dex");
# if ( jarFile.exists() ) {
DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test", null, ClassLoader.getSystemClassLoader());
Class<?> c = cl.loadClass("xiaogang.test.Test");
但是 DexClassLoader 要求指定一個(gè)可寫(xiě)的目錄,即 DexClassLoader 構(gòu)造函數(shù)的第二個(gè)參數(shù),在上例中是 /sdcard/test
這個(gè)參數(shù)的含義是:directory where optimized DEX files should be written
因?yàn)?Dalvik 在加載 dex 文件時(shí),會(huì)動(dòng)態(tài)進(jìn)行優(yōu)化,DexClassLoader 要求指定優(yōu)化后 dex 文件存放的位置。
PathClassLoader 的限制要更多一些,它只能加載已經(jīng)安裝到 Android 系統(tǒng)中的 apk 文件,也就是 /data/app 目錄下的 apk 文件。其它位置的文件加載的時(shí)候都會(huì)出現(xiàn) ClassNotFoundException. 例如:
PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/" , ClassLoader.getSystemClassLoader());
由于 PathClassLoader 會(huì)去讀取 /data/dalvik-cache 目錄下的經(jīng)過(guò) Dalvik 優(yōu)化過(guò)的 dex 文件,這個(gè)目錄的 dex 文件是在安裝 apk 包的時(shí)候 由 Dalvik 生成的。例如,如果包的名字是 xiaogang.test,Android 應(yīng)用安裝之后都保存在 /data/app 目 錄下,即 /data/app/xiaogang.test-1.apk,那么 /data/dalvik-cache 目錄下就會(huì)生成 data@app@xiaogang.test-1.apk@classes.dex 文件。在調(diào)用 PathClassLoader 時(shí),它就 會(huì)按照這個(gè)規(guī)則去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照這個(gè)規(guī)則就會(huì)去讀 /data /dalvik-cache/sdcard@test.apk@classes.dex 文件,顯然這個(gè)文件不會(huì)存在,所 以PathClassLoader 會(huì)報(bào)錯(cuò)。
在 Google 修正這個(gè)問(wèn)題之前,我們要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加載已安裝的 apk 。
- Android 布局文件Layout XML屬性
- android layout XML解析錯(cuò)誤的解決方法
- Android編程動(dòng)態(tài)加載布局實(shí)例詳解【附demo源碼】
- Android實(shí)現(xiàn)Listview異步加載網(wǎng)絡(luò)圖片并動(dòng)態(tài)更新的方法
- Android動(dòng)態(tài)加載Activity原理詳解
- Android應(yīng)用開(kāi)發(fā)中Fragment的靜態(tài)加載與動(dòng)態(tài)加載實(shí)例
- android動(dòng)態(tài)加載布局文件示例
- Android在layout xml中使用ViewStub完成動(dòng)態(tài)加載問(wèn)題
相關(guān)文章
Android編程實(shí)現(xiàn)自定義ProgressBar樣式示例(背景色及一級(jí)、二級(jí)進(jìn)度條顏色)
這篇文章主要介紹了Android編程實(shí)現(xiàn)自定義ProgressBar樣式功能,涉及針對(duì)背景色及一級(jí)、二級(jí)進(jìn)度條顏色的操作技巧,需要的朋友可以參考下2017-01-01Android 登錄處理簡(jiǎn)單實(shí)例(源碼下載)
這篇文章主要介紹了Android 登錄處理簡(jiǎn)單實(shí)例(源碼下載)的相關(guān)資料,需要的朋友可以參考下2017-03-03Android Application存取公共數(shù)據(jù)的實(shí)例詳解
這篇文章主要介紹了Android Application存取公共數(shù)據(jù)的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07android使用Messenger綁定Service的多種實(shí)現(xiàn)方法
android使用Messenger綁定Service的多種實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-05-05Android開(kāi)發(fā)中播放聲音的兩種方法分析
這篇文章主要介紹了Android開(kāi)發(fā)中播放聲音的兩種方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Android音頻播放的常用函數(shù)、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-09-09android 鍵盤(pán)事件和屏幕事件的運(yùn)行原理及交互實(shí)現(xiàn)
當(dāng)在自定義View或者做游戲的時(shí)候,我們常常會(huì)用到鍵盤(pán)觸發(fā)事件和屏幕觸發(fā)事件!在自定義的View里的鍵盤(pán)觸發(fā)事件和屏幕觸發(fā)事件和activity里的鍵盤(pán)觸發(fā)事件和屏幕觸發(fā)事件是怎么樣交互的呢,接下來(lái)為您詳細(xì)介紹,感興趣的朋友可以了解下哦2013-01-01Android開(kāi)發(fā)之Sqliteopenhelper用法實(shí)例分析
這篇文章主要介紹了Android開(kāi)發(fā)之Sqliteopenhelper用法,實(shí)例分析了SQLiteOpenHelper類(lèi)操作數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下2015-05-05教你快速實(shí)現(xiàn)Android動(dòng)態(tài)模糊效果
相信大家都發(fā)現(xiàn)了越來(lái)越多的App里面使用了模糊效果,比如雅虎天氣的界面,雖然我并不知道雅虎天氣是怎么做出這種效果的,但是簡(jiǎn)單的模仿一下的話,還是能做到的。下面一起來(lái)學(xué)習(xí)學(xué)習(xí)。2016-08-08