Android dispose de deux types d'API qui ne sont pas accessibles via le SDK.
Le premier est situé dans le package com.android.internal. Le deuxième type d'API est une collection de classes et de méthodes marquées avec l' attribut @hide Javadoc .
À partir d'Android 9 (niveau d'API 28), Google introduit de nouvelles restrictions sur l'utilisation d'interfaces non SDK , que ce soit directement, via réflexion ou via JNI. Ces restrictions sont appliquées chaque fois qu'une application fait référence à une interface non SDK ou tente d'obtenir son handle à l'aide de la réflexion ou de JNI.
Mais avant le niveau d'API 28, les méthodes cachées étaient toujours accessibles via la réflexion Java. L' @hideattribut fait simplement partie de Javadoc (droiddoc également), donc cela @hidesignifie simplement que la méthode / classe / champ est exclue de la documentation de l'API.
Par exemple, la checkUidPermission()méthode ActivityManager.javautilise @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;
}
Cependant, nous pouvons l'appeler par réflexion:
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});