เริ่มตั้งแต่ Android 9 (API ระดับ 28) แพลตฟอร์มจะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ที่แอปของคุณใช้ได้ ข้อจำกัดเหล่านี้จะมีผลเมื่อใดก็ตามที่แอปอ้างอิงอินเทอร์เฟซที่ไม่ใช่ SDK หรือพยายามรับแฮนเดิลโดยใช้รีเฟล็กชันหรือ JNI ข้อจำกัดเหล่านี้มีขึ้นเพื่อปรับปรุงประสบการณ์ของผู้ใช้และนักพัฒนาแอป รวมถึงลดความเสี่ยงที่ผู้ใช้จะพบปัญหาขัดข้องและนักพัฒนาแอปจะเปิดตัวแอปอย่างเร่งด่วน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตัดสินใจนี้ โปรดดูการปรับปรุงความเสถียรโดยการลดการใช้งานอินเทอร์เฟซที่ไม่ใช่ SDK
แยกความแตกต่างระหว่างอินเทอร์เฟซ SDK กับที่ไม่ใช่ SDK
โดยทั่วไปแล้ว อินเทอร์เฟซ SDK สาธารณะคืออินเทอร์เฟซที่พบในเอกสารประกอบของ Package Index เฟรมเวิร์ก Android การจัดการอินเทอร์เฟซที่ไม่ใช่ SDK คือรายละเอียดการติดตั้งใช้งานที่ API แยกออกไป ดังนั้นอินเทอร์เฟซเหล่านี้จึงอาจมีการเปลี่ยนแปลงโดยไม่ต้องแจ้งให้ทราบล่วงหน้า
แอปควรใช้เฉพาะส่วนที่อธิบายไว้อย่างเป็นทางการของคลาสใน SDK เพื่อหลีกเลี่ยงข้อขัดข้องและลักษณะการทำงานที่ไม่คาดคิด ซึ่งหมายความว่าคุณไม่ควรเข้าถึงเมธอดหรือฟิลด์ที่ไม่ได้แสดงใน SDK เมื่อโต้ตอบกับคลาสโดยใช้กลไกต่างๆ เช่น การสะท้อน
รายการ API ที่ไม่ใช่ SDK
อินเทอร์เฟซที่ไม่ใช่ SDK เพิ่มเติมจะถูกจํากัดใน Android แต่ละรุ่น เราทราบดีว่าข้อจำกัดเหล่านี้อาจส่งผลต่อเวิร์กโฟลว์การเผยแพร่ของคุณ และเราต้องการตรวจสอบว่าคุณมีเครื่องมือในการตรวจสอบการใช้งานอินเทอร์เฟซที่ไม่ใช่ SDK มีโอกาสในการแสดงความคิดเห็น และให้เวลาวางแผนและปรับเปลี่ยนนโยบายใหม่
อินเทอร์เฟซที่ไม่ใช่ SDK จะแบ่งออกเป็นรายการต่างๆ ที่ระบุระดับการจํากัดการใช้งาน โดยขึ้นอยู่กับระดับ API ที่กำหนดเป้าหมาย เพื่อลดผลกระทบจากการจํากัดที่ไม่ใช่ SDK กับเวิร์กโฟลว์การพัฒนา ตารางต่อไปนี้อธิบายรายการเหล่านี้แต่ละรายการ
รายการ | แท็กโค้ด | คำอธิบาย |
---|---|---|
รายการที่บล็อก |
|
อินเทอร์เฟซที่ไม่ใช่ SDK ที่คุณใช้ไม่ได้ ไม่ว่าระดับ API เป้าหมายของแอปจะเป็นอย่างไรก็ตาม หากแอปพยายามเข้าถึงอินเทอร์เฟซเหล่านี้ ระบบจะแสดงข้อผิดพลาด |
ถูกบล็อกแบบมีเงื่อนไข |
|
ตั้งแต่ Android 9 (API ระดับ 28) API แต่ละระดับจะมีอินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งถูกจำกัดเมื่อแอปกำหนดเป้าหมายระดับ API นั้น รายการเหล่านี้จะติดป้ายกำกับตามระดับ API สูงสุด ( หากแอปพยายามเข้าถึงอินเทอร์เฟซที่ถูกจำกัดสำหรับระดับ API เป้าหมาย ระบบจะทำงานเสมือนว่า API เป็นส่วนหนึ่งของรายการที่บล็อก |
ไม่รองรับ |
|
อินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งไม่จํากัดและแอปของคุณใช้ได้ อย่างไรก็ตาม โปรดทราบว่าอินเทอร์เฟซเหล่านี้ไม่รองรับและอาจมีการเปลี่ยนแปลงโดยไม่มีการแจ้งให้ทราบ โปรดรอรับการบล็อกอินเทอร์เฟซเหล่านี้อย่างมีเงื่อนไขสำหรับ Android เวอร์ชันต่อๆ ไปในรายการ max-target-x |
SDK |
|
อินเทอร์เฟซที่ใช้งานได้อย่างอิสระและตอนนี้ได้รับการรองรับแล้วโดยเป็นส่วนหนึ่งของดัชนีแพ็กเกจเฟรมเวิร์ก Android ที่เผยแพร่อย่างเป็นทางการ |
Test API |
|
อินเทอร์เฟซที่ใช้สำหรับการทดสอบระบบภายใน เช่น API ที่อำนวยความสะดวกในการทดสอบผ่านชุดเครื่องมือทดสอบความเข้ากันได้ (CTS) Test API ไม่ได้เป็นส่วนหนึ่งของ SDK ตั้งแต่ Android 11 (API ระดับ 30) เป็นต้นไป API การทดสอบจะรวมอยู่ในรายการที่บล็อก ดังนั้นแอปจึงไม่ได้รับอนุญาตให้ใช้ API ดังกล่าว ไม่ว่าระดับ API เป้าหมายของแอปจะเป็นอย่างไรก็ตาม ระบบไม่รองรับ API การทดสอบทั้งหมดและอาจมีการเปลี่ยนแปลงโดยไม่แจ้งให้ทราบล่วงหน้า ไม่ว่า API ของแพลตฟอร์มจะอยู่ในระดับใดก็ตาม |
แม้ว่าคุณจะใช้อินเทอร์เฟซบางอย่างที่ไม่ใช่ SDK ได้ (ขึ้นอยู่กับระดับ API เป้าหมายของแอป) การใช้เมธอดหรือช่องที่ไม่ใช่ SDK มีความเสี่ยงสูงเสมอที่จะทำให้แอปเสียหาย หากแอปใช้อินเทอร์เฟซที่ไม่ใช่ SDK คุณควรเริ่มวางแผนการย้ายข้อมูลไปยังอินเทอร์เฟซ SDK หรือทางเลือกอื่นๆ หากไม่พบทางเลือกในการใช้อินเทอร์เฟซที่ไม่ใช่ SDK สำหรับฟีเจอร์ในแอป คุณควรขอ API สาธารณะใหม่
ระบุรายการที่อินเทอร์เฟซอยู่
รายการอินเทอร์เฟซที่ไม่ใช่ SDK จะสร้างขึ้นเป็นส่วนหนึ่งของแพลตฟอร์ม ดูข้อมูลเกี่ยวกับ Android แต่ละรุ่นได้จากส่วนต่อไปนี้
Android 15
สำหรับ Android 15 (API ระดับ 35) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
ผลรวมตรวจสอบ SHA-256:
40134e205e58922a708c453726b279a296e6a1f34a988abd90cec0f3432ea5a9
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 15 ได้ที่การอัปเดตข้อจํากัดอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 15
Android 14
สำหรับ Android 14 (API ระดับ 34) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
ผลรวมตรวจสอบ SHA-256:
7e00db074cbe51c51ff4b411f7b48e98692951395c5c17d069c822cc1d0eae0f
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 14 ได้ที่การอัปเดตข้อจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 14
Android 13
สำหรับ Android 13 (API ระดับ 33) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
ผลรวมตรวจสอบ SHA-256:
233a277aa8ac475b6df61bffd95665d86aac6eb2ad187b90bf42a98f5f2a11a3
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 13 รวมถึง API สาธารณะทางเลือกที่แนะนําสําหรับ API ที่ถูกบล็อกแบบมีเงื่อนไขใน Android 13 ได้ที่การอัปเดตข้อจํากัดอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 13
Android 12
สำหรับ Android 12 (API ระดับ 31) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
ผลรวมตรวจสอบ SHA-256:
40674ff4291eb268f86561bf687e69dbd013df9ec9531a460404532a4ac9a761
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 12 รวมถึงทางเลือก API สาธารณะที่แนะนำสำหรับ API ที่ถูกบล็อกอย่างมีเงื่อนไขใน Android 12 ได้ที่การเปลี่ยนแปลงรายการสำหรับ Android 12
Android 11
สำหรับ Android 11 (API ระดับ 30) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
ผลรวมตรวจสอบ SHA-256:
a19d839f4f61dc9c94960ae977b2e0f3eb30f880ba1ffe5108e790010b477a56
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 11 รวมถึง API สาธารณะทางเลือกที่แนะนําสําหรับ API ที่ถูกบล็อกแบบมีเงื่อนไขใน Android 11 ได้ที่การเปลี่ยนแปลงรายการสําหรับ Android 11
Android 10
สำหรับ Android 10 (API ระดับ 29) คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
ผลรวมตรวจสอบ SHA-256:
f22a59c215e752777a114bd9b07b0b6b4aedfc8e49e6efca0f99681771c5bfeb
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 10 รวมถึงทางเลือก API สาธารณะที่แนะนำสำหรับ API ที่ถูกบล็อกแบบมีเงื่อนไขใน Android 10 ได้ที่การเปลี่ยนแปลงรายการสำหรับ Android 10
Android 9
สำหรับ Android 9 (API ระดับ 28) ไฟล์ข้อความต่อไปนี้มีรายการ API ที่ไม่ใช่ SDK ซึ่งไม่จํากัด (รายการที่อนุญาตบางส่วน)
hiddenapi-light-greylist.txt
รายการที่บล็อก (blacklist
) และรายการ API ที่ถูกบล็อกแบบมีเงื่อนไข (รายการสีเทาเข้ม) จะสร้างขึ้นเมื่อสร้าง
สร้างรายการจาก AOSP
เมื่อใช้ AOSP คุณสามารถสร้างไฟล์ hiddenapi-flags.csv
ที่มีอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง โดยให้ดาวน์โหลดซอร์สโค้ด AOSP แล้วเรียกใช้คำสั่งต่อไปนี้
m out/soong/hiddenapi/hiddenapi-flags.csv
จากนั้นคุณจะค้นหาไฟล์ได้ในตำแหน่งต่อไปนี้
out/soong/hiddenapi/hiddenapi-flags.csv
ลักษณะการทำงานที่คาดไว้เมื่อเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งถูกจํากัด
ตารางต่อไปนี้อธิบายลักษณะการทํางานที่จะเกิดขึ้นหากแอปพยายามเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ซึ่งเป็นส่วนหนึ่งของรายการที่บล็อก
วิธีเข้าถึง | ผลลัพธ์ |
---|---|
คำสั่ง Dalvik ที่อ้างอิงถึงฟิลด์ | NoSuchFieldError โยน |
คำสั่ง Dalvik ที่อ้างอิงเมธอด | NoSuchMethodError โยน |
การสะท้อนโดยใช้ Class.getDeclaredField() หรือ Class.getField() |
NoSuchFieldException ขว้างลูกแล้ว |
เงาสะท้อนโดยใช้ Class.getDeclaredMethod() Class.getMethod() |
NoSuchMethodException ขว้างลูกแล้ว |
การสะท้อนโดยใช้ Class.getDeclaredFields() , Class.getFields() |
สมาชิกที่ไม่ใช่ SDK จะไม่แสดงในผลการค้นหา |
เงาสะท้อนโดยใช้ Class.getDeclaredMethods() Class.getMethods() |
สมาชิกที่ไม่ใช่ SDK จะไม่แสดงในผลการค้นหา |
JNI โดยใช้ env->GetFieldID() |
ส่งคืนแล้ว NULL , โยนได้ NoSuchFieldError |
JNI โดยใช้ env->GetMethodID() |
NULL แสดงผลแล้ว NoSuchMethodError แสดงข้อผิดพลาด |
ทดสอบแอปสำหรับอินเทอร์เฟซที่ไม่ใช่ SDK
มีหลายวิธีที่คุณสามารถใช้เพื่อทดสอบอินเทอร์เฟซที่ไม่ใช่ SDK ในแอป
ทดสอบโดยใช้แอปที่แก้ไขข้อบกพร่องได้
คุณสามารถทดสอบอินเทอร์เฟซที่ไม่ใช่ SDK ได้โดยการสร้างและเรียกใช้แอปที่แก้ไขข้อบกพร่องได้ในอุปกรณ์หรือโปรแกรมจำลองที่ใช้ Android 9 (API ระดับ 28) ขึ้นไป ตรวจสอบว่าอุปกรณ์หรือโปรแกรมจำลองที่คุณใช้ตรงกับระดับ API เป้าหมายของแอป
ขณะทำการทดสอบในแอป ระบบจะส่งข้อความบันทึกหากแอปเข้าถึงอินเทอร์เฟซบางรายการที่ไม่ใช่ SDK คุณสามารถตรวจสอบข้อความบันทึกของแอป เพื่อดูรายละเอียดต่อไปนี้
- คลาส ชื่อ และประเภทที่ประกาศ (ในรูปแบบที่รันไทม์ Android ใช้)
- วิธีเข้าถึง: การลิงก์ การใช้การสะท้อนกลับ หรือการใช้ JNI
- รายการใดเป็นของอินเทอร์เฟซที่ไม่ใช่ SDK
คุณสามารถใช้ adb logcat
เพื่อเข้าถึงข้อความบันทึกเหล่านี้ ซึ่งจะปรากฏใต้ PID ของแอปที่ทำงานอยู่ เช่น รายการในบันทึกอาจมีลักษณะดังนี้
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
ทดสอบโดยใช้ StrictMode API
นอกจากนี้ คุณยังทดสอบอินเทอร์เฟซที่ไม่ใช่ SDK โดยใช้ StrictMode
API ได้ด้วย ใช้เมธอด detectNonSdkApiUsage
เพื่อเปิดใช้ หลังจากเปิดใช้ StrictMode
API แล้ว คุณจะได้รับการเรียกกลับสําหรับการใช้งานอินเทอร์เฟซที่ไม่ใช่ SDK แต่ละครั้งโดยใช้ penaltyListener
ซึ่งคุณสามารถใช้การจัดการที่กําหนดเองได้ ออบเจ็กต์ Violation
ที่ระบุในคอลแบ็กมาจาก Throwable
และสแต็กเทรซที่แนบมาจะให้บริบทของการใช้งาน
ทดสอบโดยใช้เครื่องมือ Veridex
นอกจากนี้ คุณยังเรียกใช้เครื่องมือการวิเคราะห์แบบคงที่ของ Veridex ใน APK ได้ด้วย เครื่องมือ veridex จะสแกนฐานของโค้ดทั้งหมดของ APK รวมถึงไลบรารีของบุคคลที่สาม และรายงานการใช้อินเทอร์เฟซที่ไม่ใช่ SDK ที่พบ
ข้อจำกัดของเครื่องมือ veridex มีดังนี้
- ไม่สามารถตรวจหาการเรียกผ่าน JNI
- โดยจะตรวจจับได้เฉพาะการเรียกใช้บางส่วนผ่านการสะท้อนเท่านั้น
- การวิเคราะห์เส้นทางโค้ดที่ไม่ทำงานจะจำกัดอยู่ที่การตรวจสอบระดับ API
- โดยจะเรียกใช้ได้เฉพาะบนเครื่องที่รองรับคำสั่ง SSE4.2 และ POPCNT เท่านั้น
Windows
ไม่มีไบนารีของ Windows ดั้งเดิม แต่คุณสามารถเรียกใช้เครื่องมือ Veridex ใน Windows ได้โดยเรียกใช้ไบนารีของ Linux โดยใช้ Windows Subsystem for Linux (WSL) ก่อนทำตามขั้นตอนในส่วนนี้ ให้ติดตั้ง WSL และเลือก Ubuntu เป็นระบบปฏิบัติการ Linux
หลังจากติดตั้ง Ubuntu แล้ว ให้เปิดเทอร์มินัล Ubuntu แล้วทำตามขั้นตอนต่อไปนี้
- ดาวน์โหลดเครื่องมือ Veridex จากที่เก็บข้อมูลรันไทม์ Android ที่คอมไพล์ไว้ล่วงหน้า
- ดึงเนื้อหาของไฟล์
appcompat.tar.gz
- ในโฟลเดอร์ที่แตกไฟล์ ให้ค้นหาไฟล์
veridex-linux.zip
แล้วแตกไฟล์ ไปที่โฟลเดอร์ที่แตกแล้ว จากนั้นเรียกใช้คำสั่งต่อไปนี้ โดยที่
your-app.apk
คือ APK ที่คุณต้องการทดสอบ./appcompat.sh --dex-file=your-app.apk
macOS
หากต้องการเรียกใช้เครื่องมือ veridex ใน macOS ให้ทำตามขั้นตอนต่อไปนี้
- ดาวน์โหลดเครื่องมือ veridex จากที่เก็บรันไทม์ของ Android ที่สร้างไว้ล่วงหน้า
- แยกเนื้อหาของไฟล์
appcompat.tar.gz
- ในโฟลเดอร์ที่แตกไฟล์ ให้ค้นหาไฟล์
veridex-mac.zip
แล้วแตกไฟล์ ไปที่โฟลเดอร์ที่แตกไฟล์แล้ว จากนั้นเรียกใช้คำสั่งต่อไปนี้ โดยที่
/path-from-root/your-app.apk
คือเส้นทางไปยัง APK ที่คุณต้องการทดสอบ โดยเริ่มจากไดเรกทอรีรากของระบบ./appcompat.sh --dex-file=/path-from-root/your-app.apk
Linux
หากต้องการเรียกใช้เครื่องมือ veridex บน Linux ให้ทำตามขั้นตอนต่อไปนี้
- ดาวน์โหลดเครื่องมือ Veridex จากที่เก็บข้อมูลรันไทม์ Android ที่คอมไพล์ไว้ล่วงหน้า
- ดึงเนื้อหาของไฟล์
appcompat.tar.gz
- ในโฟลเดอร์ที่แตกไฟล์ ให้ค้นหาไฟล์
veridex-linux.zip
แล้วแตกไฟล์ ไปที่โฟลเดอร์ที่แตกแล้ว จากนั้นเรียกใช้คำสั่งต่อไปนี้ โดยที่
your-app.apk
คือ APK ที่คุณต้องการทดสอบ./appcompat.sh --dex-file=your-app.apk
ทดสอบโดยใช้เครื่องมือ Lint ของ Android Studio
ทุกครั้งที่คุณสร้างแอปใน Android Studio เครื่องมือ Lint จะตรวจสอบโค้ดเพื่อหาปัญหาที่อาจเกิดขึ้น หากแอปใช้อินเทอร์เฟซที่ไม่ใช่ SDK คุณอาจเห็นข้อผิดพลาดหรือคำเตือนของเวอร์ชัน ขึ้นอยู่กับรายการของอินเทอร์เฟซเหล่านั้น
นอกจากนี้ คุณยังเรียกใช้เครื่องมือ Lint จากบรรทัดคำสั่งหรือเรียกใช้การตรวจสอบด้วยตนเองในโปรเจ็กต์ โฟลเดอร์ หรือไฟล์ที่ต้องการได้
ทดสอบโดยใช้ Play Console
เมื่อคุณอัปโหลดแอปไปยังแทร็กทดสอบใน Play Console ระบบจะทดสอบแอปเพื่อหาปัญหาที่อาจเกิดขึ้นโดยอัตโนมัติและสร้างรายงานก่อนการเปิดตัว หากแอปใช้อินเทอร์เฟซที่ไม่ใช่ SDK ข้อผิดพลาดหรือคำเตือนจะแสดงในรายงานก่อนการเปิดตัว ทั้งนี้ขึ้นอยู่กับรายการที่อินเทอร์เฟซเหล่านั้นอยู่
ดูข้อมูลเพิ่มเติมได้ที่ส่วนความเข้ากันได้กับ Android ในใช้รายงานก่อนการเปิดตัวเพื่อระบุปัญหา
ขอ API สาธารณะใหม่
หากไม่พบวิธีอื่นในการใช้อินเทอร์เฟซที่ไม่ใช่ SDK สำหรับฟีเจอร์ในแอป คุณสามารถขอ API สาธารณะใหม่ได้โดยสร้างคำขอฟีเจอร์ในเครื่องมือติดตามปัญหา
เมื่อสร้างคำขอฟีเจอร์ โปรดระบุข้อมูลต่อไปนี้
- คุณใช้ API ที่ไม่รองรับใดอยู่ รวมถึงคำอธิบายแบบเต็มที่ปรากฏในข้อความ Logcat
Accessing hidden ...
- เหตุผลที่ต้องใช้ API เหล่านี้ รวมถึงรายละเอียดเกี่ยวกับฟีเจอร์ระดับสูงที่ต้องใช้ API ไม่ใช่แค่รายละเอียดระดับล่าง
- เหตุใด SDK API สาธารณะที่เกี่ยวข้องจึงไม่เพียงพอสำหรับวัตถุประสงค์ของคุณ
- ทางเลือกอื่นๆ ที่คุณลองแล้ว และสาเหตุที่วิธีเหล่านั้นไม่ได้ผล
เมื่อคุณระบุรายละเอียดเหล่านี้ในคำขอฟีเจอร์ โอกาสที่จะได้รับ API สาธารณะใหม่ก็จะเพิ่มขึ้น
คำถามอื่นๆ
ส่วนนี้มีคำตอบสำหรับคำถามอื่นๆ ที่นักพัฒนาแอปถามบ่อย ดังนี้
คำถามทั่วไป
Google จะแน่ใจได้อย่างไรว่าจะตอบสนองความต้องการของแอปทั้งหมดผ่านเครื่องมือติดตามปัญหาได้
เราสร้างรายการเริ่มต้นสำหรับ Android 9 (API ระดับ 28) ผ่านการวิเคราะห์แอปแบบคงที่ซึ่งเสริมด้วยวิธีการต่อไปนี้
- การทดสอบแอปยอดนิยมใน Play และแอปที่ไม่ใช่ของ Play ด้วยตนเอง
- รายงานภายใน
- การรวบรวมข้อมูลจากผู้ใช้ภายในโดยอัตโนมัติ
- รายงานตัวอย่างสำหรับนักพัฒนาแอป
- การวิเคราะห์เชิงสถิติเพิ่มเติมที่ออกแบบมาเพื่อระมัดระวัง ให้มีการตรวจพบที่ผิดพลาดมากขึ้น
ขณะประเมินรายการสำหรับรุ่นใหม่แต่ละรุ่น เราจะพิจารณาการใช้งาน API รวมถึงความคิดเห็นของนักพัฒนาแอปผ่านเครื่องมือติดตามปัญหา
ฉันจะเปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ได้อย่างไร
คุณเปิดใช้สิทธิ์เข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ในอุปกรณ์สำหรับการพัฒนาได้โดยใช้คำสั่ง adb เพื่อเปลี่ยนนโยบายการบังคับใช้ API คำสั่งที่คุณใช้จะแตกต่างกันไปโดยขึ้นอยู่กับระดับ API คำสั่งเหล่านี้ไม่จําเป็นต้องใช้อุปกรณ์ที่รูท
- Android 10 (API ระดับ 29) ขึ้นไป
หากต้องการเปิดใช้การเข้าถึง ให้ใช้ adb ต่อไปนี้
คำสั่ง:
adb shell settings put global hidden_api_policy 1
หากต้องการรีเซ็ตนโยบายการบังคับใช้ API เป็นการตั้งค่าเริ่มต้น ให้ใช้คำสั่งต่อไปนี้
adb shell settings delete global hidden_api_policy
- Android 9 (API ระดับ 28)
หากต้องการเปิดใช้การเข้าถึง ให้ใช้คำสั่ง adb ต่อไปนี้
adb shell settings put global hidden_api_policy_pre_p_apps 1
adb shell settings put global hidden_api_policy_p_apps 1
หากต้องการรีเซ็ตนโยบายการบังคับใช้ API เป็นการตั้งค่าเริ่มต้น ให้ใช้คำสั่งต่อไปนี้
adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps
คุณสามารถตั้งค่าจำนวนเต็มในนโยบายการบังคับใช้ API เป็นค่าใดค่าหนึ่งต่อไปนี้
- 0: ปิดใช้การตรวจหาอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด การใช้การตั้งค่านี้จะปิดใช้ข้อความบันทึกทั้งหมดสําหรับการใช้อินเทอร์เฟซที่ไม่ใช่ SDK และทําให้คุณไม่สามารถทดสอบแอปโดยใช้
StrictMode
API เราไม่แนะนำให้ใช้การตั้งค่านี้ - 1: เปิดใช้การเข้าถึงอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมด แต่พิมพ์ข้อความบันทึกพร้อมคําเตือนสําหรับการใช้อินเทอร์เฟซที่ไม่ใช่ SDK การใช้การตั้งค่านี้ยังทำให้คุณสามารถทดสอบแอปโดยใช้
StrictMode
API ได้อีกด้วย - 2: ไม่อนุญาตให้ใช้อินเทอร์เฟซที่ไม่ใช่ SDK ที่อยู่ในรายการที่บล็อกหรือถูกบล็อกแบบมีเงื่อนไขสำหรับระดับ API เป้าหมาย
คําถามเกี่ยวกับรายการอินเทอร์เฟซที่ไม่ใช่ SDK
ฉันจะดูรายการ API ที่ไม่ใช่ SDK ในอิมเมจระบบได้จากที่ใด
โดยระบบจะเข้ารหัสไว้ในบิต Flag การเข้าถึงฟิลด์และเมธอดในไฟล์ dex ของแพลตฟอร์ม ไม่มีไฟล์แยกต่างหากในอิมเมจระบบที่มีรายการเหล่านี้
รายการ API ที่ไม่ใช่ SDK จะเหมือนกันในอุปกรณ์ OEM ต่างๆ ที่มีเวอร์ชัน Android เดียวกันไหม
OEM สามารถเพิ่มอินเทอร์เฟซของตนเองลงในรายการที่บล็อก (รายการที่อนุญาต) แต่ไม่สามารถนําอินเทอร์เฟซออกจากรายการ API ที่ไม่ใช่ SDK ของ AOSP CDD จะป้องกันการเปลี่ยนแปลงดังกล่าวและการทดสอบ CTS ช่วยให้มั่นใจว่ารันไทม์ของ Android กำลังบังคับใช้รายการดังกล่าว
คำถามเกี่ยวกับความเข้ากันได้ของแอปที่เกี่ยวข้อง
อินเทอร์เฟซที่ไม่ใช่ NDK ในโค้ดเนทีฟมีข้อจำกัดไหม
Android SDK มีอินเทอร์เฟซ Java แพลตฟอร์มเริ่มจำกัดการเข้าถึงอินเทอร์เฟซที่ไม่ใช่ NDK สําหรับโค้ด C/C++ เดิมใน Android 7 (API ระดับ 26) ดูข้อมูลเพิ่มเติมได้ที่การปรับปรุงความเสถียรด้วยข้อจำกัดสัญลักษณ์ C/C++ ส่วนตัวใน Android N
มีแผนที่จะจำกัด dex2oat หรือการดัดแปลงไฟล์ DEX ไหม
เราไม่มีแผนที่จะจำกัดการเข้าถึงไฟล์ไบนารี dex2oat แต่ไม่ได้ตั้งใจให้รูปแบบไฟล์ DEX มีความเสถียรหรือเป็นอินเทอร์เฟซสาธารณะนอกเหนือจากส่วนที่ระบุไว้แบบสาธารณะในรูปแบบไฟล์ที่ปฏิบัติการได้ของ Dalvik เราขอสงวนสิทธิ์ในการแก้ไขหรือนำ dex2oat และส่วนที่ไม่ได้ระบุไว้ของรูปแบบ DEX ออกได้ทุกเมื่อ และโปรดทราบว่าไฟล์ที่ได้มาซึ่งสร้างโดย dex2oat เช่น ODEX (หรือเรียกอีกอย่างว่า OAT), VDEX และ CDEX เป็นรูปแบบที่ไม่ระบุทั้งหมด
จะเกิดอะไรขึ้นหาก SDK ของบุคคลที่สามที่สำคัญ (เช่น Obfuscator) ไม่สามารถหลีกเลี่ยงการใช้อินเทอร์เฟซที่ไม่ใช่ SDK แต่มุ่งมั่นที่จะรักษาความเข้ากันได้กับ Android เวอร์ชันต่อๆ ไป Android ยกเว้นข้อกำหนดด้านความเข้ากันได้ในกรณีนี้ได้ไหม
เราไม่มีแผนที่จะยกเว้นข้อกำหนดความเข้ากันได้โดยอิงตาม SDK แต่ละรายการ หากนักพัฒนา SDK รักษาความเข้ากันได้ได้โดยใช้อินเทอร์เฟซในรายการที่ไม่รองรับ (เดิมเป็นสีเทา) เท่านั้น ก็ควรเริ่มวางแผนการย้ายข้อมูลไปยังอินเทอร์เฟซ SDK หรือทางเลือกอื่นๆ และขอ API สาธารณะใหม่ทุกครั้งที่หาทางเลือกอื่นนอกเหนือจากการใช้อินเทอร์เฟซที่ไม่ใช่ SDK ไม่ได้
ข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK จะมีผลกับแอปทั้งหมด รวมถึงแอประบบและแอปของบุคคลที่หนึ่ง ไม่ใช่แค่แอปของบุคคลที่สามใช่ไหม
ใช่ แต่เราจะยกเว้นแอปที่ลงนามด้วยคีย์แพลตฟอร์มและแอปภาพระบบบางแอป โปรดทราบว่าข้อยกเว้นเหล่านี้มีผลเฉพาะกับแอปที่เป็นส่วนหนึ่งของอิมเมจระบบ (หรือแอปอิมเมจระบบที่อัปเดตแล้ว) รายการนี้มีไว้สำหรับแอปที่สร้างขึ้นโดยใช้ API ของแพลตฟอร์มส่วนตัวเท่านั้น ไม่ใช่ API ของ SDK (LOCAL_PRIVATE_PLATFORM_APIS := true
)