แก้ไขข้อบกพร่องของโค้ดแพลตฟอร์ม

Android Studio for Platform (ASfP) ผสานรวมการแก้ไขข้อบกพร่องของแพลตฟอร์มหลายภาษา ไว้ในแท็บแนบในหน้าต่างเครื่องมือแก้ไขข้อบกพร่อง

  • เลือกเรียกใช้ > แนบกับกระบวนการ Android (Control+Alt+A) เพื่อแนบ โปรแกรมแก้ไขข้อบกพร่องของ Java, โปรแกรมแก้ไขข้อบกพร่องแบบเนทีฟ (LLDB แบบรวม) หรือทั้ง 2 อย่างกับแอปหรือกระบวนการของระบบที่ กำลังทำงานในอุปกรณ์จริงหรืออุปกรณ์เสมือน Cuttlefish
  • ตรวจสอบไลบรารีที่ใช้ร่วมกันที่โหลดแต่ละรายการ (.so) และ ELF Build ID แบบ 8 อักขระในแผงไลบรารีก่อนที่จะแนบ โดยมีไอคอนเครื่องหมายถูก เพื่อยืนยันสัญลักษณ์การแก้ไขข้อบกพร่องในเครื่องที่ตรงกันภายใต้ out/target/product/<device>/symbols
  • จัดการข้อกำหนดเบื้องต้นของอุปกรณ์จากแถบเครื่องมือโดยกรองด้วยแสดงกระบวนการของระบบ คลิกอุปกรณ์ที่รูทเพื่อเรียกใช้ adb root (แสดงอุปกรณ์ รูทแล้วเมื่อใช้งานอยู่) และคลิกเปิดใช้ JDWP เพื่อเปิดใช้ JDWP ในบิลด์ userdebug
  • ตั้งค่าจุดพักตามเงื่อนไขและข้อยกเว้น ดูค่าตัวแปรแบบอินไลน์ใน เอดิเตอร์ ใช้ทิ้งเฟรมและก้าวเข้าไปอัจฉริยะ รวมถึงตรวจสอบ ประเภท C++ และ Rust ที่มีโครงสร้างขณะรันไทม์

ก่อนใช้ดีบักเกอร์ ให้สร้างlunchเป้าหมายout/target/product/<device>/symbols/.build-idเพื่อให้มีดัชนีสัญลักษณ์ในเครื่อง และแฟลช หรือเปิดใช้รูปภาพอุปกรณ์ที่ตรงกัน

การแก้ไขข้อบกพร่องของ Java และการแก้ไขข้อบกพร่องแบบคู่ของ Java และโค้ดเนทีฟ

หากต้องการแก้ไขข้อบกพร่องของแอปพลิเคชัน Java หรือ Kotlin, แอประบบ (เช่น com.android.messaging, การตั้งค่า หรือ SystemUI) หรือกระบวนการที่เรียกใช้ JNI และโค้ด C++ หรือ Rust ให้ทำตามขั้นตอนต่อไปนี้

  1. ตั้งค่าเบรกพอยต์ในไฟล์ต้นฉบับ Java, Kotlin, C, C++ หรือ Rust
  2. เลือกเรียกใช้ > แนบกับกระบวนการ Android (Control+Alt+A) ASfP จะเปิดแท็บแนบที่ปักหมุดไว้ภายในหน้าต่างเครื่องมือแก้ไขข้อบกพร่อง
  3. เลือกอุปกรณ์เป้าหมายจากเมนูแบบเลื่อนลงของอุปกรณ์ หากไม่ได้เปิดใช้ JDWP ในบิลด์ userdebug ให้คลิกเปิดใช้ JDWP—ASfP จะตั้งค่า persist.debug.dalvik.vm.jdwp.enabled=1 และรีบูตอุปกรณ์ เมื่อ ใช้งานอยู่ ปุ่มจะแสดงเปิดใช้ JDWP แล้วพร้อมการดำเนินการคลิกขวาปิดใช้ JDWP
  4. เลือกกระบวนการเป้าหมายจากตาราง (กระบวนการ Java และ ART จะแสดงไอคอน ถ้วยกาแฟ)
  5. ที่ด้านล่างของแท็บแนบ ให้เลือกโปรแกรมแก้ไขข้อบกพร่องของ Java, โปรแกรมแก้ไขข้อบกพร่อง แบบเนทีฟ หรือทั้ง 2 อย่าง การเลือกทั้ง 2 ตัวเลือกจะเปิดแท็บที่ลิงก์ 2 แท็บในหน้าต่างเครื่องมือแก้ไขข้อบกพร่อง โดย <process> (<pid>) จะเป็น LLDB ในตัว และ <process> (<pid>)-jdwp จะเป็น Java วงจรของทั้ง 2 เซสชันเชื่อมโยงกัน ดังนั้นการหยุดเซสชันใดเซสชันหนึ่งจะทำให้ทั้ง 2 เซสชันหยุดทำงาน
  6. คลิกแนบและโต้ตอบกับแอปในอุปกรณ์เพื่อเข้าถึง เบรกพอยต์

แท็บการแก้ไขข้อบกพร่องของ Java และเนทีฟแบบคู่ที่ลิงก์ไว้ข้างแท็บแนบ

การแก้ไขข้อบกพร่องของกระบวนการของระบบ (C และ C++) และการยืนยันสัญลักษณ์

หากต้องการแก้ไขข้อบกพร่องของ Daemon ของระบบ, HAL หรือบริการของระบบ (เช่น android.hardware.bluetooth-service.cuttlefish, surfaceflinger หรือ audioserver) ให้ทำตามขั้นตอนต่อไปนี้

  1. เปิดเรียกใช้ > แนบกับกระบวนการ Android (Control+Alt+A) หากแถบเครื่องมือแสดงอุปกรณ์ที่รูท ให้คลิกเพื่อเรียกใช้ ASfP adb root และแสดงอุปกรณ์ที่รูทแล้ว
  2. เลือกแสดงกระบวนการของระบบในแถบเครื่องมือด้านบน แล้วกรองกระบวนการเป้าหมาย
  3. ยืนยันสัญลักษณ์การแก้ไขข้อบกพร่องในเครื่องในแผงไลบรารี: การเลือกกระบวนการจะ ป้อนข้อมูลลงในตารางไลบรารีด้วยไลบรารีที่ใช้ร่วมกัน ELF ทั้งหมด (.so) ที่โหลดในกระบวนการและอักขระฐานสิบหก 8 ตัวแรกของBuild ID ของ ELF ASfP จะจับคู่ Build ID แต่ละรายการกับ out/target/product/<device>/symbols (ต้องใช้ symbols/.build-id เพื่อ แก้ไขไลบรารีภายใน APEX):
    • ไลบรารีที่ยืนยันแล้วจะแสดงไอคอนเครื่องหมายถูก ชี้ไปที่แถวที่แก้ไขแล้ว เพื่อดูตัวอย่างเส้นทางสัญลักษณ์ .debug แบบเต็มในเครื่อง
    • ไลบรารีที่ยังไม่ได้รับการแก้ไขซึ่งไม่มีสัญลักษณ์ในเครื่องที่ตรงกันจะแสดงไอคอนคำเตือน
  4. การตรวจหาโปรเซสที่ไม่ใช่ Java: เมื่อคุณเลือกโปรเซส C++ หรือ Rust (ทำเครื่องหมายด้วยไอคอนหกเหลี่ยม C) ASfP จะซ่อนดีบักเกอร์ Java และแสดง การแก้ไขข้อบกพร่องของ Java ไม่พร้อมใช้งาน ไม่ใช่โปรเซส Java ขณะที่เลือกดีบักเกอร์แบบเนทีฟไว้
  5. ตั้งค่าจุดพักในไฟล์ต้นฉบับ C, C++ หรือ Rust คลิกแนบ แล้ว ทริกเกอร์เส้นทางโค้ดในอุปกรณ์

แนบแท็บที่แสดงตารางไลบรารี, รหัสบิลด์ ELF และเครื่องหมายถูกของการตรวจสอบสัญลักษณ์ในเครื่อง

แก้ไขข้อบกพร่องของโค้ด Rust

ASfP แก้ข้อบกพร่องโค้ดแพลตฟอร์ม Rust ด้วยโปรแกรมแก้ไขข้อบกพร่อง LLDB ในตัวเดียวกันที่ใช้สำหรับ C และ C++ ไม่จำเป็นต้องใช้อะแดปเตอร์ภายนอกหรือการตั้งค่าเซิร์ฟเวอร์ด้วยตนเอง: ASfP ใช้lldb-dap จาก Toolchain ที่รวมไว้และโหลดตัวพิมพ์ที่อ่านง่ายของ Rust จาก AOSP Prebuilt โดยอัตโนมัติเพื่อให้ประเภทมาตรฐาน เช่น String, Vec, HashMap และ Option แสดงค่าที่มีโครงสร้างในบานหน้าต่างตัวแปร

แนบกับกระบวนการ Rust ที่กำลังทำงานในอุปกรณ์

ทำตามขั้นตอนในกระบวนการของระบบ (การแก้ไขข้อบกพร่องของ C และ C++) ดังนี้ เปิดเรียกใช้ > แนบกับกระบวนการ Android ตรวจสอบว่าอุปกรณ์รูทแล้วและสัญลักษณ์ ในเครื่องแสดงเครื่องหมายถูกในแผงไลบรารี เลือกโปรแกรมแก้ไขข้อบกพร่องแบบเนทีฟ ไว้ แล้วคลิกแนบ สแตกเฟรมของ Rust และ C หรือ C++ จะปรากฏร่วมกันในเซสชันการแก้ไขข้อบกพร่องเดียวกัน

แก้ไขข้อบกพร่องของโมดูล rust_test หรือ rust_test_host

  1. เปิดไฟล์ Android.bp ที่ประกาศ rust_test หรือ rust_test_host เป้าหมาย แล้วคลิกไอคอนเรียกใช้ในกัตเตอร์ข้างประเภทโมดูล
  2. เลือกแก้ไขข้อบกพร่อง '<ModuleName>' ASfP จะสร้างเป้าหมาย เปิดใช้ไบนารีทดสอบ ภายใต้ LLDB ในเครื่องโฮสต์หรืออุปกรณ์ที่เชื่อมต่อ และหยุดชั่วคราวที่ เบรกพอยต์ Rust
  3. หากต้องการแก้ไขข้อบกพร่องของฟังก์ชันการทดสอบเดียวหรือปรับแต่งคำสั่งเริ่มต้นของ LLDB ให้เปิด เรียกใช้ > แก้ไขการกำหนดค่า เลือกการกำหนดค่า Soong Test ที่สร้างขึ้น แล้วตั้งค่าเมธอดหรือขยายตัวเลือกดีบักเกอร์ ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่า Soong Test ได้ที่ ทดสอบโค้ดแพลตฟอร์มด้วย atest

การแก้ไขข้อบกพร่องของโค้ดแพลตฟอร์ม Rust ด้วยเครื่องมือแสดงภาพตัวแปรที่มีโครงสร้างใน ASfP