?
Ce document utilise Manuel du site Web PHP chinois Libérer
DexFile
版本:Android 4.0 r1
?
結(jié)構(gòu)
繼承關(guān)系
public final class DexFile extends Object
????????
java.lang.Object
dalvik.system.DexFile
?
類概述
操作DEX文件。這個(gè)類原理上和ZipFile相似。主要在類裝載器里被使用。
注意,我們不直接打開(kāi)和讀取DEX文件。它們被虛擬機(jī)以只讀方式映射到內(nèi)存了。
?
構(gòu)造函數(shù)
public DexFile (File file)
通過(guò)指定的File對(duì)象打開(kāi)DEX文件。指定的文件通常是一個(gè)ZIP/JAR文件,里面包含一個(gè)”classes.dex”。虛擬機(jī)將在目錄/data/dalvik-cache下生成對(duì)應(yīng)的文件名字并打開(kāi)它,如果系統(tǒng)權(quán)限允許的話會(huì)首先創(chuàng)建或更新它。不要傳目錄/data/dalvik-cache下的文件名給它,因?yàn)檫@個(gè)文件被認(rèn)為處于初始狀態(tài)(DEX被優(yōu)化之前)。
參數(shù)
File??????????? 引用實(shí)際DEX文件的File對(duì)象
異常
IOException? 發(fā)生I/O異常,例如文件不存在或者沒(méi)有權(quán)限訪問(wèn)。
?
public DexFile (String fileName)
打開(kāi)指定文件名的DEX文件。指定的文件通常是一個(gè)ZIP/JAR文件,里面包含一個(gè)”classes.dex”。虛擬機(jī)將在目錄/data/dalvik-cache下生成對(duì)應(yīng)的文件名字并打開(kāi)它,如果系統(tǒng)權(quán)限允許的話會(huì)首先創(chuàng)建或更新它。不要傳目錄/data/dalvik-cache下的文件名給它,因?yàn)檫@個(gè)文件被認(rèn)為處于初始狀態(tài)(DEX被優(yōu)化之前)。
參數(shù)
fileName?????????? DEX文件名。
異常
IOException???? 發(fā)生I/O異常,例如文件不存在或者沒(méi)有權(quán)限訪問(wèn)。
????????
公共方法
public void close ()
關(guān)閉DEX文件。
有可能無(wú)法釋放任何資源。如果來(lái)自DEX文件的類還存活著的話,DEX文件不能被取消映射。
異常
IOException???? 在關(guān)閉文件的過(guò)程中可能發(fā)生I/O異常,一般不會(huì)發(fā)生。
????????
public Enumeration<String> entries ()
枚舉DEX文件里面的類名。
返回值
DEX文件所包含類名的枚舉,類名的類型是一般內(nèi)部格式(像java/lang/String)。
????????
public String getName ()
獲?。ㄒ汛蜷_(kāi))DEX文件名。
返回值
文件名
?
public static boolean isDexOptNeeded (String fileName)
如果虛擬機(jī)認(rèn)為apk/jar文件已經(jīng)過(guò)期返回true,并且應(yīng)該再次通過(guò)”dexopt”傳遞。(譯者注:dexopt是apk優(yōu)化工具)
參數(shù)
fileName? 被檢查apk/jar文件的絕對(duì)路徑名。
返回值
如果應(yīng)該調(diào)用dexopt處理文件返回true;否則false。
異常
FileNotFoundException?? 文件不可讀、不是一個(gè)文件或者文件不存在。
IOException???? fileName不是有效的apk/jar文件,或者在解析文件時(shí)出現(xiàn)問(wèn)題。
NullPointerException?????? fileName是空的。
StaleDexCacheError???????? 優(yōu)化過(guò)的DEX文件已過(guò)期且位于只讀分區(qū)。
?
public Class loadClass (String name, ClassLoader loader)
裝載一個(gè)類。返回成功裝載的類,失敗返回空。
如果在類裝載器之外調(diào)用它,往往不會(huì)得到你想要的結(jié)果,這時(shí)請(qǐng)使用forName(String)。
該方法不會(huì)在找不到類的時(shí)候拋出ClassNotFoundException異常,因?yàn)槊看卧谖覀兛吹降牡谝粋€(gè)DEX文件里找不到類就粗暴地拋出異常是不合理的。
參數(shù)
name??????? 類名,應(yīng)該是一個(gè)"java/lang/String"
loader?????? 試圖裝載類的類裝載器(大多數(shù)情況下就是該方法的調(diào)用者)
返回值
類名對(duì)應(yīng)的對(duì)象,裝載失敗時(shí)返回空。
????????
public static DexFile loadDex (String sourcePathName, String outputPathName, int flags)
打開(kāi)一個(gè)DEX文件,并提供一個(gè)文件來(lái)保存優(yōu)化過(guò)的DEX數(shù)據(jù)。如果優(yōu)化過(guò)的格式已存在并且是最新的,就直接使用它。如果不是,虛擬機(jī)將試圖重新創(chuàng)建一個(gè)。該方法主要用于應(yīng)用希望在通常的應(yīng)用安裝機(jī)制之外下載和執(zhí)行DEX文件。不能在應(yīng)用里直接調(diào)用該方法,而應(yīng)該通過(guò)一個(gè)類裝載器例如dalvik.system.DexClassLoader.
參數(shù)
sourcePathName???? 包含”classes.dex”的Jar或者APK文件。(將來(lái)可能會(huì)擴(kuò)展支持"raw DEX"。)
outputPathName???? 保存優(yōu)化過(guò)的DEX數(shù)據(jù)的文件。
flags ?????? 打開(kāi)可選功能(目前什么也沒(méi)定義)
返回值
一個(gè)新的,或者先前已經(jīng)打開(kāi)的DexFile。
異常
IOException???? 無(wú)法打開(kāi)輸入或輸出文件。
?
受保護(hù)方法
protected void finalize ()
類結(jié)束時(shí)調(diào)用。確保DEX文件被關(guān)閉。
異常
IOException? 關(guān)閉文件時(shí)發(fā)生I/O異常,一般不會(huì)發(fā)生。
?
補(bǔ)充
???????? 文章精選
?????????????????? Dalvik 分析 - Class加載篇
?????????????????? 啟用另一個(gè)程序某些方法
?????????????????? Android類動(dòng)態(tài)加載技術(shù)
?