国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Android App 如何動(dòng)態(tài)加載類

在 Java 里面,我們可以把一些類放到 .jar 文件里面,然后用 ClassLoader 動(dòng)態(tài)加載。例如:

 

  1. URLClassLoader ucl = URLClassLoader.newInstance(new URL[]  
  2. {new URL("file:/sdcard/files/test.jar")});  
  3. Class clazz = ucl.loadClass("com.test.TestClass");   

 

但是在 Android 上面,情況有所不同。

 

首先第一個(gè)是 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 文件。關(guān)于這一點(diǎn)可以參考我的另外一篇文章:http://blog.csdn.net/quaful/archive/2010/12/23/6094940.aspx

 

第二個(gè)是,Android 里面雖然也提供了 URLClassLoader 的實(shí)現(xiàn),但是并不能用。要?jiǎng)討B(tài)加載其它類,可以用的 Class Loader 有:

DexClassLoader

PathClassLoader

 

其中,DexClassLoader 可以加載 apk, jar 或者 dex 文件,例如:

 

  1. File jarFile = new File("/sdcard/test.dex");  
  2. if ( jarFile.exists() ) {  
  3. DexClassLoader cl = new DexClassLoader(jarFile.toString(), "/sdcard/test"null, ClassLoader.getSystemClassLoader());   
  4. Class<?> c = cl.loadClass("com.qihoo360.test.Test");  
  5. ...  
  6. }  

 

但是 DexClassLoader 要求指定一個(gè)可寫的目錄,即 DexClassLoader 構(gòu)造函數(shù)的第二個(gè)參數(shù),在上例中是 /sdcard/test

這個(gè)參數(shù)的含義是:directory where optimized DEX files should be written

因?yàn)?nbsp;Dalvik 在加載 dex 文件時(shí),會動(dòng)態(tài)進(jìn)行優(yōu)化,DexClassLoader 要求指定優(yōu)化后 dex 文件存放的位置。

 

PathClassLoader 的限制要更多一些,它只能加載已經(jīng)安裝到 Android 系統(tǒng)中的 apk 文件,也就是 /data/app 目錄下的 apk 文件。其它位置的文件加載的時(shí)候都會出現(xiàn) ClassNotFoundException. 例如:

 

  1. PathClassLoader cl = new PathClassLoader(jarFile.toString(), "/data/app/", ClassLoader.getSystemClassLoader());  

 

為什么有這個(gè)限制呢?我認(rèn)為這其實(shí)是當(dāng)前 Android 的一個(gè) bug, 因?yàn)?nbsp;PathClassLoader 會去讀取/data/dalvik-cache 目錄下的經(jīng)過 Dalvik 優(yōu)化過的 dex 文件,這個(gè)目錄的 dex 文件是在安裝 apk 包的時(shí)候由 Dalvik 生成的。例如,如果包的名字是 com.qihoo360.test,Android 應(yīng)用安裝之后都保存在 /data/app 目錄下,即 /data/app/com.qihoo360.test-1.apk,那么 /data/dalvik-cache 目錄下就會生成data@app@com.qihoo360.test-1.apk@classes.dex 文件。在調(diào)用 PathClassLoader 時(shí),它就會按照這個(gè)規(guī)則去找 dex 文件,如果你指定的 apk 文件是 /sdcard/test.apk,它按照這個(gè)規(guī)則就會去讀 /data/dalvik-cache/sdcard@test.apk@classes.dex 文件,顯然這個(gè)文件不會存在,所以 PathClassLoader 會報(bào)錯(cuò)。

 

在 Google 修正這個(gè)問題之前,我們要么就只能用 DexClassLoader,要么就只能用 PathClassLoader 加載已安裝的 apk 了。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android中的動(dòng)態(tài)加載機(jī)制
[轉(zhuǎn)]Android dex分包方案
Android 熱修復(fù),沒你想的那么難|開源實(shí)驗(yàn)室
Android熱更新實(shí)現(xiàn)原理
Android插件化開發(fā)之運(yùn)行未安裝apk的activity
影響數(shù)千萬APP的安卓APP“寄生獸”漏洞技術(shù)分析 | 安全脈搏
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服