Android có hai loại API không thể truy cập thông qua SDK.
Cái đầu tiên nằm trong gói com.android.internal
. Loại API thứ hai là một tập hợp các lớp và phương thức được đánh dấu bằng thuộc tính @hide Javadoc .
Bắt đầu từ Android 9 (API cấp 28), Google đưa ra các hạn chế mới đối với việc sử dụng các giao diện không phải SDK , dù là trực tiếp, qua phản chiếu hay qua JNI. Những hạn chế này được áp dụng bất cứ khi nào một ứng dụng tham chiếu đến giao diện không phải SDK hoặc cố gắng lấy tay cầm của nó bằng cách sử dụng phản chiếu hoặc JNI.
Nhưng trước API cấp 28, các phương thức ẩn vẫn có thể được truy cập thông qua phản chiếu Java. Các @hide
thuộc tính chỉ là một phần của Javadoc (droiddoc cũng), do đó @hide
chỉ đơn giản có nghĩa là phương pháp / lớp / trường được loại trừ khỏi các tài liệu API.
Ví dụ, checkUidPermission()
phương thức được ActivityManager.java
sử dụng @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;
}
Tuy nhiên, chúng ta có thể gọi nó bằng cách phản ánh:
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});