Android verfügt über zwei Arten von APIs, auf die über das SDK nicht zugegriffen werden kann.
Der erste befindet sich im Paket com.android.internal
. Der zweite API-Typ ist eine Sammlung von Klassen und Methoden, die mit dem Attribut @hide Javadoc gekennzeichnet sind .
Ab Android 9 (API-Level 28) führt Google neue Einschränkungen für die Verwendung von Nicht-SDK-Schnittstellen ein , sei es direkt, über Reflection oder über JNI. Diese Einschränkungen werden immer dann angewendet, wenn eine App auf eine Nicht-SDK-Schnittstelle verweist oder versucht, deren Handle mithilfe von Reflection oder JNI abzurufen.
Vor API-Level 28 konnte jedoch weiterhin über Java Reflection auf die verborgenen Methoden zugegriffen werden. Das @hide
Attribut ist nur ein Teil von Javadoc (auch Droiddoc), @hide
was einfach bedeutet, dass die Methode / Klasse / das Feld aus den API-Dokumenten ausgeschlossen ist.
Zum Beispiel kann das checkUidPermission()
Verfahren in ActivityManager.java
Gebrauch @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;
}
Wir können es jedoch durch Reflexion nennen:
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});