Bên trong file APK có gì?
Nếu tôi đưa cho bạn source code của một ứng dụng Android và yêu cầu bạn cho tôi biết các thông tin về ứng dụng như minSdkVersion, targetVersion, permissions ... hầu hết mọi người biết code Android sẽ trả lời được trong vòng vài phút. Nhưng sẽ thế nào nếu tôi đưa cho bạn một file apk của ứng ...
Nếu tôi đưa cho bạn source code của một ứng dụng Android và yêu cầu bạn cho tôi biết các thông tin về ứng dụng như minSdkVersion, targetVersion, permissions ... hầu hết mọi người biết code Android sẽ trả lời được trong vòng vài phút. Nhưng sẽ thế nào nếu tôi đưa cho bạn một file apk của ứng dụng và hỏi bạn câu tương tự như vậy?
Tôi đã thực sự rơi vào tình huống đó và mặc dù tôi đã biết đến công cụ aapt từ lâu, nó đã không giúp ích cho tôi khi tôi lấy permissions được khai báo bên trong apk. Tôi cần phải làm mới lại các khái niệm và tiếp cận theo một cách hiệu quả hơn nữa. Bài này sẽ giải thích cho các bạn cách để làm điều đó. Nó cũng hữu ích khi bạn cố gắng tìm hiểu nội dụng của bất kỳ ứng dụng nào khác.
Ok, cách phổ biến nhất để tiếp cận vấn đề này là xem định nghĩa của một file APK từ Wikipedia.
Android application package (APK) is the package file format used by the Android operating system for distribution and installation of mobile apps and middleware. …APK files are a type of archive file, specifically in zip format packages based on the JAR file format, with .apk as the filename extension.
Vậy về cơ bản thì apk thực chất là một file ZIP, tôi sẽ thử đổi tên một file từ đuôi .apk sang .zip và thử giải nén theo cách thông thường xem chúng ta thu được những gì.
Tuyệt, chúng ta có thể thấy những gì mà file zip được nén lại và chúng ta sẽ thử đi nghiên cứu nó xem.
Đến lúc này bạn có thể đang nghĩ bạn có thể làm mọi thứ với các files và bạn có thể đưa cho tôi tất cả các câu trả lời ngay lập tức. Không quá nhanh nhỉ Mr.Android Dev
Tiếp tục nào, chúng ta thử mở file AndroidManifest.xml bằng một trình text editor để đọc nội dung của nó xem. Và đây chính là những gì bạn sẽ thấy.
Bạn đang đùa tôi đúng không? AndroidManifest.xml đã không còn đọc được như bình thường nữa rồi. Cơ hội cho bạn đọc các thông tin cơ bản từ AndroidManifest.xml đã đi xuống hố cả nút.
Thực tế thì không hẳn là như vậy, có các công cụ để phân tích APK và đã được biết đến từ thời kỳ đầu.
Tôi nghĩ nó được các developer có kinh nghiệm biết đến nhưng tôi chắc chắn rất nhiều người mới cũng như dev lâu năm chưa nghe về nó.
Công cụ đó là một phần của Android Build Tools
aapt - Android Asset Packaging Tool
Công cụ này có thể được sử dụng để liệu kê, thêm hay xóa files khỏi một apk, gói resources, crunching PNG files, vân vân.
Đầu tiên, công cụ thần kỳ đó ở đâu?
Câu hỏi hay đó, nó là một phần của build tools trong android sdk.
<path_to_android_sdk>/build-tools/<build_tool_version_such_as_24.0.2>/aapt
Nó có thể làm được những gì? Theo manual của nó thì:
- aapt list - Listing contents of a ZIP, JAR or APK file.
- aapt dump - Dumping specific information from an APK file.
- aapt package - Packaging Android resources.
- aapt remove - Removing files from a ZIP, JAR or APK file.
- aapt add - Adding files to a ZIP, JAR or APK file.
- aapt crunch - Crunching PNG files.
Chúng ta sẽ quan tâm đến aapt list và aapt dump, nó sẽ giúp chúng ta xem các thông tin cần thiết của file apk.
Get base information
aapt dump badging app-debug.apk
Kết quả
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'
Lấy list các permissions được khai báo trong AndroidManifest
aapt dump permissions app-debug.apk
Kết quả
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'
List configurations
aapt dump configurations app-debug.apk
Kết quả
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
Bạn cũng hãy thử một số command sau:
//Print the resource table from the APK. aapt dump resources app-debug.apk //Print the compiled xmls in the given assets. aapt dump xmltree app-debug.apk //Print the strings of the given compiled xml assets. aapt dump xmlstrings app-debug.apk //List contents of Zip-compatible archive. aapt list -v -a app-debug.apk
Vậy đó, bạn có thể dễ dàng lấy được các thông tin mà không cần phải giải nén file apk. Hơn nữa bạn còn có thể làm nhiều thứ khác với aapt.
aapt r[emove] [-v] file.{zip,jar,apk} file1 [file2 ...] Delete specified files from Zip-compatible archive. aapt a[dd] [-v] file.{zip,jar,apk} file1 [file2 ...] Add specified files to Zip-compatible archive. aapt c[runch] [-v] -S resource-sources ... -C output-folder ... Do PNG preprocessing and store the results in output folder.
HẾT
Nguồn