Android 11 ได้เปิดตัวเครื่องมือใหม่สำหรับนักพัฒนาแอปเพื่อทดสอบและแก้ไขข้อบกพร่องของแอปจากการเปลี่ยนแปลงลักษณะการทำงานในแพลตฟอร์ม Android เวอร์ชันใหม่ เครื่องมือเหล่านี้เป็นส่วนหนึ่งของเฟรมเวิร์กความเข้ากันได้ที่ช่วยให้นักพัฒนาแอปเปิดและปิดการเปลี่ยนแปลงทีละรายการโดยใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์หรือ ADB ใช้ความยืดหยุ่นนี้เมื่อคุณเตรียมกำหนดเป้าหมายเป็น API เวอร์ชันล่าสุดที่เสถียรและเมื่อทดสอบแอปด้วยรุ่นตัวอย่างของ Android เวอร์ชันถัดไป
เมื่อคุณใช้เครื่องมือเฟรมเวิร์กความเข้ากันได้ แพลตฟอร์ม Android จะปรับตรรกะภายในโดยอัตโนมัติ คุณจึงไม่ต้องเปลี่ยน targetSDKVersion
หรือคอมไพล์แอปอีกครั้งเพื่อทำการทดสอบขั้นพื้นฐาน เนื่องจากคุณสามารถเปิด/ปิดการเปลี่ยนแปลงแต่ละรายการได้ คุณจึงแยก ทดสอบ และแก้ไขข้อบกพร่องการเปลี่ยนแปลงลักษณะการทํางานทีละรายการ หรือปิดใช้การเปลี่ยนแปลงเดียวที่ทำให้เกิดปัญหาได้หากต้องการทดสอบสิ่งอื่นก่อน
วิธีระบุการเปลี่ยนแปลงที่เปิดใช้
เมื่อเปิดใช้การเปลี่ยนแปลงลักษณะการทำงาน การเปลี่ยนแปลงดังกล่าวอาจส่งผลต่อวิธีที่แอปเข้าถึง API ของแพลตฟอร์มที่ได้รับผลกระทบจากการเปลี่ยนแปลงนั้น คุณสามารถตรวจสอบว่าเปิดใช้การเปลี่ยนแปลงลักษณะการทำงานใดบ้างโดยใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์, logcat หรือคำสั่ง ADB
ระบุการเปลี่ยนแปลงที่เปิดใช้โดยใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์
คุณสามารถดูการเปลี่ยนแปลงที่เปิดใช้อยู่และเปิดหรือปิดการเปลี่ยนแปลงเหล่านั้นได้ในตัวเลือกสำหรับนักพัฒนาแอปของอุปกรณ์ หากต้องการเข้าถึงตัวเลือกเหล่านี้ ให้ทำตามขั้นตอนต่อไปนี้
- หากยังไม่ได้เปิดใช้ตัวเลือกสำหรับนักพัฒนาแอป ให้เปิดใช้
- เปิดแอปการตั้งค่าของอุปกรณ์ แล้วไปที่ระบบ > ขั้นสูง > ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ > การเปลี่ยนแปลงความเข้ากันได้ของแอป
เลือกแอปจากรายการ
การเปลี่ยนแปลงลักษณะการทำงานแต่ละรายการมักจะจัดอยู่ในหมวดหมู่ใดหมวดหมู่หนึ่งต่อไปนี้
การเปลี่ยนแปลงที่ส่งผลต่อแอปทั้งหมดที่ทำงานใน Android เวอร์ชันนั้น โดยไม่คำนึงถึง
targetSdkVersion
ของแอปการเปลี่ยนแปลงเหล่านี้จะเปิดใช้โดยค่าเริ่มต้นในเฟรมเวิร์กความเข้ากันได้ และจะปรากฏใน UI ในส่วนการเปลี่ยนแปลงที่เปิดใช้โดยค่าเริ่มต้น
การเปลี่ยนแปลงที่ส่งผลต่อแอปที่กำหนดเป้าหมายเป็น Android บางเวอร์ชันเท่านั้น เนื่องจากการเปลี่ยนแปลงเหล่านี้มีผลกับแอปที่กำหนดเป้าหมายเป็น Android เวอร์ชันที่เจาะจงเท่านั้น จึงเรียกการเปลี่ยนแปลงเหล่านี้ว่าการเปลี่ยนแปลงที่จำกัดโดย
targetSDKVersion
ระบบจะเปิดใช้การเปลี่ยนแปลงเหล่านี้โดยค่าเริ่มต้นในเฟรมเวิร์กความเข้ากันได้ หากแอปกำหนดเป้าหมายเป็นเวอร์ชันที่สูงกว่าเวอร์ชัน API ที่ระบุไว้ ตัวอย่างเช่น การเปลี่ยนแปลงลักษณะการทำงานที่จำกัดโดย
targetSDKVersion
ใน Android 13 (API ระดับ 33) จะแสดงใน UI ในส่วนที่มีชื่อว่าเปิดใช้สำหรับ targetSdkVersion >=33 ใน Android เวอร์ชันที่ต่ำกว่าบางเวอร์ชัน ส่วนนี้จะชื่อว่า "เปิดใช้หลัง SDK API_LEVEL" แทน
นอกจากนี้ คุณจะเห็นส่วนในรูปที่ 1 ชื่อว่าการเปลี่ยนแปลงที่ปิดใช้โดยค่าเริ่มต้น การเปลี่ยนแปลงที่ตรงกับส่วนนี้อาจมีวัตถุประสงค์ที่หลากหลาย ก่อนเปิดใช้การเปลี่ยนแปลงเหล่านี้ โปรดอ่านคำอธิบายการเปลี่ยนแปลงในรายการเฟรมเวิร์กความเข้ากันได้สำหรับ Android เวอร์ชันนั้น
ระบุการเปลี่ยนแปลงที่เปิดใช้โดยใช้ Logcat
สําหรับการเปลี่ยนแปลงลักษณะการทํางานแต่ละรายการ ระบบจะแสดงข้อความ logcat ดังต่อไปนี้เป็นครั้งแรกในระหว่างกระบวนการของแอปเมื่อแอปเรียก API ที่ได้รับผลกระทบ
D CompatibilityChangeReporter: Compat change id reported: 194833441; UID 10265; state: ENABLED
ข้อความ Logcat แต่ละข้อความจะมีข้อมูลต่อไปนี้
- เปลี่ยนรหัส
- ระบุว่าการเปลี่ยนแปลงใดส่งผลต่อแอป ค่านี้จะแมปกับการเปลี่ยนแปลงลักษณะการทำงานอย่างใดอย่างหนึ่งที่แสดงอยู่ในหน้าจอการเปลี่ยนแปลงความเข้ากันได้ของแอป (ดูรูปที่ 1) ในตัวอย่างนี้
194833441
แมปกับNOTIFICATION_PERM_CHANGE_ID
- UID
- ระบุว่าแอปใดได้รับผลกระทบจากการเปลี่ยนแปลง
- รัฐ
ระบุว่าการเปลี่ยนแปลงส่งผลต่อแอปหรือไม่
สถานะอาจเป็นค่าใดค่าหนึ่งต่อไปนี้
รัฐ ความหมาย ENABLED
ระบบจะเปิดใช้การเปลี่ยนแปลงและการเปลี่ยนแปลงจะส่งผลต่อลักษณะการทํางานของแอปหากแอปใช้ API ที่เปลี่ยนแปลง DISABLED
การเปลี่ยนแปลงจะถูกปิดใช้และจะไม่ส่งผลต่อแอป
หมายเหตุ: หากปิดใช้การเปลี่ยนแปลงนี้เนื่องจาก
targetSDKVersion
ของแอปต่ำกว่าเกณฑ์ที่กำหนด ระบบจะเปิดใช้การเปลี่ยนแปลงโดยค่าเริ่มต้นเมื่อแอปเพิ่มtargetSDKVersion
เพื่อกำหนดเป้าหมายเป็นเวอร์ชันที่สูงขึ้นLOGGED
ระบบบันทึกการเปลี่ยนแปลงผ่านเฟรมเวิร์กความเข้ากันได้ แต่จะเปิดหรือปิด ไม่ได้ แม้ว่าการเปลี่ยนแปลงนี้จะเปิด/ปิดไม่ได้ แต่ก็อาจส่งผลต่อลักษณะการทำงานของแอปได้ โปรดดูข้อมูลเพิ่มเติมในส่วนคำอธิบายของการเปลี่ยนแปลงในรายการเฟรมเวิร์กความเข้ากันได้สำหรับ Android เวอร์ชันนั้น ในหลายกรณี การเปลี่ยนแปลงประเภทเหล่านี้เป็นการทดลองและสามารถละเว้นได้
ระบุการเปลี่ยนแปลงที่เปิดใช้โดยใช้ ADB
เรียกใช้คำสั่ง ADB ต่อไปนี้เพื่อดูชุดการเปลี่ยนแปลงทั้งหมด (ทั้งที่เปิดใช้และปิดใช้) ในอุปกรณ์ทั้งหมด
adb shell dumpsys platform_compat
เอาต์พุตจะแสดงข้อมูลต่อไปนี้สําหรับการเปลี่ยนแปลงแต่ละรายการ
- เปลี่ยนรหัส
- ตัวระบุที่ไม่ซ้ำกันสำหรับการเปลี่ยนแปลงลักษณะการทํางานนี้ เช่น
194833441
- ชื่อ
- ชื่อของการเปลี่ยนแปลงลักษณะการทำงานนี้ เช่น
NOTIFICATION_PERM_CHANGE_ID
- เกณฑ์ targetSDKVersion
targetSDKVersion
ใดอยู่ในขอบเขตของการเปลี่ยนแปลง (หากมี)ตัวอย่างเช่น หากเปิดใช้การเปลี่ยนแปลงนี้สําหรับแอปที่กำหนดเป้าหมายเป็น SDK เวอร์ชัน 33 ขึ้นไปเท่านั้น ระบบจะแสดงผลลัพธ์เป็น
enableAfterTargetSdk=32
หากการเปลี่ยนแปลงไม่ได้รับการจัดการโดยtargetSDKVersion
ระบบจะแสดงผลenableAfterTargetSdk=0
- การลบล้างแพ็กเกจ
ชื่อของแพ็กเกจแต่ละรายการที่มีการลบล้างสถานะเริ่มต้นของการเปลี่ยนแปลง (เปิดหรือปิดใช้)
ตัวอย่างเช่น หากการเปลี่ยนแปลงนี้เปิดใช้โดยค่าเริ่มต้น ชื่อแพ็กเกจของแอปจะแสดงขึ้นหากคุณปิดการเปลี่ยนแปลงโดยใช้ตัวเลือกสำหรับนักพัฒนาแอปหรือ ADB ในกรณีนี้ เอาต์พุตจะเป็น
packageOverrides={com.my.package=false}
การเปลี่ยนแปลงที่มีการควบคุมโดย
targetSDKVersion
สามารถเปิดหรือปิดใช้โดยค่าเริ่มต้นได้ ดังนั้นรายการแพ็กเกจจึงอาจมีทั้งอินสแตนซ์ของtrue
หรือfalse
ทั้งนี้ขึ้นอยู่กับtargetSDKVersion
ของแอปแต่ละแอป เช่นpackageOverrides={com.my.package=true, com.another.package=false}
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงที่เฉพาะเจาะจง
รายการการเปลี่ยนแปลงลักษณะการทำงานทั้งหมดในเฟรมเวิร์กความเข้ากันได้จะรวมอยู่ในเอกสารประกอบสำหรับ Android แต่ละเวอร์ชัน ดูข้อมูลเพิ่มเติมได้จากลิงก์ต่อไปนี้ โดยขึ้นอยู่กับเวอร์ชัน Android ที่คุณทดสอบแอป
- Android 15 (API ระดับ 35)
- Android 14 (API ระดับ 34)
- Android 13 (API ระดับ 33)
- Android 12 (API ระดับ 31 และ 32)
- Android 11 (API ระดับ 30)
กรณีที่ควรสลับการเปลี่ยนแปลง
วัตถุประสงค์หลักของเฟรมเวิร์กความเข้ากันได้คือเพื่อให้คุณควบคุมและมีความยืดหยุ่นเมื่อทดสอบแอปกับ Android เวอร์ชันใหม่ ส่วนนี้จะอธิบายกลยุทธ์บางอย่างที่คุณสามารถใช้เพื่อกำหนดเวลาเปิดหรือปิดการเปลี่ยนแปลงขณะทดสอบและแก้ไขข้อบกพร่องของแอป
กรณีที่ควรปิดการเปลี่ยนแปลง
การพิจารณาว่าจะปิดการเปลี่ยนแปลงเมื่อใดนั้นมักจะขึ้นอยู่กับว่า targetSDKVersion
ควบคุมการเปลี่ยนแปลงหรือไม่
- การเปลี่ยนแปลงที่เปิดใช้สำหรับแอปทั้งหมด
การเปลี่ยนแปลงที่ส่งผลต่อแอปทั้งหมดจะเปิดใช้โดยค่าเริ่มต้นสำหรับแพลตฟอร์มเวอร์ชันหนึ่งๆ โดยไม่คำนึงถึง
targetSDKVersion
ของแอป คุณจึงดูได้ว่าแอปได้รับผลกระทบจากการเรียกใช้แอปบนแพลตฟอร์มเวอร์ชันดังกล่าวหรือไม่ตัวอย่างเช่น หากกำลังเตรียมกำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) คุณอาจเริ่มต้นด้วยการติดตั้งแอปในอุปกรณ์ที่ใช้ Android 15 และทดสอบแอปโดยใช้เวิร์กโฟลว์การทดสอบทั่วไป ถ้าแอปพบปัญหา คุณสามารถปิดการเปลี่ยนแปลงที่ทำให้เกิดปัญหาเพื่อทดสอบปัญหาอื่นๆ ต่อไปได้
เนื่องจากการเปลี่ยนแปลงเหล่านี้อาจส่งผลต่อแอปทั้งหมดโดยไม่คำนึงถึง
targetSDKVersion
คุณจึงควรทดสอบและอัปเดตแอปสำหรับการเปลี่ยนแปลงเหล่านี้ก่อนการเปลี่ยนแปลงที่ควบคุมโดยtargetSDKVersion
วิธีนี้ช่วยให้มั่นใจได้ว่าผู้ใช้จะไม่พบประสบการณ์การใช้งานแอปที่ลดลงเมื่ออัปเดตอุปกรณ์เป็นแพลตฟอร์มเวอร์ชันใหม่นอกจากนี้ คุณควรให้ความสำคัญกับการทดสอบการเปลี่ยนแปลงเหล่านี้ด้วย เนื่องจากคุณไม่สามารถปิดการเปลี่ยนแปลงเหล่านี้ได้เมื่อใช้บิลด์รุ่นที่เผยแพร่แบบสาธารณะของ Android โดยหลักการแล้ว คุณควรทดสอบการเปลี่ยนแปลงเหล่านี้สำหรับ Android แต่ละเวอร์ชันขณะที่เวอร์ชันนั้นอยู่ในรุ่นตัวอย่าง
- การเปลี่ยนแปลงถูกกำหนดด้วย
targetSDKVersion
หากแอปกําหนดเป้าหมายเป็น
targetSDKVersion
ที่เจาะจง ระบบจะเปิดใช้การเปลี่ยนแปลงทั้งหมดที่กําหนดโดยเวอร์ชันนั้นโดยค่าเริ่มต้น ดังนั้นเมื่อคุณเปลี่ยนtargetSDKVersion
ของแอปเป็นเวอร์ชันใหม่ แอปของคุณจะเริ่มได้รับผลกระทบจากการเปลี่ยนแปลงใหม่ๆ หลายรายการพร้อมกันเนื่องจากแอปอาจได้รับผลกระทบจากการเปลี่ยนแปลงเหล่านี้มากกว่า 1 รายการ คุณจึงอาจต้องปิดการเปลี่ยนแปลงเหล่านี้ทีละรายการขณะทดสอบและแก้ไขข้อบกพร่องของแอป
กรณีที่ควรเปิดใช้การเปลี่ยนแปลง
ระบบจะปิดใช้การเปลี่ยนแปลงที่มีการกำหนดค่า targetSDKVersion
ที่เจาะจงไว้โดยค่าเริ่มต้นเมื่อแอปกำหนดเป้าหมายเป็น SDK เวอร์ชันต่ำกว่าเวอร์ชันที่มีการกำหนดค่า
โดยทั่วไปแล้ว เมื่อเตรียมกำหนดเป้าหมาย targetSdkVersion
ใหม่ คุณจะมีรายการการเปลี่ยนแปลงลักษณะการทำงานที่ต้องทดสอบและแก้ไขข้อบกพร่องของแอป
เช่น คุณอาจทดสอบแอปกับการเปลี่ยนแปลงแพลตฟอร์มชุดหนึ่งใน targetSdkVersion
ถัดไป เมื่อใช้ตัวเลือกสำหรับนักพัฒนาแอปหรือคําสั่ง ADB คุณจะเปิดใช้และทดสอบการเปลี่ยนแปลงที่มีการกำหนดสิทธิ์แต่ละรายการทีละรายการได้ แทนที่จะเปลี่ยนไฟล์ Manifest ของแอปและเลือกใช้การเปลี่ยนแปลงทั้งหมดพร้อมกัน การควบคุมเพิ่มเติมนี้จะช่วยให้คุณทดสอบการเปลี่ยนแปลงแบบแยกส่วนและหลีกเลี่ยงการแก้ไขข้อบกพร่องและการอัปเดตหลายส่วนของแอปพร้อมกันได้
หลังจากเปิดใช้การเปลี่ยนแปลงแล้ว คุณจะทดสอบและแก้ไขข้อบกพร่องของแอปได้โดยใช้เวิร์กโฟลว์การทดสอบตามปกติ หากพบปัญหา ให้ตรวจสอบบันทึกเพื่อช่วยระบุสาเหตุของปัญหา หากไม่แน่ใจว่าปัญหาเกิดจากการเปลี่ยนแปลงแพลตฟอร์มที่เปิดใช้หรือไม่ ให้ลองปิดใช้การเปลี่ยนแปลงนั้นแล้วทดสอบส่วนนั้นของแอปอีกครั้ง
สลับการเปลี่ยนแปลงเป็นเปิดหรือปิด
เฟรมเวิร์กความเข้ากันได้ช่วยให้คุณเปิดหรือปิดการเปลี่ยนแปลงแต่ละรายการได้โดยใช้ตัวเลือกสำหรับนักพัฒนาแอปหรือคำสั่ง ADB เนื่องจากการเปิดหรือปิดการเปลี่ยนแปลงอาจทำให้แอปขัดข้องหรือปิดใช้การเปลี่ยนแปลงด้านความปลอดภัยที่สำคัญ จึงมีข้อจำกัดบางอย่างในการเปิดหรือปิดการเปลี่ยนแปลง
สลับการเปลี่ยนแปลงโดยใช้ตัวเลือกสำหรับนักพัฒนาแอป
ใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์เพื่อเปิดหรือปิดการเปลี่ยนแปลง หากต้องการค้นหาตัวเลือก สำหรับนักพัฒนาซอฟต์แวร์ ให้ทำตามขั้นตอนต่อไปนี้
- หากยังไม่ได้เปิดใช้ตัวเลือกสำหรับนักพัฒนาแอป ให้เปิดใช้
- เปิดแอปการตั้งค่าของอุปกรณ์ แล้วไปที่ระบบ > ขั้นสูง > ตัวเลือกสำหรับนักพัฒนาแอป > การเปลี่ยนแปลงความเข้ากันได้ของแอป
- เลือกแอปจากรายการ
จากรายการการเปลี่ยนแปลง ให้ค้นหาการเปลี่ยนแปลงที่ต้องการเปิดหรือปิด แล้วแตะสวิตช์
สลับการเปลี่ยนแปลงโดยใช้ ADB
หากต้องการเปิดหรือปิดการเปลี่ยนแปลงโดยใช้ ADB ให้เรียกใช้คำสั่งใดคำสั่งหนึ่งต่อไปนี้
adb shell am compat enable (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME
adb shell am compat disable (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME
ส่ง CHANGE_ID
(เช่น 194833441
) หรือ CHANGE_NAME
(เช่น NOTIFICATION_PERM_CHANGE_ID
) และ PACKAGE_NAME
ของแอป
นอกจากนี้ คุณยังใช้คำสั่งต่อไปนี้เพื่อรีเซ็ตการเปลี่ยนแปลงกลับเป็นสถานะเริ่มต้นได้ ซึ่งจะนำการลบล้างที่คุณตั้งค่าไว้โดยใช้ ADB หรือตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ออก
adb shell am compat reset (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME
ข้อจํากัดในการสลับการเปลี่ยนแปลง
โดยค่าเริ่มต้น การเปลี่ยนแปลงลักษณะการทำงานแต่ละครั้งจะเปิดใช้หรือปิดใช้ก็ได้ การเปลี่ยนแปลงที่ส่งผลต่อแอปทั้งหมดจะเปิดใช้โดยค่าเริ่มต้น การเปลี่ยนแปลงอื่นๆ จะกำหนดโดย
targetSdkVersion
ระบบจะเปิดใช้การเปลี่ยนแปลงเหล่านี้โดยค่าเริ่มต้นเมื่อแอปกำหนดเป้าหมายเป็น SDK เวอร์ชันที่เกี่ยวข้องหรือสูงกว่า และจะปิดใช้โดยค่าเริ่มต้นเมื่อแอปกำหนดเป้าหมายเป็น SDK เวอร์ชันต่ำกว่าเวอร์ชันที่มีการกำหนด เมื่อเปิดหรือปิดการเปลี่ยนแปลง จะเป็นการลบล้างสถานะเริ่มต้นของการเปลี่ยนแปลงนั้น
เพื่อป้องกันไม่ให้มีการใช้เฟรมเวิร์กความเข้ากันได้ในทางที่มุ่งร้าย ระบบจึงมีข้อจำกัดบางอย่างเกี่ยวกับเวลาที่คุณสามารถสลับการเปลี่ยนแปลงได้ คุณจะเปิด/ปิดการเปลี่ยนแปลงได้หรือไม่นั้นขึ้นอยู่กับประเภทของการเปลี่ยนแปลง การที่แอปแก้ไขข้อบกพร่องได้ และประเภทของบิลด์ที่ทำงานในอุปกรณ์ ตารางต่อไปนี้อธิบายกรณีที่คุณได้รับอนุญาตให้สลับการเปลี่ยนแปลงประเภทต่างๆ
ประเภทบิวด์ | แอปที่แก้ไขข้อบกพร่องไม่ได้ | แอปที่แก้ไขข้อบกพร่องได้ | |
---|---|---|---|
การเปลี่ยนแปลงทั้งหมด | การเปลี่ยนแปลงที่มีการกำหนดสิทธิ์โดย targetSDKVersion | การเปลี่ยนแปลงอื่นๆ ทั้งหมด | |
เวอร์ชันตัวอย่างสำหรับนักพัฒนาซอฟต์แวร์หรือรุ่นเบต้า | เปิด/ปิดไม่ได้ | เปิด/ปิดได้ | เปิด/ปิดได้ |
บิลด์ผู้ใช้สาธารณะ | เปิด/ปิดไม่ได้ | สามารถสลับได้ | เปิด/ปิดไม่ได้ |