APK全稱:Android application package(Android應用程序包),Android應用程序包,其後綴都是.apk。java
直接解壓
直接解壓apk文件,能夠查看assets、res等信息。git
以解壓美圖xx的APK實例: github
- assets
- 資源文件,如聲音、字體等等。
- 代碼中使用AssetsManager獲取Assets文件夾的資源。
- lib
- 存放用C/C++編寫的,用NDK編譯生成的so文件,供java/kotlin端調用。
- META-INF
- 存放apk簽名信息,用來保證包的完整性和系統的安全。
- 在IDE編譯生成一個apk包時,會對裏面全部的文件作一個校驗計算,並把計算結果存放在META-INF文件夾內,apk在安裝的時候,系統會按照一樣的算法對apk包裏面的文件作校驗,若是結果與META-INF裏面的值不同,系統就不會安裝這個apk,這就保證了apk包裏的文件不能被隨意替換。好比拿到一個apk包後,若是想要替換裏面的一幅圖片,一段代碼, 或一段版權信息,想直接解壓縮、替換再從新打包,基本是不可能的。如此一來就給病毒感染和惡意修改增長了難度,有助於保護系統的安全。
- res
- AndroidManifest.xml
- 應用配置文件,每一個應用都必須定義和包含,它描述了應用的名字、版本、權限、引用的庫等。
- classes.dex
- 能夠直接在Dalvik虛擬機上加載運行的文件,由java/kotlin文件通過IDE編譯生成。
- Dalvik虛擬機的指令碼不是標準的Jvm指令碼,而是使用了本身獨有的一套指令集(相似彙編語言)。
- dex文件中共用了不少類名稱,常量字符串,使它的體積更小,運行效率更高。
- resources.arsc
反編譯
經過反編譯,就能夠查看AndroidManifest.xml、res、smali等文件,及源碼。算法
工具
- apktool
- dex2jar
- 將可運行文件classes.dex反編譯爲jar源碼文件
- jd-gui
步驟
1. apktool安裝
apktool.bat d -o <output_dir> test.apk
複製代碼
其中<output_dir>指定輸出目錄,默認爲apk.out安全
apktool.bat b -o <output.apk> <input_dir>
複製代碼
其中<input_dir>就是上面反編譯輸出的目錄,<ouput.apk>是編譯的輸出結果,默認爲dist/.apkbash
2. dex2jar
d2j-dex2jar.bat classes.dex
複製代碼
獲得classes-dex2jar.jarapp
3. jd-gui
- 下載:jd.benow.ca/。
- 使用jd-gui打開classes-dex2jar.jar,查看源碼。
- 通常的APK都會通過混淆處理。
結尾
Android APK文件(1、編譯打包過程)工具
Android APK文件(2、解壓和反編譯)佈局
Android APK文件(3、AAPT2工具使用)post
Android APK文件(4、Smali語法)