web-dev-qa-db-ja.com

Android Studioデバッガーが間違った行を強調表示する

何が実行されるかという点で機能的に問題があることはわかりませんが、コードとコンパイラーが想定どおりに動作していることを証明するのに1時間も無駄にしています。

このコードを検討してください:

public int getAnswer(int a) {

    int retval = 18;

    int x = 25;
    int y = 50;

    while (a-- > 0) {
        if (a == 3) {
            retval = a;
            return retval;
        }
    }

    x = 10;
    y = 20;

    return 0;
}

と呼ばれる

int theAnswer = getAnswer(6);

returnを含む両方の行をブレークポイントし、コードを実行する前に、結果を予測してみてください。したがって、どちらの行がヒットするかを予測してください。

私の質問の口調から想像できるように、間違った行が強調表示されますが、正しい結果が返されます。コードをステップスルーすると、コードはかなり踊ります。

正しい行が表示されるように別の方法で構成できるものはありますか? (私は最新のAndroid Studioを使用しています。これは不安定である可能性がありますが、しばらく前にEclipseで同様の動作が見られたと確信していますが、追跡に時間を費やしたことはありません。それはダウンしています;おそらくそれはJavaもの)です。

35
user146043

これは、Androidにパッケージ化するためにJava .classファイルを.dxファイルに変換するビルドの一部であるdxの問題です。これによると:

https://code.google.com/p/Android/issues/detail?id=3419

関数に複数のreturnパスがある場合、dxはreturn命令を単一のreturn命令にマージするため、デバッグ中に、デバッガーはreturnがどの行に属しているかを認識できず、処理がジャンプします。これは、問題を再現しようとしたときに表示される内容に対応しています。ループを通過するたびに、if (a == 3)チェックが実行され、最後にreturn 0にジャンプしてから、ループに戻ります。 。最後のreturn 0がループの途中でreturn retvalとマージされているのがわかります。

これがすぐに修正されるとは思えないので、一緒に暮らすことを学ぶ必要があるかもしれません。すみません、ちょっとクレイジーだと思います。

44
Scott Barta

少なくともAndroid SDKソースコードにステップインするために)私のために働いたものは次のとおりです。

  1. インストールSDKプラットフォームおよびソースAndroid SDK for 正確に API開発中に実行しているAndroidのバージョンのレベル( Androidバージョン履歴 ページを使用して、デバイスのAPIレベルを確認してください)。
  2. コンパイルアプリ正確にそのバージョン。たとえば、Android Studioで、アプリのbuild.gradleファイルを開き、それに応じてcompileSdkVersionの値を設定します。
  3. デバッグアプリ。 Android SDKソースにステップインすると、正しい行が表示されます。
  4. (オプション)再コンパイルデプロイする前に最新のSDKを使用します。つまり、compileSdkVersionを元に戻します。
2
Gary S.

[ビルド]-> [プロジェクトの再ビルド]を試してから、Shift + F9を試してください。アプリケーションで実行されている古いコードがあります。

2
Roger Alien