スマフォのAndroidのアプリは、
apk(拡張子)ファイルという形式で提供されています。
これはアプリ実行に必要なもの(画像や実行ファイル)が
まとまっているものです。
このapkファイルは、GooglePlayストアからは、
インストールボタンを押したら、
ユーザーが内容を意識することなく、
ダウンロード⇒インストールされるため、
このファイルを取り出すことは普通はできない、
かつ、バイナリ形式(人間には読めない文字の羅列)となっているため、
普通は、元のソースコード(人間に読めるプログラム言語)も
見ることができません。
ですが、JAVA開発がメインであれば、classファイルかjarファイルがあるわけで、
これは逆コンパイルでソースコードにできることは経験上知っているので、
スマフォのアプリでもできると思って調べました。
今回の動機は、気になるアプリがあって、
自分でアプリを作ろうとしたときの参考にしたく、
その動作のしくみや構成を知りたかったからです。
今回はそのやり方について、まとめます。
もっといい方法があるかもしれないけれど、
自分がやってみた方法を記載します。
※端末IDの引っこ抜き以外は、PC上での作業となります。
apkファイルの取得
PCからGooglePlayストアにスマフォになりかわってアクセスし、
PC上にダウンロードします。(これができてもいいのか??)
(1)自分のスマフォのデバイスIDを取得する
GooglePlayストアにある、「DeviceID」というアプリで、
簡単に表示することができます。これをメモしておきます。
(2)ブラウザGoogleChromeの拡張機能で、GooglePlayストアにログインする
apk-downloaderというのをインストールします。
インストール後、スマフォと同じように、gmailアドレス、パスワードを入力し、
(1)で取得したIDを入力すると、ログインできます。
(3)GooglePlayストアのアプリのページに行く。
PCからも普通にアプリのページにアクセスできます。
あとは、(2)であらたにブラウザ上にボタンが新たにできてるので、
それを押します。
これだけw
参考HP:http://www.teradas.net/archives/9387/
apkファイルの解凍
(1)Javaの実行環境(JRE)をインストールする。
(2)apktoolというツールをダウンロード
これはダウンロードすると、拡張子がtar.bz2という形式なので、
tarファイルが解凍できるソフトを別途用意する必要があります。
(3)Windowsコマンドプロンプトから、コマンド実行
指定したフォルダに解凍されます。
参考HP:http://blog.appforandroid.info/?p=316
これで終わりではなくて、上記の実行では、画像ファイルや、
定義ファイル(xmlファイル)などは取り出せますが、
肝心のソースファイルのもとになるclassファイルが取り出せない。
よって、以下の手順も実施します。
ソースコードの取り出し
(1)apkファイルからclasses.dexを取得
apkファイルの拡張子をzipに変えて、普通に解凍すると、
classes.dexというのが出てきます。
これがclassファイルの元の塊(jarみたいなもの)です。
(2)classes.dexをclassファイルに変換
dex2jarというツールをインストールし、
これもコマンドプロンプトから実行し、
classファイルに変換します。
(3)classファイルをソースコード(.java)に変換
jadというツールをインストールし、
これまたコマンドプロンプトから実行します。
これでソースコードに変換できます。
参考HP:http://yuki312.blogspot.jp/2012/03/androidwindowsapk.html
以上が手順ですが、
apkファイルを選択して、ボタン押したらポンとできる方法ではないので、
若干面倒だと思います。
で、実際のソースコードを見た所感です。
・ソースにコメント文はないため、何の処理をしてるのか解読するのがツライ。
・定数定義は、16進コードに置き換えられたりしていて、
読みにくい。
・if文には、GOTOが多用されて、スパゲッティ状態となっており、
もはや処理を目で追うのは不可能に近い。かなり根気と時間が必要。
ひょっとしたらこれを見やすくするツールもあったりするかもしれないけど、
面倒なのであきらめ。
以上のことから、機能(class)単位の処理はなんとなくは読み取れるけど、
処理自体が、人間で理解しやすい形式から、
マシン用に最適化されてるので、
暗号のような呼び出しや、難解な定義であふれていて、
気軽に解析できるものではありませんでした。
ただ、こういうこともできるという意味で、
備忘録として残しておこうと思います。
apk(拡張子)ファイルという形式で提供されています。
これはアプリ実行に必要なもの(画像や実行ファイル)が
まとまっているものです。
このapkファイルは、GooglePlayストアからは、
インストールボタンを押したら、
ユーザーが内容を意識することなく、
ダウンロード⇒インストールされるため、
このファイルを取り出すことは普通はできない、
かつ、バイナリ形式(人間には読めない文字の羅列)となっているため、
普通は、元のソースコード(人間に読めるプログラム言語)も
見ることができません。
ですが、JAVA開発がメインであれば、classファイルかjarファイルがあるわけで、
これは逆コンパイルでソースコードにできることは経験上知っているので、
スマフォのアプリでもできると思って調べました。
今回の動機は、気になるアプリがあって、
自分でアプリを作ろうとしたときの参考にしたく、
その動作のしくみや構成を知りたかったからです。
今回はそのやり方について、まとめます。
もっといい方法があるかもしれないけれど、
自分がやってみた方法を記載します。
※端末IDの引っこ抜き以外は、PC上での作業となります。

PCからGooglePlayストアにスマフォになりかわってアクセスし、
PC上にダウンロードします。(これができてもいいのか??)
(1)自分のスマフォのデバイスIDを取得する
GooglePlayストアにある、「DeviceID」というアプリで、
簡単に表示することができます。これをメモしておきます。
(2)ブラウザGoogleChromeの拡張機能で、GooglePlayストアにログインする
apk-downloaderというのをインストールします。
インストール後、スマフォと同じように、gmailアドレス、パスワードを入力し、
(1)で取得したIDを入力すると、ログインできます。
(3)GooglePlayストアのアプリのページに行く。
PCからも普通にアプリのページにアクセスできます。
あとは、(2)であらたにブラウザ上にボタンが新たにできてるので、
それを押します。
これだけw
参考HP:http://www.teradas.net/archives/9387/

(1)Javaの実行環境(JRE)をインストールする。
(2)apktoolというツールをダウンロード
これはダウンロードすると、拡張子がtar.bz2という形式なので、
tarファイルが解凍できるソフトを別途用意する必要があります。
(3)Windowsコマンドプロンプトから、コマンド実行
指定したフォルダに解凍されます。
参考HP:http://blog.appforandroid.info/?p=316
これで終わりではなくて、上記の実行では、画像ファイルや、
定義ファイル(xmlファイル)などは取り出せますが、
肝心のソースファイルのもとになるclassファイルが取り出せない。
よって、以下の手順も実施します。

(1)apkファイルからclasses.dexを取得
apkファイルの拡張子をzipに変えて、普通に解凍すると、
classes.dexというのが出てきます。
これがclassファイルの元の塊(jarみたいなもの)です。
(2)classes.dexをclassファイルに変換
dex2jarというツールをインストールし、
これもコマンドプロンプトから実行し、
classファイルに変換します。
(3)classファイルをソースコード(.java)に変換
jadというツールをインストールし、
これまたコマンドプロンプトから実行します。
これでソースコードに変換できます。
参考HP:http://yuki312.blogspot.jp/2012/03/androidwindowsapk.html
以上が手順ですが、
apkファイルを選択して、ボタン押したらポンとできる方法ではないので、
若干面倒だと思います。
で、実際のソースコードを見た所感です。
・ソースにコメント文はないため、何の処理をしてるのか解読するのがツライ。
・定数定義は、16進コードに置き換えられたりしていて、
読みにくい。
・if文には、GOTOが多用されて、スパゲッティ状態となっており、
もはや処理を目で追うのは不可能に近い。かなり根気と時間が必要。
ひょっとしたらこれを見やすくするツールもあったりするかもしれないけど、
面倒なのであきらめ。
以上のことから、機能(class)単位の処理はなんとなくは読み取れるけど、
処理自体が、人間で理解しやすい形式から、
マシン用に最適化されてるので、
暗号のような呼び出しや、難解な定義であふれていて、
気軽に解析できるものではありませんでした。
ただ、こういうこともできるという意味で、
備忘録として残しておこうと思います。