Bên trong file APK có gì?
Bài đăng này đã không được cập nhật trong 3 năm
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
All rights reserved