Android 中動態載入.jar的實現步驟

來源:互聯網
上載者:User

首先第一個是 jar 檔案的製作,Java 裡面直接把 .class 檔案打包到 .jar 檔案裡面就可以了,但是 Android 的 Dalvik VM 是不認 Java 的 byte code 的,所以不能直接這麼打包,而要用 dx 工具轉成 Dalvik byte code 才可以。當然,dx 工具轉了之後,jar 包裡面就不 是 .class 檔案了,而是 .dex 檔案。

第二個是,Android 裡面雖然也提供了 URLClassLoader 的實現,但是並不能用。要動態載入其它類,可以用的 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 建構函式的第二個參數,在上例中是 /sdcard/test
這個參數的含義是:directory where optimized DEX files should be written
因為 Dalvik 在載入 dex 檔案時,會動態進行最佳化,DexClassLoader 要求指定最佳化後 dex 檔案存放的位置。

PathClassLoader 的限制要更多一些,它只能載入已經安裝到 Android 系統中的 apk 檔案,也就是 /data/app 目錄下的 apk 檔案。其它位置的檔案載入的時候都會出現 ClassNotFoundException. 例如:複製代碼 代碼如下:PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/" , ClassLoader.getSystemClassLoader());

由於 PathClassLoader 會去讀取 /data/dalvik-cache 目錄下的經過 Dalvik 最佳化過的 dex 檔案,這個目錄的 dex 檔案是在安裝 apk 包的時候 由 Dalvik 產生的。例如,如果包的名字是 xiaogang.test,Android 應用安裝之後都儲存在 /data/app 目 錄下,即 /data/app/xiaogang.test-1.apk,那麼 /data/dalvik-cache 目錄下就會產生 data@app@xiaogang.test-1.apk@classes.dex 檔案。在調用 PathClassLoader 時,它就 會按照這個規則去找 dex 檔案,如果你指定的 apk 檔案是 /sdcard/test.apk,它按照這個規則就會去讀 /data /dalvik-cache/sdcard@test.apk@classes.dex 檔案,顯然這個檔案不會存在,所 以PathClassLoader 會報錯。

在 Google 修正這個問題之前,我們要麼就只能用 DexClassLoader,要麼就只能用 PathClassLoader 載入已安裝的 apk 。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.