Android มี API สองประเภทที่ไม่สามารถเข้าถึงได้ผ่าน SDK
com.android.internal
คนแรกที่ตั้งอยู่ในแพคเกจ ประเภทที่สองคือ API คอลเลกชันของการเรียนและวิธีการที่ถูกทำเครื่องหมายด้วยแอตทริบิวต์ @hide Javadoc
เริ่มจาก Android 9 (API ระดับ 28) Google แนะนำข้อ จำกัด ใหม่เกี่ยวกับการใช้อินเทอร์เฟซที่ไม่ใช่ SDKไม่ว่าจะโดยตรงผ่านการสะท้อนกลับหรือผ่าน JNI ข้อ จำกัด เหล่านี้จะนำไปใช้เมื่อใดก็ตามที่แอปอ้างถึงอินเทอร์เฟซที่ไม่ใช่ SDK หรือพยายามที่จะจัดการโดยใช้การสะท้อนกลับหรือ JNI
แต่ก่อน API ระดับ 28 ยังสามารถเข้าถึงเมธอดที่ซ่อนอยู่ผ่านการสะท้อนของ Java @hide
แอตทริบิวต์เป็นเพียงส่วนหนึ่งของ Javadoc (droiddoc ยัง) ดังนั้น@hide
เพียงแค่หมายถึงวิธีการ / ระดับ / สาขาได้รับการยกเว้นจากเอกสารของ API
ตัวอย่างเช่นcheckUidPermission()
วิธีการActivityManager.java
ใช้@hide
:
/** @hide */
public static int checkUidPermission(String permission, int uid) {
try {
return AppGlobals.getPackageManager()
.checkUidPermission(permission, uid);
} catch (RemoteException e) {
// Should never happen, but if it does... deny!
Slog.e(TAG, "PackageManager is dead?!?", e);
}
return PackageManager.PERMISSION_DENIED;
}
อย่างไรก็ตามเราสามารถเรียกมันโดยการไตร่ตรอง:
Class c;
c = Class.forName("android.app.ActivityManager");
Method m = c.getMethod("checkUidPermission", new Class[] {String.class, int.class});
Object o = m.invoke(null, new Object[]{"android.permission.READ_CONTACTS", 10010});