やんごとなき事情(汗)から、自分が作成して端末にインストールしていたapkから、Javaソースコードを復元する必要に迫られたので、作業メモ。
最終的には、javaファイルは生成されていないが、コピペして元のプロジェクトに入れつつ、コメントを戻したりGOTO文wを直したりして復元完了(予定)。
注意事項
これはいわゆる「リバースエンジニアリング」と言われる手順です。
他者及び他社の作成したapkをリバースエンジニアリングすることは、法律に触れる場合が多いですので、あくまでも、ご自分のapkや社内製の成果物に対してのみ行って下さい。
自己責任でお願いします。
作業環境
Mac
JDK7必須
##ステップ1 リソースファイルを復元
apkからresフォルダを復元します。
※resフォルダ、特にstrings.xmlの復元が不要な場合は、このステップはやらなくてOK。
必要ツール
これを書いている時点(2015/01/31)の最新バージョンはv2.0.0RC3のようです。
(1) apktoolをDLし、任意のフォルダに解凍する
(2) apktool.jarに実行権限を付与する
# chmod +x apktool.jar
(3) 以下コマンドを実行
# apktool d 変換したいapkファイル名
このステップだけで、リソース関連が完全復活できたので、この先のdex2jarでちょっとハマったとき、ここまでで諦めるところだった。
レイアウト調整にdimension切りまくってたから、その作業がもっとも「二度とやりたくない」作業だったので(--;
##ステップ2 smali → dex
dex2jarにかけるために、いったんdexに変換する。
必要ツール
(1)smali-XXXX.jarを任意のフォルダにDL
(2)以下のコマンドを実行
# java -jar smali-XXXX.jar -o 作成するdexファイル名 dexに変換したいsmaliフォルダ
apktoolで変換した場合、smaliフォルダは、apkファイル名のフォルダが出来ていると思うので、その直下にあります。
ここまではすんなり進行。
追記:
kimama1997様に、apkをzip解凍するとdexファイルがあるということをコメント頂きました!
なので、このステップは、単純に以下だけでOKです。
# unzip apkファイル名
すると、解凍フォルダ内に、classes.dexというdexファイルがあるので、それを以降のステップで使えます。
##ステップ3 dex → jar
いよいよjarに変換。
必要ツール
- dex2jar (http://sourceforge.net/projects/dex2jar)
(1)dex2jarを任意のフォルダにDL&zip解凍する
(2)解凍したフォルダ以下すべてのファイルに実行権限を付与する
# chmod +x *
(3)以下のコマンドを実行
# sh dex2jar-2.0-SNAPSHOT/d2j-dex2jar.sh ステップ2で出来たdexファイルパス
dexファイル名-dex2jar.jarが出来ていれば成功。
dex2jarで検索すると、古いプロジェクトを紹介しているサイトがほとんどで、例外はいて落ちてしまうので、ここでいったん諦めかけました^^;
2015/01/31時点でのアクティブなプロジェクトサイトは上記サイトになりますのでご注意を。
なお、jarファイルはコマンドを実行したディレクトリに作成されます。
##ステップ4 jar → class
ステップ3で出来たjarファイルの拡張子をzipに変更して、解凍する
##ステップ5 class → java
やっとソースコードが読めます。
必要ツール
- JavaDecompiler (http://jd.benow.ca/)
(1)JD-GUIをDLして実行、appファイルを任意のフォルダに移動して起動
(2)ファイルアイコンをクリック
(3)ステップ4で出来た任意の.classファイルを指定(何か1つ指定すると、全部見られるようになります)
無事、javaっぽいソースコードが見られれば成功!
場合によってはEclipseやIntelliJのプラグインを入れてもいいですね。
ネット上では、jadでやる方法が多く見られますが、java1.5以上には対応していないっぽいので、こちらの方法にしました。
##その他
バックアップは大切。
手戻りが発生しても痛くない時点で、さっさとソース管理なりに登録しましょう・・・。゜(゜´Д`゜)゜。