Command line 기반의 Android APK 분석 tool 인 'apkanalyzer' 사용 방법에 대해서 정리하고자 합니다. Command line 분석 Tool은 Android Studio가 설치되지 않은 서버에서 APK를 분석하거나, APK 분석을 자동화할 때 유용하게 사용할 수 있습니다.
Apk 분석 툴은 Google에서 배포하는 aapt2 (※ 정확하게는 aapt2는 리소스 컴파일 및 dump tool임)와 apkanalyzer가 있고, Python 기반의 apk-parser가 있습니다. 구글이 배포하는 tool은 최신 Android OS의 수정 사항까지 반영된다는 장점이 있고, APK를 디컴파일하여 분석하는 목적으로는 apk-parser가 좀 더 유용한 것 같습니다.
설치
apkanalyzer는 Android SDK 도구 패키지에 포함되어 있으며 android_sdk/tools/bin/apkanalyzer 또는 Android SDK 다운로드 사이트에서 Command line tool에만 받아서 설치가 가능합니다.
사용법
apkanalyzer 사용법은 아래와 같습니다. Global 옵션 항목을 -h 값 (human readable)을 설정하고 있고, <Subject>는 apk, files, manifest, dex, resources 중 하나의 값을 지정해야 하며, <apk> 값에는 분석하고자 하는 apk의 파일명을 입력하면 됩니다.
Usage:
apkanalyzer [global options] <subject> <verb> [options] <apk> [<apk2>]
사용 예제
Google Play APK 파일은 'Google Play Store_v20.9.10-all [0] [PR] 319853039_apkpure.com.apk' 입니다. Google Play 기준으로 설명합니다.
$ apkanalyzer -h apk summary 'Google Play Store_v20.9.10-all [0] [PR] 319853039_apkpure.com.apk'
→ apk package name, version code
→ com.android.vending 82091000 20.9.10-all [0] [PR] 319853039
$ apkanalyzer -h apk features [abc.apk]
apk features [--not-required] apk-file APK에서 Play 스토어 필터링을 트리거하는 데 사용하는 기능을 출력합니다. --not-required 옵션을 추가하여 출력에 필요하지 않은 것으로 표시된 기능을 포함합니다.
→
android.hardware.screen.portrait implied: one or more activities have specified a portrait orientation
android.hardware.location implied: requested android.permission.ACCESS_COARSE_LOCATION permission, and requested android.permission.ACCESS_FINE_LOCATION permission
android.hardware.wifi implied: requested android.permission.ACCESS_WIFI_STATE permission
android.hardware.faketouch implied: default feature for all apps
$ apkanalyzer -h files list 'Google Play Store_v20.9.10-all [0] [PR] 319853039_apkpure.com.apk'
→ apk 내 포함된 모든 파일 list를 출력합니다.
$ apkanalyzer -h files cat 'Google Play Store_v20.9.10-all [0] [PR] 319853039_apkpure.com.apk' --file /AndroidManifest.xml
→ apk 내 /AndroidManifest.xml 을 cat 으로 출력
$ apkanalyzer -h dex list 'Google Play Store_v20.9.10-all [0] [PR] 319853039_apkpure.com.apk'
→ dex 파일 list 출력
classes5.dex
classes4.dex
classes3.dex
classes2.dex
classes.dex
$ apkanalyzer -h resources xml 'Google Play Store_v20.9.10-all [0] [PR] 319853039_apkpure.com.apk' --file AndroidManifest.xml
→ AndroidManifest.xml 파일 내용을 사람이 인지 가능한 내용으로 출력
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="82091000"
android:versionName="20.9.10-all [0] [PR] 319853039"
android:compileSdkVersion="30"
android:compileSdkVersionCodename="11"
package="com.android.vending"
platformBuildVersionCode="30"
platformBuildVersionName="11">
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="29" />
관련 글
[모바일 SW 개발/Android] - Android 11 기능 소개
[모바일 SW 개발/Python] - 파이썬으로 Apk Download 자동화: Selenium기반의 Apk 크롤러
[모바일 SW 개발/Python] - [Tips] Python: XML Parsing 시 multiple elements on top level
[개발환경/우분투] - Ubuntu 동영상 플레이어: VLC Player 설치
[모바일 SW 개발/Android] - Ubuntu에서 Android 10 빌드하기
댓글