どうしたらこのようなプログラムができるのか?といった大袈裟なレベルではなく、この部分の判定、出力は何を根拠にしているのか?といった、分析や解析に至るまでには程遠いものの、
- 単純に構造が知りたい
- 処理構造が知りたい
といった探求心、好奇心が掻き立てられることがある。
オープンソースの隆盛により、GitHubなどでプログラムが公開され、簡単にそのような欲求は満たされる時代になりはしたものの、それですべてが解決できるわけではない。そのような領域の一つが、いわゆるアプリストアで提供されるアプリケーションだ。
この投稿では、Androidアプリ(apkファイル)について、その中身を「ある程度」調べるための手立てを紹介する。
前提と予備知識
事前に検証したいapkファイルが手許にあること。apkファイルの入手方法については、この投稿では取り上げない。
単純に構造が知りたい場合
Android Studioにて空のプロジェクトを作成し、次の操作で目的のapkファイルを開けば目的を達成できる。そして、これは公式サイトで紹介されている方法*2でもある。
Build > Analyze apk...
この方法ではxmlファイルや、アプリケーションで使用されている画像やフォント、プログラム本体であるdexファイルの中身までは参照することが出来るのだが、処理構造までは確認できない。これ以上を望むならば、次のステップに進む必要がある。
処理構造が知りたい場合
アプリケーション内の処理構造を覗き見るならば、大まかに次の手順を経ることになる。
作業 | 使用ツール |
---|---|
apkファイルをunzipする。 dexファイルを取り出す。 dexファイルをjarファイルへ変換する。 jarファイルをunzipする。 |
dex2jar*3 |
jarファイルの中身を調べる。 | JD-GUI*4 |
classファイルをjavaファイルへ変換する。 | Jad*5 |
dex2jarとJadはコマンドライン・ツールだ。それぞれ任意のフォルダに格納され、パスが通っているとする。目的のapkファイル、変換されたファイルの出力先は、それぞれ次のパスになるとすれば、
目的のapkファイル | d:\work\20221126\MyApplication.apk |
apkファイル変換後の出力先 | d:\work\20221126\output\ |
classファイル変換後の出力先 | d:\work\20221126\jad\ |
dex2jarのコマンドは次のようになる。
.\d2j-dex2jar.bat -o "d:\work\20221126\output\" "d:\work\20221126\MyApplication.apk"
apkファイルの中身は、自動的にapk→dex→jarファイルへ変換される。さらにjarファイルは自動的にunzipされ、その内容が指定フォルダへ展開される。
展開されたフォルダを物色し、適当なclassファイルに目星を付ける。そこでJD-GUIを起動し、そのclassファイルを開けば、自動的にアプリケーション構造の全貌が出力される。その出力が、この投稿の冒頭に掲載した画像だ。もちろんclassファイルの中身を覗き見ることもできる。
目的としている処理に近づくためには、何か関連するキーワード(Search string)で検索してみると良い。
Search > Search...
このときキーワードの入力前に「Search For」の項目に全てチェックを入れておくと、キーワードを一文字入力するごとに、リアルタイムに検索結果を表示してくれる。目的のキーワードを含むclassファイルが見つかったら、そのキーワードを含む処理を確認する。
ここまでできれば、ほとんどの用事は片付くはずだ。さらにclassファイルをjavaファイルへ変換しようとするならば、Jadを用いる。
次のコマンドを実行すると、指定フォルダ配下に変換元のフォルダ構造が再現され、変換対象ファイルが格納されていた場所に該当するフォルダへ「MyApplication.java」が出力される。
.\jad -o -r -sjava -d 'D:\work\20221126\jad\' 'D:\work\20221126\output\com\ataraxianstudios\drminfo\activity\MyApplication.class'