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' @hide
attribut fait simplement partie de Javadoc (droiddoc également), donc cela @hide
signifie simplement que la méthode / classe / champ est exclue de la documentation de l'API.
Par exemple, la checkUidPermission()
méthode ActivityManager.java
utilise @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});