Mã nguồn không khớp với mã bytecode cho View.java của Android

Aug 24 2020

Tôi đang cố gắng gỡ lỗi ứng dụng Android của mình. Khi trình gỡ lỗi truy cập tệp View.java, tôi nhận được thông báo, "Mã nguồn không khớp với mã bytecode". Tôi có thể thấy rằng trình gỡ lỗi nằm trong phần sai của tệp. Có ai biết làm thế nào để sửa lỗi này?

Tôi đang gỡ lỗi trên thiết bị Android 10 (API 29). Trong Tùy chọn Android Studio -> Giao diện & Hành vi -> Cài đặt Hệ thống -> Android SDK, tôi đã đảm bảo mọi thứ đều được cập nhật. Tôi cũng đã làm sạch và xây dựng lại nhiều lần, xóa bộ nhớ đệm, khởi động lại Android Studio và thiết bị, gỡ cài đặt / cài đặt lại, cập nhật Android Studio lên 4.0.1. Trong Cài đặt mô-đun, "Phiên bản Sdk biên dịch" là 29 và Phiên bản SDK mục tiêu và Phiên bản SDK tối thiểu thành 29. Không có gì giúp ích hoặc có bất kỳ ảnh hưởng nào. Nhiều bước trong số này đã được đề xuất trong các bài viết tương tự.

Tệp View.java mà nó cố gắng mở có tại: ~ / Library / Android / sdk / sources / android-29 / android / view / View.java. Đây phải là tệp chính xác, nhưng trình gỡ lỗi nằm trong phần sai của tệp trong khi tôi nhận được thông báo lỗi.

Đội chiếc mũ đen của tôi, hãy giả sử rằng View.java của máy tính xách tay của tôi đúng với cấp API đó: điện thoại của tôi có thể đang chạy mã không chuẩn không và có cách nào để phát hiện hoặc loại trừ nó không?

Trả lời

curious_george Aug 24 2020 at 23:58

Tôi nghĩ rằng tôi đã tìm ra điều gì đang xảy ra và tôi có giải pháp cho vấn đề này khi nó xảy ra với các tệp Android SDK. Đáng kinh ngạc là, Nền tảng SDK Android được cập nhật lên Bản sửa đổi 5, nhưng gói nguồn không được cập nhật. Nó vẫn còn trên Bản sửa đổi 1! Tại sao điều này xảy ra, tôi không thể giải thích: một người hợp lý sẽ mong đợi cả hai đồng bộ. Ảnh chụp màn hình này cho thấy mã nguồn không khớp với tệp nhị phân mà Android Studio đã tải xuống:

Cách duy nhất để giải quyết vấn đề này là tải xuống thủ công các tệp bạn cần và vá chúng theo cách thủ công trong thư mục nguồn SDK của bạn. Nó xấu xí, không cần thiết, nhưng nếu bạn thực sự muốn xem qua một tệp SDK cụ thể, bạn phải làm điều đó.

Đây là các bước tôi đã làm theo:

  1. Tìm hiểu bản dựng Android mà bạn có. Trên thiết bị của bạn, đi tới "Cài đặt" -> "Giới thiệu về điện thoại" -> "Phiên bản Android" và ghi lại giá trị "Số bản dựng" của bạn. Của tôi là QQ3A.200805.001.
  2. Tìm hiểu Thẻ tương ứng với Số bản dựng của bạn bằng cách sử dụng trang này: https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds. Đối với số bản dựng của tôi, thẻ là: android-10.0.0_r41
  3. Tìm tệp bạn cần trên https://android.googlesource.com. Sử dụng google.com, tôi tìm thấy nó tại:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java
  4. Xác định repo Android mà tệp của bạn đang sử dụng. Nhìn vào URL trước đó, tôi có thể suy ra nó ở: https://android.googlesource.com/platform/frameworks/base/
  5. Lấy repo đó bằng thẻ của bạn. Hoặc lấy trực tuyến bản sửa đổi gần đây nhất của thẻ đó của tệp riêng lẻ đó, ví dụ:https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java, bản sửa đổi 18c0fbf.
    • Để tải xuống từng tệp, hãy thêm "? Format = text" vào URL để nhận phiên bản được mã hóa base64. Sau đó giải mã nó: cat file | base64 --decode.
  6. Bây giờ bạn có tệp. Chuyển đến thư mục SDK của bạn có chứa tệp lỗi: cd ~ / Library / Android / sdk / sources / android-29 / android / view /
  7. Sao lưu tệp cũ (cp -pr View.java View.java.orig) nếu bạn muốn (bạn luôn có thể cài đặt lại các tệp nguồn SDK nếu bạn làm hỏng). Sao chép tệp mới của bạn vào cùng một vị trí.
  8. Bây giờ, trình gỡ lỗi của bạn sẽ sử dụng đúng tệp! Bạn sẽ phải làm điều này cho từng tệp mà trình gỡ lỗi của bạn phàn nàn.

Tôi hy vọng điều này sẽ giúp ai đó khác trong tương lai. Tôi đã dành rất nhiều thời gian để tìm ra điều này và tôi thực lòng hy vọng ai đó sẽ không phải lãng phí thời gian đó. Google cần giữ cho các gói nguồn nhất quán với các gói phát hành. Xem xét tất cả các bản phát hành SDK trước đây, không có gói nguồn nào có vẻ đồng bộ với phiên bản phát hành mới nhất. Có thể một cách xấu xí khác để gỡ lỗi tệp SDK là sử dụng phiên bản phát hành SDK phiên bản 1 phù hợp với gói nguồn Phiên bản số 1.