Android ma dwa typy interfejsów API, które nie są dostępne za pośrednictwem zestawu SDK.
Pierwsza znajduje się w opakowaniu com.android.internal. Drugi typ interfejsu API to kolekcja klas i metod, które są oznaczone atrybutem @hide Javadoc .
Począwszy od Androida 9 (poziom API 28), Google wprowadza nowe ograniczenia w używaniu interfejsów innych niż SDK , czy to bezpośrednio, przez odbicie, czy przez JNI. Te ograniczenia są stosowane za każdym razem, gdy aplikacja odwołuje się do interfejsu innego niż SDK lub próbuje uzyskać jego uchwyt przy użyciu odbicia lub JNI.
Ale przed poziomem API 28 dostęp do ukrytych metod był nadal możliwy przez odbicie w Javie. @hideCecha jest tylko część Javadoc (droiddoc również), a więc @hidepo prostu oznacza metodę / klasa / pole są wyłączone z Dokumenty API.
Na przykład checkUidPermission()metoda w ActivityManager.javaużyciu @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;
}
Możemy to jednak nazwać refleksją:
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});