ตั้งแต่ Android 9 (API ระดับ 28) เป็นต้นไป แพลตฟอร์มจะจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ที่แอปของคุณใช้ได้ ข้อจำกัดเหล่านี้จะมีผลเมื่อใดก็ตามที่แอปอ้างอิงอินเทอร์เฟซที่ไม่ใช่ SDK หรือพยายามรับแฮนเดิลโดยใช้รีเฟล็กชันหรือ JNI ข้อจำกัดเหล่านี้มีขึ้นเพื่อปรับปรุงประสบการณ์ของผู้ใช้และนักพัฒนาแอป รวมถึงลดความเสี่ยงที่ผู้ใช้จะพบปัญหาขัดข้องและนักพัฒนาแอปจะเปิดตัวแอปอย่างเร่งด่วน ดูข้อมูลเพิ่มเติมเกี่ยวกับการตัดสินใจนี้ได้ที่การปรับปรุงความเสถียรด้วยการลดการใช้อินเทอร์เฟซที่ไม่ใช่ SDK
แยกความแตกต่างระหว่างอินเทอร์เฟซ SDK กับที่ไม่ใช่ SDK
โดยทั่วไปแล้ว อินเทอร์เฟซ SDK สาธารณะคืออินเทอร์เฟซที่พบในเอกสารประกอบของดัชนีแพ็กเกจเฟรมเวิร์ก 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 16 (เวอร์ชันตัวอย่างสำหรับนักพัฒนาซอฟต์แวร์)
สำหรับ Android 16 คุณสามารถดาวน์โหลดไฟล์ต่อไปนี้ซึ่งอธิบายอินเทอร์เฟซที่ไม่ใช่ SDK ทั้งหมดและรายการที่เกี่ยวข้อง
ไฟล์: hiddenapi-flags.csv
ผลรวมตรวจสอบ SHA-256:
a22d5c2fa9c24ec0b864f0680208e9794222d1921114abe3245979143ce6d1c6
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงรายการ API ที่ไม่ใช่ SDK ใน Android 16 ได้ที่การอัปเดตข้อจำกัดอินเทอร์เฟซที่ไม่ใช่ SDK ใน Android 16
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 ที่ไม่รองรับที่คุณใช้อยู่ รวมถึงตัวบ่งชี้แบบเต็มที่เห็นใน
Accessing hidden ...
ข้อความ logcat - เหตุผลที่ต้องใช้ API เหล่านี้ รวมถึงรายละเอียดเกี่ยวกับฟีเจอร์ระดับสูงที่ต้องใช้ API ไม่ใช่แค่รายละเอียดระดับล่าง
- เหตุผลที่ API ของ SDK สาธารณะที่เกี่ยวข้องไม่เพียงพอต่อวัตถุประสงค์ของคุณ
- ทางเลือกอื่นๆ ที่คุณลองแล้ว และสาเหตุที่วิธีเหล่านั้นไม่ได้ผล
เมื่อคุณระบุรายละเอียดเหล่านี้ในคำขอฟีเจอร์ โอกาสที่จะได้รับ 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 ที่สำคัญของบุคคลที่สาม (เช่น เครื่องมือสร้างความสับสน) หลีกเลี่ยงการใช้อินเทอร์เฟซที่ไม่ใช่ SDK ไม่ได้ แต่มุ่งมั่นที่จะรักษาความเข้ากันได้กับ Android เวอร์ชันในอนาคต Android ยกเว้นข้อกำหนดด้านความเข้ากันได้ในกรณีนี้ได้ไหม
เราไม่มีแผนที่จะยกเว้นข้อกำหนดด้านความเข้ากันได้สำหรับ SDK แต่ละรายการ หากนักพัฒนา SDK รักษาความเข้ากันได้ได้โดยใช้อินเทอร์เฟซในรายการที่ไม่รองรับ (เดิมเป็นสีเทา) เท่านั้น ก็ควรเริ่มวางแผนการย้ายข้อมูลไปยังอินเทอร์เฟซ SDK หรือทางเลือกอื่นๆ และขอ API สาธารณะใหม่ทุกครั้งที่หาทางเลือกอื่นนอกเหนือจากการใช้อินเทอร์เฟซที่ไม่ใช่ SDK ไม่ได้
ข้อจำกัดของอินเทอร์เฟซที่ไม่ใช่ SDK จะมีผลกับแอปทั้งหมด รวมถึงแอประบบและแอปของบุคคลที่หนึ่ง ไม่ใช่แค่แอปของบุคคลที่สามใช่ไหม
ใช่ แต่เราจะยกเว้นแอปที่ลงนามด้วยคีย์แพลตฟอร์มและแอปภาพระบบบางแอป โปรดทราบว่าข้อยกเว้นเหล่านี้มีผลกับแอปที่เป็นส่วนหนึ่งของภาพระบบ (หรือแอปภาพระบบที่อัปเดตแล้ว) เท่านั้น รายการนี้มีไว้สำหรับแอปที่สร้างขึ้นโดยใช้ API ของแพลตฟอร์มส่วนตัวเท่านั้น ไม่ใช่ API ของ SDK (LOCAL_PRIVATE_PLATFORM_APIS := true
)