前言
本章內容dalvik.system.DexFile章節,版本為Android 4.0 r1,翻譯來自:"阿年",歡迎訪問他的部落格:"http://blog.csdn.net/mtding",再次感謝"阿年" !期待你一起參與翻譯Android的相關資料,聯絡我over140@gmail.com。
聲明
歡迎轉載,但請保留文章原始出處:)
部落格園:http://www.cnblogs.com/
Android中文翻譯組:http://androidbox.sinaapp.com/
DexFile
譯者署名:阿年
譯者連結:http://blog.csdn.net/mtding
版本:Android 4.0 r1
結構
繼承關係
public final class DexFile extends Object
java.lang.Object
dalvik.system.DexFile
類概述
操作DEX檔案。這個類原理上和ZipFile相似。主要在類裝載器裡被使用。
注意,我們不直接開啟和讀取DEX檔案。它們被虛擬機器以唯讀方式映射到記憶體了。
建構函式
public DexFile (File file)
通過指定的File對象開啟DEX檔案。指定的檔案通常是一個ZIP/JAR檔案,裡麵包含一個”classes.dex”。虛擬機器將在目錄/data/dalvik-cache下產生對應的檔案名稱字並開啟它,如果系統許可權允許的話會首先建立或更新它。不要傳目錄/data/dalvik-cache下的檔案名稱給它,因為這個檔案被認為處於初始狀態(DEX被最佳化之前)。
參數
File 引用實際DEX檔案的File對象
異常
IOException 發生I/O異常,例如檔案不存在或者沒有許可權訪問。
public DexFile (String fileName)
開啟指定檔案名稱的DEX檔案。指定的檔案通常是一個ZIP/JAR檔案,裡麵包含一個”classes.dex”。虛擬機器將在目錄/data/dalvik-cache下產生對應的檔案名稱字並開啟它,如果系統許可權允許的話會首先建立或更新它。不要傳目錄/data/dalvik-cache下的檔案名稱給它,因為這個檔案被認為處於初始狀態(DEX被最佳化之前)。
參數
fileName DEX檔案名稱。
異常
IOException 發生I/O異常,例如檔案不存在或者沒有許可權訪問。
公用方法
public void close ()
關閉DEX檔案。
有可能無法釋放任何資源。如果來自DEX檔案的類還存活著的話,DEX檔案不能被取消映射。
異常
IOException 在關閉檔案的過程中可能發生I/O異常,一般不會發生。
public Enumeration<String> entries ()
枚舉DEX檔案裡面的類名。
傳回值
DEX檔案所包含類名的枚舉,類名的類型是一般內部格式(像java/lang/String)。
public String getName ()
擷取(已開啟)DEX檔案名稱。
傳回值
檔案名稱
public static boolean isDexOptNeeded (String fileName)
如果虛擬機器認為apk/jar檔案已經到期返回true,並且應該再次通過”dexopt”傳遞。(譯者註:dexopt是apk最佳化工具)
參數
fileName 被檢查apk/jar檔案的絕對路徑名。
傳回值
如果應該調用dexopt處理檔案返回true;否則false。
異常
FileNotFoundException 檔案不可讀、不是一個檔案或者檔案不存在。
IOException fileName不是有效apk/jar檔案,或者在解析檔案時出現問題。
NullPointerException fileName是空的。
StaleDexCacheError 最佳化過的DEX檔案已到期且位於唯讀分區。
public Class loadClass (String name, ClassLoader loader)
裝載一個類。返回成功裝載的類,失敗返回空。
如果在類裝載器之外調用它,往往不會得到你想要的結果,這時請使用forName(String)。
該方法不會在找不到類的時候拋出ClassNotFoundException異常,因為每次在我們看到的第一個DEX檔案裡找不到類就粗暴地拋出異常是不合理的。
參數
name 類名,應該是一個"java/lang/String"
loader 試圖裝載類的類裝載器(大多數情況下就是該方法的調用者)
傳回值
類名對應的對象,裝載失敗時返回空。
public static DexFile loadDex (String sourcePathName, String outputPathName, int flags)
開啟一個DEX檔案,並提供一個檔案來儲存最佳化過的DEX資料。如果最佳化過的格式已存在並且是最新的,就直接使用它。如果不是,虛擬機器將試圖重新建立一個。該方法主要用於應用希望在通常的應用安裝機制之外下載和執行DEX檔案。不能在應用裡直接調用該方法,而應該通過一個類裝載器例如dalvik.system.DexClassLoader.
參數
sourcePathName 包含”classes.dex”的Jar或者APK檔案。(將來可能會擴充支援"raw DEX"。)
outputPathName 儲存最佳化過的DEX資料的檔案。
flags 開啟可選功能(目前什麼也沒定義)
傳回值
一個新的,或者先前已經開啟的DexFile。
異常
IOException 無法開啟輸入或輸出檔案。
受保護方法
protected void finalize ()
類結束時調用。確保DEX檔案被關閉。
異常
IOException 關閉檔案時發生I/O異常,一般不會發生。
補充
文章精選
Dalvik 分析 - Class載入篇
啟用另一個程式某些方法
Android類動態載入技術