APK 里有什么?
如果我給你一份 Android 應用的源碼然后請你提供關于?minSdkVersion,?targetSdkVersion, permissions, configurations 等 Android 應用相關的信息,相信幾乎每個有 Android 開發經驗的人都能在短時間內給出答案。但如果我給你一個 Android 應用的?APK?文件然后讓你給出同樣的信息呢?乍一想可能會有點棘手。
事實上我就遇到了這樣的情況,盡管我很早就知道?aapt?這類工具的存在,但當我需要獲取?apk?里的權限聲明時也不能在第一時間想到方案。很顯然我需要復習下相關概念然后找到個有效的方案來解決這個問題。這篇文章將會解釋我是怎么做的,在大家想對任何別的 App 做這種反向內容查找的時候也會有幫助。
最常見的解決方案一定是下面這種
從?APK[1]?的定義開始
Android application package (APK)?是一種包文件格式,在 Android 操作系統里它被用來進行應用程序的分發和安裝。
…APK?是一種存檔文件, 具體的說是基于 JAR 文件格式的?zip?格式包,以?.apk?作為文件擴展名。
..嗯,所以它是基于?ZIP?格式的,我能做的就是把它的擴展名從?.apk?改為?.zip,然后 ZIP 解壓工具應該能解壓出它的內容。
這就厲害了, 所以現在我們能看到并檢查 zip 文件里的內容
現在你可能會想我們已經能訪問到所有的文件,馬上就能提供所有文章開頭要求的那些信息了。不過,并沒有這么簡單的,親。
可以試試隨便用一個文本編輯器打開?AndroidManifest.xml?文件看看它的內容。你應該會看到這樣的文本
這意味著這個披著?xml?格式外衣的?AndroidManifest.xml?文件不再是我們人類可讀的格式了。所以你已經沒有機會直接查看記載著 APK 文件基本信息的?AndroidManifest.xml?文件了。
其實還是有辦法的??有一些工具可以分析 Android APK 文件,而且有一款工具從 Android 系統誕生開始就有了。
我想所有經驗豐富的開發者都知道這款工具,但我確信還是有很多的新手和富有經驗的開發者從來沒聽過。
這個作為 Android 構建工具的組件的小工具就是
aapt?-?Android Asset Packaging Tool[2]
這個工具可以用來列舉、添加、移除 APK 包里的文件,打包資源或者壓縮 PNG 文件等等。
首先,這個工具到底安裝在哪?
這個問題問得好,在你 Android SDK 的構建工具里可以找到它。
<path_to_android_sdk>/build-tools/<build_tool_version_such_as_24.0.2>/aapt它到底能做些什么 ? 我們用?man?命令看一下,輸出如下:
- aapt list?- 列舉 ZIP, JAR 或者 APK 文件里的內容。
- aapt dump?- 從 APK 文件里導出指定的信息。
- aapt package?- 打包 Android 資源。
- aapt remove?- 刪除 ZIP、JAR 或者 APK 文件里的內容。
- aapt add?- 把文件添加到 ZIP、JAR 或者 APK 文件里。
- aapt crunch?- 壓縮 PNG 文件。
我們感興趣的是?aapt list?和?aapt dump?命令,尤其是有什么可以幫助我們得到?apk?信息的東西。
讓我們直接對?apk?文件運行下?aapt?工具來找找我們想要的信息。
從 APK 獲取基礎信息
aapt dump badging app-debug.apk> 輸出
package: name='com.example.application' versionCode='1' versionName='1.0' platformBuildVersionName='' sdkVersion:'16' targetSdkVersion:'24' uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.CAMERA' uses-permission: name='android.permission.VIBRATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.RECORD_AUDIO' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE' application-label-af:'Example' application-label-am:'Example' application-label-ar:'Example' .. application-label-zu:'Example' application-icon-160:'res/mipmap-mdpi-v4/ic_launcher.png' application-icon-240:'res/mipmap-hdpi-v4/ic_launcher.png' application-icon-320:'res/mipmap-xhdpi-v4/ic_launcher.png' application-icon-480:'res/mipmap-xxhdpi-v4/ic_launcher.png' application-icon-640:'res/mipmap-xxxhdpi-v4/ic_launcher.png' application: label='Example' icon='res/mipmap-mdpi-v4/ic_launcher.png' application-debuggable launchable-activity: name='com.example.application.MainActivity' label='' icon='' feature-group: label=''uses-feature: name='android.hardware.camera'uses-feature-not-required: name='android.hardware.camera.autofocus'uses-feature-not-required: name='android.hardware.camera.front'uses-feature-not-required: name='android.hardware.microphone'uses-feature: name='android.hardware.faketouch'uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps' main other-activities supports-screens: 'small' 'normal' 'large' 'xlarge' supports-any-density: 'true' locales: 'af' 'am' 'ar' 'az-AZ' 'be-BY' 'bg' 'bn-BD' 'bs-BA' 'ca' 'cs' 'da' 'de' 'el' 'en-AU' 'en-GB' 'en-IN' 'es' 'es-US' 'et-EE' 'eu-ES' 'fa' 'fi' 'fr' 'fr-CA' 'gl-ES' 'gu-IN' 'hi' 'hr' 'hu' 'hy-AM' 'in' 'is-IS' 'it' 'iw' 'ja' 'ka-GE' 'kk-KZ' 'km-KH' 'kn-IN' 'ko' 'ky-KG' 'lo-LA' 'lt' 'lv' 'mk-MK' 'ml-IN' 'mn-MN' 'mr-IN' 'ms-MY' 'my-MM' 'nb' 'ne-NP' 'nl' 'pa-IN' 'pl' 'pt' 'pt-BR' 'pt-PT' 'ro' 'ru' 'si-LK' 'sk' 'sl' 'sq-AL' 'sr' 'sr-Latn' 'sv' 'sw' 'ta-IN' 'te-IN' 'th' 'tl' 'tr' 'uk' 'ur-PK' 'uz-UZ' 'vi' 'zh-CN' 'zh-HK' 'zh-TW' 'zu' densities: '160' '240' '320' '480' '640'從 APK 的 AndroidManifest 中獲取權限聲明列表
aapt dump permissions app-debug.apk> 輸出
package: com.example.application uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE' uses-permission: name='android.permission.CAMERA' uses-permission: name='android.permission.VIBRATE' uses-permission: name='android.permission.INTERNET' uses-permission: name='android.permission.RECORD_AUDIO' uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'獲取 APK 的配置列表
aapt dump configurations app-debug.apk> 輸出
large-v4 xlarge-v4 night-v8 v11 v12 v13 w820dp-v13 h720dp-v13 sw600dp-v13 v14 v17 v18 v21 ldltr-v21 v22 v23 port land mdpi-v4 ldrtl-mdpi-v17 hdpi-v4 ldrtl-hdpi-v17 xhdpi-v4 ldrtl-xhdpi-v17 xxhdpi-v4 ldrtl-xxhdpi-v17 xxxhdpi-v4 ldrtl-xxxhdpi-v17 ca af .. sr b+sr+Latn ... sv iw sw bs-rBA fr-rCA lo-rLA ... kk-rKZ uz-rUZ..也可以試試這些
# 打印出 APK 里的資源清單 aapt dump resources app-debug.apk# 打印出指定 APK 里編譯過的 xml aapt dump xmltree app-debug.apk# 打印出編譯過的 xml 里的字段 aapt dump xmlstrings app-debug.apk# 列出 ZIP 存檔里的內容 aapt list -v -a app-debug.apk就像你看到的,你可以輕松的通過?aapt?工具直接從?apk?獲取信息甚至都不用嘗試解壓?apk?文件。
appt?還可以完成很多操作,你可以對?aapt?使用?man?命令獲取詳細說明。
aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...]從 ZIP 歸檔中刪除指定文件aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...]添加指定文件到 ZIP 歸檔中aapt c[runch] [-v] -S resource-sources ... -C output-folder ...執行 PNG 預處理操作并把結果存儲到輸出文件夾中有興趣的話可以自己探索一下,這里就不贅述了。?
歡迎評論和建議。
從?AndroidWeekly Issue 224[3]?獲取更多文章和教程, 謝謝你們的厚愛。
原文發布時間為:2016年10月09日
本文來自云棲社區合作伙伴掘金,了解相關信息可以關注掘金網站。
總結
- 上一篇: 【vuejs路由】vuejs 路由基础入
- 下一篇: Django环境的搭建以及最简示例