[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でも十分だと思います。
関連記事