安卓教學【ANDROID教程】什麼是APK文件?

所謂Android漢化就是APK漢化,那麼我們就從什麼是APK開始吧。

什麼是APK

  APK是AndroidPackage的縮寫,即Android安裝包(apk)。APK是類似Symbian Sis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機中執行即可安裝。apk文件和sis一樣,把android sdk編譯的工程打包成一個安裝程序文件,格式為apk。 APK文件其實是zip格式,但後綴名被修改為apk,通過UnZip解壓後,可以看到Dex文件,Dex是Dalvik VM executes的全稱,即Android Dalvik執行程序,並非Java ME的字節碼而是Dalvik字節碼。

  ==========================================================

  APK文件結構

  apk文件實際是一個zip壓縮包,可以通過解壓縮工具解開。以下是我們用zip解開一個apk文件後看到的內容。在下圖可以看到其結構跟新建立的工程結構有些類似。

   -- AndroidManifest.xml

   -- META-INF

   -- CERT.RSA

   -- CERT.SF

   `-- MANIFEST.MF

   -- classes.dex

   -- res

   -- drawable

   `-- icon.png

   `-- layout

   `-- main.xml

  `-- resources.arsc

  複製代碼

  APK文件都不會一樣,基本結構如上圖。

  Manifest文件

  AndroidManifest.xml是每個應用都必須定義和包含的,它描述了應用的名字、版本、權限、引用的庫文件等等信息[ , ],如要把apk上傳到Google Market上,也要對這個xml做一些配置。網上已有很多資料,在此就不多做介紹了。

  在apk中的AndroidManifest.xml是經過壓縮的,可以通過AXMLPrinter2工具[ , ]解開,具體命令為:

  java -jar AXMLPrinter2.jar AndroidManifest.xml

  複製代碼

  META-INF目錄

  META-INF目錄下存放的是簽名信息,用來保證apk包的完整性和系統的安全。在eclipse編譯生成一個api包時,會對所有要打包的文件做一個校驗計算,並把計算結果放在META-INF目錄下。而在OPhone平臺上安裝apk包時,應用管理器會按照同樣的算法對包裡的文件做校驗,如果校驗結果與META-INF下的內容不一致,系統就不會安裝這個apk。這就保證了apk包裡的文件不能被隨意替換。比如拿到一個apk包後,如果想要替換裡面的一幅圖片,一段代碼, 或一段版權信息,想直接解壓縮、替換再重新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增加了難度,有助於保護系 統的安全。

  classes.dex文件

  classes.dex是java源碼編譯後生成的java字節碼文件。但由於Android使用的dalvik虛擬機與標準的java虛擬機是不兼容的,dex文件與class文件相比,不論是文件結構還是opcode都不一樣。目前常見的java反編譯工具都不能處理dex文件。

  Android模擬器中提供了一個dex文件的反編譯工具,dexdump。用法為首先啟動Android模擬器,把要查看的dex文件用adb push上傳的模擬器中,然後通過adb shell登錄,找到要查看的dex文件,執行dexdump xxx.dex。

  Dexdump的結果可以看到從class0到class*不等的多個class,跟工程目錄下bin目錄中的class數目相對應,可以想象dex文件包含了所有的class文件。但對hello.java的反編譯結果(Class #5)中很難發現我們做的修改,即如何輸出“hello, OPhone”。分支跳轉表的反編譯不完整,嚴格來說就沒有完整的dump出來。fill-array-data表也存在同樣的問題。還有其他很多限制。總的來說dexdump反編的結果可讀性很差。

  目前在網上能找到的另一個dex文件的反編譯工具是Dedexer。Dedexer可以讀取dex格式的文件,生成一種類似於彙編語言的輸出。這種輸出與jasmin[ ]的輸出相似,但包含的是Dalvik的字節碼。我們會在下一節詳細介紹一下Dedexer。

  res目錄

  res目錄存放資源文件。

  resources.arsc

  編譯後的二進制資源文件。通常漢化資源就在這裡面。

相關問題答案