web-dev-qa-db-ja.com

Android studioは、古いAPIを搭載したデバイスでデバッグするときに、compileSdkVersionのAPIからのソースを表示します

Android Studio(AS)1.0.2 with compileSdkVersion21をbuild.gradleに設定してデバッグしています。API21でエミュレーターを使用するとすべて正常に動作します。デバイスでデバッグすると問題が発生します。 API 19を使用しています。呼び出しスタックの各行(ASでは「フレーム」としてタグ付けされています)には、API 19に一致する関数名、ソースファイル、行番号が正しく表示されます。ただし、次のいずれかに対応する行の1つをクリックするとフレームワークソース(Activity.Javaなど)の場合、ASは誤って開き、API19バージョンではなくAPI21バージョンのファイルを表示します。

私のAndroid sdkフォルダーには./sources/Android-19と./sources/Android-21の両方があります

A.Sが間違ったバージョンのファイルを表示する理由はありますか?

私が試したこと(順番に):

  • リセットAndroid Studio(〜/ .AndroidStudio *を削除)
  • Android Studioを最新バージョンに更新
  • API 21を使用してエミュレーターで実行-A.Sは、ファイルの正しいバージョン(21)を示しています。
  • CompileSdkVersionを19に変更し、API 19デバイスで実行する-A.Sは、呼び出しスタックに正しい行番号を表示し、ファイルの正しいバージョン(API 19)を正しい行に開きます。
  • CompileSdkVersionを19に変更し、API 21エミュレーターで実行する-ASは、呼び出しスタックにAPI 21に対応する行番号を表示します(これは正しい動作のように見えます)が、クリックすると、ASは誤ってAPIを開きますAPI 21バージョンではなく、19バージョンのファイル。

要約すると、コールスタックの行をクリックすると、A.Sは、デバッグセッション中にデバイス/エミュレーターによって使用されたものではなく、compileSdkVersionによって表されるファイルのバージョンを開きます。

37
HaimS

ここで実用的な解決策で答えました:

https://stackoverflow.com/a/32236703/1267536

フルコンテンツ:

私はappcompatサポートライブラリをかなりよく使用します。 compileSdkVersionを変更すると、大規模なコンパイルエラーが発生するだけです。 appcompat-21を使用している場合は、api 21に対してコンパイルする必要があります。そうしないと、コンパイルエラーが発生します。

これは、バージョン21に対してデバッグしている場合は正常に機能します。ただし、Jelly Bean(API 17)でデバッグしている場合、デバッガーはAPI21ソースにドロップし続けます。非常に煩わしく、デバッグが困難です。

私が使用することになったソリューションは非常にハッキーですが、機能します! API17に対してデバッグしようとしているとしましょう。次の手順を実行します。

  1. mv $ Android_HOME/sources/Android-21 $ Android_HOME/sources/Android-21-orig
  2. cp $ Android_HOME/sources/Android-17 $ Android_HOME/sources/Android-21
  3. 正しいパスを取得するようにAndroid studioを再起動します。
  4. デバッグ

完了したら、すべてのディレクトリを元に戻すことを忘れないでください。

これがAndroidこの問題に関するスタジオバグレポートです: https://code.google.com/p/Android/issues/detail?id=183976

6
vangorra

Intellij Idea(それに基づくAndroid Studio)でプロジェクトを開き、File -> Project Structure...を選択します。プロジェクト設定で、デバッグが必要なバージョンの「プロジェクトSDK」を選択し、すべてのプロジェクトモジュールに対して「プロジェクトSDK」をモジュールSDKとして選択します。その後、デバイス/エミュレーターにデバッグ接続を接続して、適切なAndroidソースを確認できます。

IntellijIdeaでプロジェクトをビルドする必要はありません。

3

SDKのソースファイルのフォルダー名を一時的に変更します。たとえば、APIレベル23に対してコンパイルしたが、テストおよびデバッグしているデバイスはAPIレベル15です。次に、最初にコンパイルしてデバッグモードで実行し、ブレークポイントを設定します。その後、名前を切り替えます。

$SDK_HOME$/sources/Android-23/ -> $SDK_HOME$/sources/Android-23-temp/
$SDK_HOME$/sources/Android-15/ -> $SDK_HOME$/sources/Android-23/

そして、これが行われたら、ブレークポイントに到達する良い機会です。

このソリューションは、SDKマネージャーから両方のAPIレベルのソースをインストールしたことを前提としています。

2
ilian

実際のデバイスでアプリをデバッグし、デバイスのSDKレベルでコンパイルしてみてください。コールスタックの行番号は、デバイスによって提供されるクラスでは「同期していない」可能性があります。

Android Studioは、実行中のデバイスに正しいソースを確実に提供できません。デバッグしているデバイスのSDKバージョンが考慮されている場合でも、デバイスのファームウェアはさまざまなソースファイルからコンパイルされ、APIと互換性があるだけです。

そのため、Android Studioは、ターゲットデバイスによって提供されるクラスのコンパイルSDKバージョンを表示するだけで、コンパイラのリファレンス実装を表示するだけだと思います。

1
Oderik

問題へのリンク この問題を追跡します。

Android Studio 2.2はそれを修正し、実際に実行しているデバイスに対応するAPIレベルのソースにジャンプします(それらのソースがインストールされている場合)。発表されました こちら

0
Alex Lipov