JavaソースコードなしのAndroidアプリのデバッグ

についての記事は何ですか


この記事では、「水」を使わずに、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からの元の命令を多かれ少なかれ繰り返しますが、デバッグが開始されない追加のポイントが含まれています。 かつてそれは私からは始まりませんでしたが、グーグルの強化と「科学的な突く」方法によってこれらの追加ポイントを見つけました。 今、私の経験が誰かの時間を節約することを願っています

指示に正確に従ってください-これは重要です!

  1. Apkツールを使用outて.apkファイルをoutディレクトリにデコードします。 これを行うには、 -dオプションを使用します。
     java -jar apktool.jar d -d my.app.apk out 

    その結果、 out/smaliディレクトリには、Smaliがコメントアウトしたコードを含む多数の.javaファイルがあります。 これは正常な動作です。
  2. android:debuggable="true"属性をout/AndroidManifest.xmlファイルの<application>セクションに追加します
  3. outディレクトリをビルドして.apkファイルに戻します。
     java -jar apktool.jar b -d out my.app.to.debug.apk 

  4. ファイルmy.app.to.debug.apkして、デバッグする実際のデバイスまたはエミュレーターにインストールします。
  5. out/buildディレクトリを削除します(手順6および7でプロジェクトの作成を妨げる場合があります)。
  6. NetBeansを起動し、「ファイル」->「新規プロジェクト」をクリックします。 [Java]-> [既存のソースを含むJavaプロジェクト]を選択します。 「次へ」をクリックします。
  7. 「プロジェクトフォルダー」としてoutを指定outます。 「次へ」をクリックします。
  8. ソースパッケージフォルダリストにout/smaliを追加します。 「次へ」をクリックしてから「完了」をクリックします。 その結果、Smaliコードがコメントアウトされた同じ.javaファイルがプロジェクトに追加されます。
  9. 実際のデバイスまたはエミュレーターでmy.app.to.debug.apkを実行します(実際のデバイスを使用している場合は、USBケーブルを使用してコンピューターに接続されていることを確認し、システムがそれを認識します)。
  10. DDMSを起動し、リストでアプリケーションを見つけてクリックします。 最後の列の情報を思い出してください。これはポート番号で、通常は86xx/8700ようなものです。
  11. Netbeansで、[デバッグ]-> [デバッガーの接続]-> [JPDA]を選択し、[ポート]フィールドに8700と入力します(または前のステップで使用したポート番号)。 残りのフィールドは変更しないでください。 [OK]をクリックします。
  12. これで、アプリケーションをデバッグできます。Netbeansパネルで、適切なボタンをクリックできます
  13. 関心のある命令にブレークポイントをインストールします(はい、既に2回言及した同じ.javaファイル内のコメント化されたSmaliコードからの命令の1つに)。 「。」、「:」または「#」で始まる行にブレークポイントを設定できないことに注意してください。 スマリコードの指示のみ!
  14. アプリケーションでブレークポイントが機能するようにします。 その後、段階的なデバッグを実行したり、フィールドや変数の値を表示したりできます。

つまり、すべてです。

落とし穴


もちろん、キャッチなしの方法はありません。 通常はすべて、手順に従って厳密に手順13までのすべてが順調に進みます。ただし、手順13では、アプリケーションコードの最初にブレークポイントを配置することがよくあります。たとえば、アプリケーションを開始するアクティビティのonCreate(...)メソッドなどです。 論理的なようです-アプリケーションのデバッグを開始する場所が明確でない場合は、最初から開始することをお勧めします。 しかし、ほとんどの場合、物事は行きません。 デバッグされたアプリケーションは、何も起こらなかったかのようにそれ自体で機能し、 onCreate(...)卑劣なブレークポイントはまったく機能しません。

これは、すでに実行中のアプリケーションにデバッガーを接続しているという事実によるものです。 これは、アプリケーションの開始時(たとえば、アプリケーションが開始するアクティビティの同じonCreateメソッド内)のコードがすでに実行されており、その上にブレークポイントを設定することは(もちろんですが)役に立たないことを意味します。 さらに、実行中のアプリケーションにデバッガーをアタッチすると、ブレークポイントが発生するまで、または自分で停止するまで停止しません。これも覚えておく価値があります。

次回の記事では、最初からソースコードなしでAndroid用のJavaアプリケーションをデバッグできるトリックを紹介します。 アプリケーションが起動するアクティビティの最初のonCreate(...)メソッド(またはコンストラクター)から。

質問がある場合は、コメントまたはプライベートメッセージで質問してください。 私はできるだけ早く答えようとします、しかし、私が愚かであるならば-辛抱してください。 私は皆に答えようとします。

ハッピーデバッグ!

Source: https://habr.com/ru/post/J150825/


All Articles