2013 年 5 月 4 日

apktoolでアンドロイドアプリの.apkファイルの中身を調べる

apktoolでアンドロイドアプリの.apkファイルの中身を調べる

[apktool is great!]

.apkファイルを読み込んで、アプリのバージョンやアプリのアイコンを取り出したいなと思って、.apkファイルを解析できるツールを探してみました。.apkファイルのリバースエンジニアリングツールはいくつかあるようですが、その中で今回はapktoolを使ってみました。

jarファイルと同様なアーカイブファイルです。zipを使って簡単に解凍することができます。しかし、そこに含まれているAndroidManifest.xmlはバイナリ化されており、簡単に読むことができません。apktoolを使うと、解凍だけでなく、AndroidManifest.xmlもデコードしてくれます。

ダウンロード

今回はLinuxバージョンを試すことにします。
このapktoolを使って、アンドロイドアプリ(.apkファイル)をアップロードして、バージョン、アイコンなどを取り出して、アプリのダウンロードページを自動生成するサービスを作りたいなと思っています。そのサービスを動作させようと思っているサーバが、Linuxなんで、動作するかどうか確認したいと思います。

次の二つファイルをダウンロードします。

これらを動作させるためには、JDKが別途必要です。JDK1.6のインストールは割愛します。

apktool1.5.2.tar.bz2には、apktool.jarのみ含まれています。
apktool-install-linux-r05-ibot.tar.bz2には、aapt(実行形式ファイル)とapktool(shellスクリプト)が含まれています。

後はこれらを展開して、apktool(shell script)を実行するだけです。

apktool/
  apktool.jar - jar file
  aapt        - executable binary
  apktool     - shell script

zipで解凍

その前にzipで解凍してみましょう。

$ unzip hoge.apk

$ ls hoge
hoge/
  AndroidManifest.xml
  META-INF/
  classes.dex
  res/
  resource.arsc

$ less hoge/AndroidManifest.xml
"AndroidManifest.xml" may be a binary file.  See it anyway? 

このようにマニフェストはbinary化されています。

apktoolで解凍

次にapktoolで解凍してみます。

$ apktool d hoge.apk
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /******/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...

$ ls hoge
hoge/
  AndroidManifest.xml
  apktool.yml
  res/
  smali/

unzipで解凍したときとは、ちょっと異なります。ちなみにsmaliはJavaの中間コードが含まれるディレクトリです。

$ less hoge/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="1" android:versionName="1.0" package="com.sample.hoge"
  xmlns:android="http://schemas.android.com/apk/res/android">
以下省略

このようにマニフェストが読めます。これをパースすれば、バージョン情報やパッケージ名を取得することが可能です。アイコンは、resディレクトリにあります。これで、取得したい情報は得られそうです。アイコンがほしいときは、zipでも十分だと思います。

関連記事

  1. apkファイルアップローダーを作る(第1回)
  2. apkファイルアップローダーを作る(第2回)