Android 中動態(tài)加載.jar的實現(xiàn)步驟
更新時間:2013年01月21日 10:53:05 作者:
本文介紹動態(tài)加載 .jar的實現(xiàn)步驟,這將對你的android開發(fā)很有幫助,剛興趣的朋友可以了解下哦
首先第一個是 jar 文件的制作,Java 里面直接把 .class 文件打包到 .jar 文件里面就可以了,但是 Android 的 Dalvik VM 是不認(rèn) Java 的 byte code 的,所以不能直接這么打包,而要用 dx 工具轉(zhuǎn)成 Dalvik byte code 才可以。當(dāng)然,dx 工具轉(zhuǎn)了之后,jar 包里面就不 是 .class 文件了,而是 .dex 文件。
第二個是,Android 里面雖然也提供了 URLClassLoader 的實現(xiàn),但是并不能用。要動態(tà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 要求指定一個可寫的目錄,即 DexClassLoader 構(gòu)造函數(shù)的第二個參數(shù),在上例中是 /sdcard/test
這個參數(shù)的含義是:directory where optimized DEX files should be written
因為 Dalvik 在加載 dex 文件時,會動態(tài)進行優(yōu)化,DexClassLoader 要求指定優(yōu)化后 dex 文件存放的位置。
PathClassLoader 的限制要更多一些,它只能加載已經(jīng)安裝到 Android 系統(tǒng)中的 apk 文件,也就是 /data/app 目錄下的 apk 文件。其它位置的文件加載的時候都會出現(xiàn) ClassNotFoundException. 例如:
PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/" , ClassLoader.getSystemClassLoader());
由于 PathClassLoader 會去讀取 /data/dalvik-cache 目錄下的經(jīng)過 Dalvik 優(yōu)化過的 dex 文件,這個目錄的 dex 文件是在安裝 apk 包的時候 由 Dalvik 生成的。例如,如果包的名字是 xiaogang.test,Android 應(yīng)用安裝之后都保存在 /data/app 目 錄下,即 /data/app/xiaogang.test-1.apk,那么 /data/dalvik-cache 目錄下就會生成 data@app@xiaogang.test-1.apk@classes.dex 文件。在調(diào)用 PathClassLoader 時,它就 會按照這個規(guī)則去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照這個規(guī)則就會去讀 /data /dalvik-cache/sdcard@test.apk@classes.dex 文件,顯然這個文件不會存在,所 以PathClassLoader 會報錯。
在 Google 修正這個問題之前,我們要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加載已安裝的 apk 。
第二個是,Android 里面雖然也提供了 URLClassLoader 的實現(xiàn),但是并不能用。要動態(tài)加載其它類,可以用的 Class Loader 有:
DexClassLoader,PathClassLoader,其中,DexClassLoader 可以加載 apk, jar 或者 dex 文件,例如:
復(fù)制代碼 代碼如下:
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 要求指定一個可寫的目錄,即 DexClassLoader 構(gòu)造函數(shù)的第二個參數(shù),在上例中是 /sdcard/test
這個參數(shù)的含義是:directory where optimized DEX files should be written
因為 Dalvik 在加載 dex 文件時,會動態(tài)進行優(yōu)化,DexClassLoader 要求指定優(yōu)化后 dex 文件存放的位置。
PathClassLoader 的限制要更多一些,它只能加載已經(jīng)安裝到 Android 系統(tǒng)中的 apk 文件,也就是 /data/app 目錄下的 apk 文件。其它位置的文件加載的時候都會出現(xiàn) ClassNotFoundException. 例如:
復(fù)制代碼 代碼如下:
PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/" , ClassLoader.getSystemClassLoader());
由于 PathClassLoader 會去讀取 /data/dalvik-cache 目錄下的經(jīng)過 Dalvik 優(yōu)化過的 dex 文件,這個目錄的 dex 文件是在安裝 apk 包的時候 由 Dalvik 生成的。例如,如果包的名字是 xiaogang.test,Android 應(yīng)用安裝之后都保存在 /data/app 目 錄下,即 /data/app/xiaogang.test-1.apk,那么 /data/dalvik-cache 目錄下就會生成 data@app@xiaogang.test-1.apk@classes.dex 文件。在調(diào)用 PathClassLoader 時,它就 會按照這個規(guī)則去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照這個規(guī)則就會去讀 /data /dalvik-cache/sdcard@test.apk@classes.dex 文件,顯然這個文件不會存在,所 以PathClassLoader 會報錯。
在 Google 修正這個問題之前,我們要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加載已安裝的 apk 。
相關(guān)文章
Android編程實現(xiàn)自定義ProgressBar樣式示例(背景色及一級、二級進度條顏色)
這篇文章主要介紹了Android編程實現(xiàn)自定義ProgressBar樣式功能,涉及針對背景色及一級、二級進度條顏色的操作技巧,需要的朋友可以參考下2017-01-01Android Application存取公共數(shù)據(jù)的實例詳解
這篇文章主要介紹了Android Application存取公共數(shù)據(jù)的實例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07android使用Messenger綁定Service的多種實現(xiàn)方法
android使用Messenger綁定Service的多種實現(xiàn)方法,需要的朋友可以參考一下2013-05-05android 鍵盤事件和屏幕事件的運行原理及交互實現(xiàn)
當(dāng)在自定義View或者做游戲的時候,我們常常會用到鍵盤觸發(fā)事件和屏幕觸發(fā)事件!在自定義的View里的鍵盤觸發(fā)事件和屏幕觸發(fā)事件和activity里的鍵盤觸發(fā)事件和屏幕觸發(fā)事件是怎么樣交互的呢,接下來為您詳細(xì)介紹,感興趣的朋友可以了解下哦2013-01-01Android開發(fā)之Sqliteopenhelper用法實例分析
這篇文章主要介紹了Android開發(fā)之Sqliteopenhelper用法,實例分析了SQLiteOpenHelper類操作數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2015-05-05教你快速實現(xiàn)Android動態(tài)模糊效果
相信大家都發(fā)現(xiàn)了越來越多的App里面使用了模糊效果,比如雅虎天氣的界面,雖然我并不知道雅虎天氣是怎么做出這種效果的,但是簡單的模仿一下的話,還是能做到的。下面一起來學(xué)習(xí)學(xué)習(xí)。2016-08-08