スマフォの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)単位の処理はなんとなくは読み取れるけど、

処理自体が、人間で理解しやすい形式から、

マシン用に最適化されてるので、

暗号のような呼び出しや、難解な定義であふれていて、

気軽に解析できるものではありませんでした。


ただ、こういうこともできるという意味で、

備忘録として残しておこうと思います。