AndroidStudio debug source code和运行代码不匹配

8,197 阅读3分钟

问题描述

AndroidStudio在debug的时候,有时候会遇到手机里面运行的代码和attch到的source code不是同一份的情况。这时候IDE会提示你:

'Source code does not match the bytecode' when debugging on a device

出现这种情况一般分为两类:

  • android.jar(Framework API)版本对不上:比如说手机的系统API版本是24的,但是attch上的source code的版本是28的
  • 依赖的第三方库的sourc code版本不对:比如说运行的代码依赖的是Glide4.1的代码,但是attch上的是Glide4.8的代码

AndroidStudio自动关联android.jar源码的原理简介

Android Studio如何关联Framework源码

在AndroidStudio的安装文件夹下面会有配置文件记录Framework API版本和源码位置的对应关系的配置文件。

配置文件位置:

linux:~/Library/Preferences/AndroidStudio{version}/options/jdk.table.xml
windows:C:\Users{USER_NAME}.AndroidStudio2.0\config\options\jdk.table.xml

配置文件示例

<jdk version="2">
      <name value="Android API 28 Platform" />
      <type value="Android SDK" />
      <version value="java version &quot;1.8.0_152-release&quot;" />
      <homePath value="$USER_HOME$/Library/Android/sdk" />
      <roots>
        <annotationsPath>
          <root type="composite">
            <root url="jar://$USER_HOME$/Library/Android/sdk/platforms/android-28/data/annotations.zip!/" type="simple" />
          </root>
        </annotationsPath>
        <classPath>
          <root type="composite">
            <root url="jar://$USER_HOME$/Library/Android/sdk/platforms/android-28/android.jar!/" type="simple" />
            <root url="file://$USER_HOME$/Library/Android/sdk/platforms/android-28/data/res" type="simple" />
          </root>
        </classPath>
        <javadocPath>
          <root type="composite">
            <root url="file://$USER_HOME$/Library/Android/sdk/docs/reference" type="simple" />
          </root>
        </javadocPath>
        <sourcePath>
            // 源码的位置
          <root type="composite">
            <root url="file://$USER_HOME$/Library/Android/sdk/sources/android-28" type="simple" />
          </root>
        </sourcePath>
      </roots>
      <additional jdk="1.8" sdk="android-28" />
    </jdk>

通过该配置文件AndroidStudio就能根据当前编译的Framework的版本(compileSdkVersion)确定关联源码的位置。

详情参见:www.jianshu.com/p/905ce7425…

Android Studio如何确定Framework的版本

compileSdkVersion决定AndroidStudio关联的FrameWork的版本

如下图所示,比如说我把compileSdkVersion设置为26的时候,AndroidStudio为我关联的就是26的android.jar

为什么会出现运行的Framework代码和我们attch的代码对应不上

运行的Framework代码版本由运行手机系统本身决定,通过

adb shell getprop ro.build.version.sdk

就能确定当前手机系统API版本,如果手机系统API版本和compileSdkVersion对应不上的话就会出现framwork代码atcch错误的情况

解决方案

android.jar源码码对不上

根据上述的分析,产生这个问题的本质原因是手机系统API版本compileSdkVersion不匹配导致。因此解决起来非常简单:

(1)确定手机系统版本

adb shell getprop ro.build.version.sdk

(2)将compileSdkVersion设置为和手机系统版本一致即可

(3)一般按照上述步骤即可,但是还可能存在关联错误的情况,我们可以按照如下步骤手动选择需要的Framework的版本

  • 开启Show alternative source switcher
  • debug的时候手动切换选择需要版本的代码

第三方库源码版本对不上

参照android.jar源码对不上的步骤(3)即可

参考文献