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. @hide
Cecha jest tylko część Javadoc (droiddoc również), a więc @hide
po prostu oznacza metodę / klasa / pole są wyłączone z Dokumenty API.
Na przykład checkUidPermission()
metoda w ActivityManager.java
uż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});