ということで簡単なapkのデコンパイル方法のメモ。
unzip hoge.apk # decode xml wget -O AXMLPrinter2.jar http://android4me.googlecode.com/files/AXMLPrinter2.jar for f in `find . -name \*.xml`; do java -jar AXMLPrinter2.jar $f > $f.txt; done; # decompile dex curl http://dex2jar.googlecode.com/files/dex2jar-0.0.9.8.tar.gz|tar zx dex2jar-0.0.9.8/dex2jar.sh classes.dex mkdir classes unzip -d classes classes_dex2jar.jar wget http://www.varaneckas.com/jad/jad158e.linux.static.zip unzip jad158e.linux.static.zip find classes -name \*.class | xargs ./jad -d src -s .java -r
ちょっと余談になりますが、AndroidアプリではPro guardなどで難読化を掛けるのは一般的ではないようです *0 。もっとも多少難読化したところで、面倒になるだけで読めてしまうことには変わりありませんし、別に読めてもいいじゃん、という人が殆どなのかもしれませんが。
ただ、そもそもiOSとAndroid等の複数のプラットフォームに対応するアプリは、コアがJavaで書かれていることは極めて稀なようです。というのも、プラットフォーム毎にコードを書いていては大変なので、独自なりUnity等のミドルウェア(ゲームエンジン)を使って、プラットフォーム間の差異を吸収しているからです。この場合Javaにはグルーコードがあるだけで、そのためそれが読めても意味はなく難読化の意味はありません。コアはネイティブ(機械語)なり、その他の言語(UnityならC#やJavaScriptかな)で別の場所に書かれています。
例えば、ゲーム内課金を行うゲームは通常、課金に関係するステータスやロジックをサーバ側に持っていると思いますが、それでもアプリ側を解析されて例えばボットのようなことをやられるとビジネスが崩壊する恐れがあります。スマホのゲームで巨額の利益を上げている各社が、どのような技術を使ってそのアプリのロジックを守っているか興味深いところです。
*0 : JavaScriptに関してはClosure CompilerのAdvancedモードでのコンパイルが常識となっているのに。ってあれは省サイズが目的ですけど