Android possède deux types d'API qui ne sont pas accessibles via le SDK.
Le premier est situé dans le paquet com.android.internal
. Le deuxième type d'API est une collection de classes et de méthodes qui sont marquées par l'icône @hide Javadoc attribute .
À partir d'Android 9 (niveau 28 de l'API), Google introduit les éléments suivants nouvelles restrictions sur l'utilisation des interfaces non-SDK que ce soit directement, par 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 en utilisant la réflexion ou JNI.
Mais avant le niveau 28 de l'API, les méthodes cachées étaient encore accessibles via la réflexion Java. Le site @hide
fait partie de Javadoc (droiddoc aussi), donc l'attribut @hide
signifie simplement que la méthode/classe/champ est exclue de la documentation de l'API.
Par exemple, le checkUidPermission()
méthode dans 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});