AndroidStudio debug source code和運行代碼不匹配

問題描述

AndroidStudio在debug的時候,有時候會遇到手機裏面運行的代碼和attch到的source code不是同一份的狀況。這時候IDE會提示你:java

'Source code does not match the bytecode' when debugging on a device
複製代碼

出現這種狀況通常分爲兩類:linux

  • 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版本和源碼位置的對應關係的配置文件。android

配置文件位置:shell

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

配置文件示例windows

<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)肯定關聯源碼的位置。bash

詳情參見:www.jianshu.com/p/905ce7425…ide

Android Studio如何肯定Framework的版本

compileSdkVersion決定AndroidStudio關聯的FrameWork的版本ui

以下圖所示,好比說我把compileSdkVersion設置爲26的時候,AndroidStudio爲我關聯的就是26的android.jarurl

爲何會出現運行的Framework代碼和咱們attch的代碼對應不上

運行的Framework代碼版本由運行手機系統自己決定,經過spa

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)便可

參考文獻

相關文章
相關標籤/搜索