Android memiliki dua jenis API yang tidak dapat diakses melalui SDK.
Yang pertama ada di dalam paket com.android.internal
. Jenis API kedua adalah kumpulan kelas dan metode yang ditandai dengan atribut @hide Javadoc .
Mulai dari Android 9 (API level 28), Google memperkenalkan batasan baru pada penggunaan antarmuka non-SDK , baik secara langsung, melalui refleksi, atau melalui JNI. Pembatasan ini diterapkan setiap kali aplikasi mereferensikan antarmuka non-SDK atau mencoba untuk mendapatkan pegangannya menggunakan refleksi atau JNI.
Tetapi sebelum API level 28, metode tersembunyi masih bisa diakses melalui refleksi Java. The @hide
atribut hanya bagian dari Javadoc (droiddoc juga), sehingga @hide
hanya cukup berarti metode / kelas / lapangan dikeluarkan dari dokumentasi API.
Misalnya, checkUidPermission()
metode yang ActivityManager.java
digunakan @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;
}
Namun, kita dapat menyebutnya dengan refleksi:
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});