ApkToolとdex2jarでapkをデコンパイルする - アップデートによる例外と解決策
ApkToolとdex2jarを使用してapkをデコンパイルします。
関連ツールは以下からダウンロードできます。
ApkTool: https://ibotpeaches.github.io/Apktool/
Dex2Jarです。 https://sourceforge.net/projects/dex2jar/
JD-GUIです。 http://jd.benow.ca/jd-eclipse/update/#jd-gui-download
ApkToolを使ったapkのデコンパイルとパッケージング
1. ApkToolをダウンロードし、解凍する
cmdコマンドラインでApkToolフォルダに移動し(ショートカットはWin7ではshift+マウス右ボタン)、apktoolと入力すると、下の画像のようなメッセージが表示され、成功したことがわかります。
apktool.batでは、使用するapktool.jarのバージョンを変更することができますので、ご注意ください。
2. ApkToolを使用してapkをデコンパイルする。
cmdコマンドラインでApkToolのフォルダに移動し、コマンドでデコンパイルします。
apktool.bat d [apkファイル] [出力先フォルダ]を指定します。
テストは以下の通りです。成功すると、指定された出力フォルダにデコンパイルされたファイルが生成されます。
3. ApkToolを使用してapkをパッケージ化する
cmdコマンドラインからApkToolのフォルダに移動し、コマンドをパッケージ化します。
apktool.bat b [リソースフォルダ] [できたapkファイルをパッケージ化する]。
テストは以下の通りです。成功すると、指定した出力フォルダにパッケージ化されたapkファイルが生成されます。
なお、ここでパッケージされているapkファイルは署名されていないため、インストール時に以下のようなエラーが表示され、インストールが必要な場合は再署名が必要という解決策になっていることがわかります。
Dex2JarとJD-GUIを使ったapkのデコンパイル
dex2jarを使ってapkファイル内のdexファイルをjarファイルに変換し、できたjarファイルを開くとJD-GUIで対応するJavaコードが表示されます。
1. Dex2JarとJD-GUIのダウンロード
ツールのダウンロードは、記事のトップからどうぞ
2. dex2jar.batを使用してjarファイルを取得します。
デコンパイルするapkのサフィックス形式をzipに変更し、unzipで解凍する。class.dexがデコンパイルする部分。
cmdコマンドラインでDex2Jaフォルダに移動し、コマンドを逆コンパイルします。
d2j-dex2jar.bat [class.dexファイル] を実行します。
成功すると、Dex2Jaフォルダにclasses-dex2jar.jarファイルが生成されます。このjarファイルがデコンパイル後のファイルです。
3. JD-GUIでjarファイルを開く
JD-GUIソフトを使用してclasses-dex2jar.jarファイルを開くと、デコンパイルされたコードを見ることができます。
もし逆コンパイルをしているapkが難読化されている場合、逆コンパイルで見るものは基本的に読みにくいことに注意してください。
概要
ApkToolを使用してapkファイルをデコンパイルすると、dexファイルがsmaliファイルに変換され、レイアウトファイルや画像などのapk内のリソースファイルを抽出するのに適したファイルになります。
Dex2Jarを使用してapkファイルを逆コンパイルすると、最終的にdexファイルはJD-GUIで開くことができるjarファイルに変換され、難読化されていないapkが逆コンパイルによって対応するJavaソースコードを見るのに適しています。
アップデートの例外と解決策
ApkToolを使ってデコンパイルするとき、時々以下のような例外に遭遇することがあります。
エラーの種類
- 入力ファイル xxx が見つからないか、または読み取れませんでした。
- 原因:java.io.IOException。期待された: 0x001c0001, 得られた: 0x00000000
- スレッド "main" java.lang.NullPointerException I で例外が発生しました。ファイルからリソーステーブルをロードしています。C:\Usersusername³³³³ framework1.apk
入力ファイル xxx が見つからないか、または読み取れませんでした。
この場合の問題は、2.1.0 では、デコンパイルディレクティブが 1.5.3 と異なっており、デコンパイル出力フォルダを指定する必要がある場合、そのプレフィックスとして
-o
で出力フォルダを指定します。
成功は以下の通りです。
原因:java.io.IOException。期待された: 0x001c0001, 得られた: 0x00000000
この問題は、通常、apktoolのバージョンの不一致によって発生し、解決されます。
- 1つ目は、現在のプロジェクトのproject.propertiesファイルにある、現在のプロジェクトのsdkのbuildtoolsのバージョンを修正することです。
-
2つ目は、新しいバージョンのapktoolを使用してデコンパイルする方法ですが、apktoolのバージョンを切り替えると次の問題にぶつかる可能性があります。解決方法は以下を参照してください。
スレッド "main" java.lang.NullPointerException で例外が発生しました。
この問題は、通常、apktoolのjarパッケージのバージョンを切り替えた場合に発生します。コマンドラインでエラーメッセージを確認できます。I: ファイルからリソーステーブルをロードします。C:\Usersusername﹑apktool﹑framework1.apk.
解決するには、コマンドラインプロンプトでframeworkフォルダから1.apkファイルを削除し、デコンパイル用に再コンパイルすれば解決します。
関連
-
[android.os.NetworkOnMainThreadException を解決してください。
-
Android Studio 3.1.2 新規プロジェクトのエラー AAPT2エラー:詳細はログを確認してください(Gradle 3.1.2)
-
コンフィギュレーション 'compile' は廃止され、'implementati solution' に置き換わりました。
-
Intellij Ideaは、シンボルが見つからない、RクラスまたはRパッケージが存在しない、というエラーを報告します。
-
Androidの内部育成に磨きをかける2年間
-
Android Studio がエラーを報告します。指定された名前に一致するリソースが見つかりませんでした
-
AndroidManifest.xml の use-sdk 警告メソッドを削除する。
-
android studioエミュレータの起動に失敗しました
-
INSTALL_FAILED_INVALID_APK: 分割された lib_slice_5_apk が複数回定義されている 例外
-
Android SDKです。sdkmanagerコマンドラインツールの使用(パッケージの表示、インストール、アップデート、アンインストール)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
android:ems="10 "とは何ですか?
-
Android プロジェクトのライブラリに armeabi-v7a、armeabi、x86 が追加されました。
-
非推奨のKotlin Android Extensionsプラグインを移行する
-
エミュレータです。PANIC: AVDのシステムパスが壊れています。ANDROID_SDK_ROOTの値を確認してください。
-
アプリケーションがメインスレで仕事をしすぎている可能性がある
-
指定された子にはすでに親がいます。まず、その子の親に対して removeView() をコールする必要があります。
-
AndroidでデータをExcelファイルに書き出す方法
-
android ImageViewの割り当て問題 setImageResourceとsetImageBitmap
-
AndroidのRadioButtonの中央寄せ問題(解決済み)
-
SQLiteReadOnlyDatabaseException: 読み取り専用のデータベースを書き込もうとした (コード 1032)