についての記事は何ですか
この記事では、「水」を使わずに、JavaソースコードがなくてもAndroidアプリケーションをデバッグする方法を簡単に説明します。 この記事は初心者向けではありません。 これは主に、
Smali構文を多少理解し、Androidのエンジニアリングアプリケーションを逆にした経験がある人に
役立ちます。
ツール
Apk-tool 1.4.1および
NetBeans 6.8が必要
です 。 はい、はい、これらは古代のバージョンです! 新しいバージョンでは、残念ながらデバッグは開始されません。これは、さまざまな議論で既に繰り返し言及されています(たとえば、
ここと
ここを参照 )。
詳細にインストールを停止しません。 NetBeansはデフォルトでインストールされます。インストールを開始して、[次へ]、[次へ]、[次へ]の順にクリックします。 Apk-toolsのインストールは、
apktool.jar
ファイルを通常のフォルダーに展開することで構成されます。
また、途中でDDMSが必要になります-これはAndroid SDKに含まれています。
デバッグ
このセクションでは、手順を追って説明します。 Windows用に作成されましたが、おそらくLinuxおよびMac OSで動作します。 ブログにはこのマニュアルの英語のドラフトもありますが、ルールがあるためリンクは提供しません。 この命令は、Apkツールwikiからの
元の命令を多かれ少なかれ繰り返しますが、デバッグが開始されない追加のポイントが含まれています。 かつてそれは私からは始まりませんでしたが、グーグルの強化と「科学的な突く」方法によってこれらの追加ポイントを見つけました。 今、私の経験が誰かの時間を節約することを願っています
指示に正確に従ってください-これは重要です!
- Apkツールを使用
out
て.apkファイルをout
ディレクトリにデコードします。 これを行うには、 -d
オプションを使用します。
java -jar apktool.jar d -d my.app.apk out
その結果、 out/smali
ディレクトリには、Smaliがコメントアウトしたコードを含む多数の.javaファイルがあります。 これは正常な動作です。
android:debuggable="true"
属性をout/AndroidManifest.xml
ファイルの<application>
セクションに追加します
out
ディレクトリをビルドして.apkファイルに戻します。
java -jar apktool.jar b -d out my.app.to.debug.apk
- ファイル
my.app.to.debug.apk
して、デバッグする実際のデバイスまたはエミュレーターにインストールします。 out/build
ディレクトリを削除します(手順6および7でプロジェクトの作成を妨げる場合があります)。
- NetBeansを起動し、「ファイル」->「新規プロジェクト」をクリックします。 [Java]-> [既存のソースを含むJavaプロジェクト]を選択します。 「次へ」をクリックします。
- 「プロジェクトフォルダー」として
out
を指定out
ます。 「次へ」をクリックします。 - ソースパッケージフォルダリストに
out/smali
を追加します。 「次へ」をクリックしてから「完了」をクリックします。 その結果、Smaliコードがコメントアウトされた同じ.javaファイルがプロジェクトに追加されます。 - 実際のデバイスまたはエミュレーターで
my.app.to.debug.apk
を実行します(実際のデバイスを使用している場合は、USBケーブルを使用してコンピューターに接続されていることを確認し、システムがそれを認識します)。
- DDMSを起動し、リストでアプリケーションを見つけてクリックします。 最後の列の情報を思い出してください。これはポート番号で、通常は
86xx/8700
ようなものです。
- Netbeansで、[デバッグ]-> [デバッガーの接続]-> [JPDA]を選択し、[ポート]フィールドに
8700
と入力します(または前のステップで使用したポート番号)。 残りのフィールドは変更しないでください。 [OK]をクリックします。 - これで、アプリケーションをデバッグできます。Netbeansパネルで、適切なボタンをクリックできます
- 関心のある命令にブレークポイントをインストールします(はい、既に2回言及した同じ.javaファイル内のコメント化されたSmaliコードからの命令の1つに)。 「。」、「:」または「#」で始まる行にブレークポイントを設定できないことに注意してください。 スマリコードの指示のみ!
- アプリケーションでブレークポイントが機能するようにします。 その後、段階的なデバッグを実行したり、フィールドや変数の値を表示したりできます。
つまり、すべてです。
落とし穴
もちろん、キャッチなしの方法はありません。 通常はすべて、手順に従って厳密に手順13までのすべてが順調に進みます。ただし、手順13では、アプリケーションコードの最初にブレークポイントを配置することがよくあります。たとえば、アプリケーションを開始するアクティビティの
onCreate(...)
メソッドなどです。 論理的なようです-アプリケーションのデバッグを開始する場所が明確でない場合は、最初から開始することをお勧めします。 しかし、ほとんどの場合、物事は行きません。 デバッグされたアプリケーションは、何も起こらなかったかのようにそれ自体で機能し、
onCreate(...)
卑劣なブレークポイントはまったく機能しません。
これは、すでに実行中のアプリケーションにデバッガーを接続しているという事実によるものです。 これは、アプリケーションの開始時(たとえば、アプリケーションが開始するアクティビティの同じonCreateメソッド内)のコードがすでに実行されており、その上にブレークポイントを設定することは(もちろんですが)役に立たないことを意味します。 さらに、実行中のアプリケーションにデバッガーをアタッチすると、ブレークポイントが発生するまで、または自分で停止するまで停止しません。これも覚えておく価値があります。
次回の記事では、最初からソースコードなしでAndroid用のJavaアプリケーションをデバッグできるトリックを紹介します。 アプリケーションが起動するアクティビティの最初の
onCreate(...)
メソッド(またはコンストラクター)から。
質問がある場合は、コメントまたはプライベートメッセージで質問してください。 私はできるだけ早く答えようとします、しかし、私が愚かであるならば-辛抱してください。 私は皆に答えようとします。
ハッピーデバッグ!