Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

Androidアプリケーション(apkファイル)の中身を調べる

どうしたらこのようなプログラムができるのか?といった大袈裟なレベルではなく、この部分の判定、出力は何を根拠にしているのか?といった、分析や解析に至るまでには程遠いものの、

  • 単純に構造が知りたい
  • 処理構造が知りたい

といった探求心、好奇心が掻き立てられることがある。

オープンソースの隆盛により、GitHubなどでプログラムが公開され、簡単にそのような欲求は満たされる時代になりはしたものの、それですべてが解決できるわけではない。そのような領域の一つが、いわゆるアプリストアで提供されるアプリケーションだ。

この投稿では、Androidアプリ(apkファイル)について、その中身を「ある程度」調べるための手立てを紹介する。

前提と予備知識

事前に検証したいapkファイルが手許にあること。apkファイルの入手方法については、この投稿では取り上げない。

用語
apk Android PaCKage
Android application PaCKage
実態は署名付きzipファイル
dex Dalvik EXecutable format Dalvik VMバイトコード
jar Java ARchive 実態はzipファイル
apkの中身*1
AndroidManifest.xml アプリケーション情報 バージョン
アクセス権
依存ライブラリ
などなど
classes.dex いわゆる実行ファイル この中身を調べたい
META-INF 署名情報
res コンパイル・リソース フォント
画像
などなど
resources.arsc リソースのメタ情報

単純に構造が知りたい場合

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'