APK 全名為 Android Package Kit,是 Android 作業系統用於安裝應用程式的檔案格式。
APK 包含編譯後的程式碼,所有編譯後的程式碼均儲存在 .dex 檔案中,包含應用程式的核心邏輯。
基本流程如下:Java 或 Kotlin 程式碼會被編譯成 Bytecode,隨後由 Dalvik 虛擬機或 ART(Android Runtime)直接執行。
除了編譯後的程式碼,APK 還包含資源(Resources,例如圖片、UI 介面等)以及 AndroidManifest.xml 檔案。
把 APK 解壓縮後:
可視化結構圖:
下面會介紹一下遮些資料夾與檔案內容
裡面檔案都是被編碼過 不太能直接讀
META-INF 資料夾在應用程式簽名時生成,包含驗證相關資訊。若應用程式被修改,驗證將失效,APK 可能要重新簽署。
主要檔案:
CERT.RSA:包含公開金鑰(Public Key)以及 CERT.SF 的簽名。
CERT.SF:包含各檔案的 Hash 值。
MANIFEST.MF:記錄 APK 中所有檔案的名稱及其雜湊清單(使用 SHA-256 並以 Base64 編碼),用於檢查檔案是否被修改。
Assets 資料夾用於存放開發者打包的資源(Bundle)。Bundle 可視為將多個檔案整合成單一檔案,這些資源可透過 AssetManager 讀取。
有趣的是,像 React Native 這樣的框架會在此資料夾存放程式碼和動態連結庫(DLL)。
Lib 資料夾主要存放 Native Library,開發者可透過 NDK(Native Development Kit)使用 C/C++ 撰寫功能。這些檔案通常以 .so 副檔名結尾。
Res 資料夾存放預先定義的資源,這些資源無法在程式運行時由使用者修改。相較之下,Assets 中的資源可由使用者即時更改。
Res 包含的資源包括作業系統版本設定、網路設定等。
AndroidManifest.xml 包含應用程式的元資料(Metadata),提供應用程式的基本資訊,並定義必要的元件與屬性,方便系統管理應用程式。
Classes.dex 包含編譯後的 Java 或 Kotlin 類別檔案,這些檔案可直接由 ART 執行。若應用程式較大,類別數量較多,會自動拆分為多個檔案,例如 classes2.dex、classes3.dex 等。
Resources.arsc 包含預先編譯的資源檔案,應用程式運行時會使用這些資源。該檔案將程式碼中的資源識別碼對應到實際值。