Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio在使用旧API的设备上调试时显示CompileSDK版本API的源代码_Android_Api_Debugging_Android Studio - Fatal编程技术网

Android studio在使用旧API的设备上调试时显示CompileSDK版本API的源代码

Android studio在使用旧API的设备上调试时显示CompileSDK版本API的源代码,android,api,debugging,android-studio,Android,Api,Debugging,Android Studio,我正在使用Android Studio(A.S)1.0.2进行调试,在build.gradle中设置了CompileSDK版本21。 使用带有API 21的仿真器时,一切正常。 在具有API 19的设备上进行调试时会出现此问题。 调用堆栈中的每一行(在A.S中标记为“Frames”)都正确地显示与API 19匹配的函数名、源文件和行号。 但是,当我单击与某个框架源(例如Activity.java)对应的一行时,A.S错误地打开并显示文件的API21版本,而不是API19版本 在我的android

我正在使用Android Studio(A.S)1.0.2进行调试,在build.gradle中设置了CompileSDK版本21。 使用带有API 21的仿真器时,一切正常。 在具有API 19的设备上进行调试时会出现此问题。 调用堆栈中的每一行(在A.S中标记为“Frames”)都正确地显示与API 19匹配的函数名、源文件和行号。 但是,当我单击与某个框架源(例如Activity.java)对应的一行时,A.S错误地打开并显示文件的API21版本,而不是API19版本

在我的android sdk文件夹中,我有两个 ./sources/android-19和。/sources/android-21

知道为什么A.S显示错误版本的文件吗

我试过的事情(按顺序):

  • 重置Android Studio(通过删除~/.AndroidStudio*)
  • 将Android Studio更新至最新版本
  • 在带有API21-A.S的emulator上运行时,将显示文件的正确版本(21)
  • 将compileSdkVersion更改为19并在API 19设备-A.S上运行会在调用堆栈中显示正确的行号,并在正确的行中打开文件的正确版本(API 19)
  • 将compileSdkVersion更改为19并在API21 emulator-A.S上运行时,会在调用堆栈中显示对应于API21的行号(我认为这是正确的行为),但是,当单击它时,A.S错误地打开了文件的API19版本,而不是API21版本

总而言之,当点击调用堆栈中的一行时,a.S会打开由compileSdkVersion表示的文件版本,而不是设备/模拟器在调试会话期间使用的版本。

在Intellij Idea(基于它的Android Studio)中打开您的项目,然后选择
文件->项目结构…
。在项目设置中,选择“项目SDK”到需要调试的版本,并为所有项目模块选择“项目SDK”作为模块SDK。之后,您可以将调试连接连接连接到设备/仿真器,并查看正确的Android源代码


您不需要在Intellij Idea中构建项目。

尝试在真实设备上调试应用程序,并使用设备的SDK级别进行编译。对于设备提供的类,调用堆栈中的行号可能“不同步”

Android Studio无法可靠地为您正在运行的设备提供正确的源代码。即使考虑到您正在调试的设备的SDK版本,该设备的固件仍然可以(也可能会)从不同的源文件编译,并且仅与API兼容


我认为这就是为什么Android Studio只显示目标设备提供的类的编译SDK版本。它只是显示了编译器的参考实现。

在这里用工作解决方案回答:

全部内容:

我经常使用appcompat支持库。更改CompileSDK版本只会导致大量编译错误。如果您使用的是appcompat-21,则必须根据api 21进行编译,否则将出现编译错误

如果您正在针对版本21进行调试,则此功能可以正常工作。但是,当您在Jelly Bean(API 17)上调试时,调试器会不断将您放到API 21源代码中。非常烦人而且很难调试

我最终使用的解决方案非常粗糙,但很有效!假设您正在尝试针对API 17进行调试。请执行以下操作:

  • mv$ANDROID_HOME/sources/ANDROID-21$ANDROID_HOME/sources/ANDROID-21-orig
  • cp$ANDROID_HOME/sources/ANDROID-17$ANDROID_HOME/sources/ANDROID-21
  • 重新启动android studio,以便它能够选择正确的路径
  • 调试
  • 完成后别忘了把所有目录放回去

    以下是有关此问题的android studio错误报告:

    更改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 manager安装了两个API级别的源。

    跟踪此问题


    AndroidStudio 2.2修复了它,并将跳转到与您实际运行的设备对应的API级别的源(只要您安装了这些源)。发布了。

    我想找到一个解决方案,其中
    compileSdkVersion
    设置为21,Android Studio在API级别19设备上调试时自动显示正确的源代码。我根本不想切换
    compileSdkVersion
    ,因为我的构建应该是针对API级别21的。为了让这个“黑客”更容易使用,我编写了一个基本的node js cli应用程序,可以为您重命名:这在2.3.3上不起作用。也许它被删除了,或者,就像时差脑中的很多东西一样,它就是不起作用。是的,它在AS 3.4.2上也不起作用。有时它们让我发疯,它们在有很多bug的时候引入新功能!在Logcat视图中单击时仍然不能跳转到正确的源代码。这是一个很好的主意。这也适用于Logcat(从Android Studio的4.0.1版开始,Logcat还没有修复)。