131 votes

Que signifie @hide dans le code source d'Android ?

Pour le Activity code source , ligne 3898 (près du bas) :

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

Qu'est-ce que @hide C'est-à-dire ?

J'ai trouvé mon public class ChildActivity extends Activity { ... } ne peut pas utiliser/voir Activity.isResumed() . Est-ce normal ? Comment puis-je y accéder ?

197voto

StarPinkER Points 6096

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});

26voto

paxdiablo Points 341644
  1. @hide est utilisé pour les choses qui doivent être visibles pour diverses raisons mais qui sont no de l'API publiée. Ils ne seront pas inclus dans la documentation lorsque celle-ci extrait automatiquement l'API de la source.

  2. Vous avez raison, vous ne pouvez pas l'ignorer. C'est normal, c'est à dessein, puisque c'est marqué en tant que final . Vous devez être capable de utiliser bien qu'un éditeur puisse ne pas l'afficher comme l'un des choix dans l'intellisense qu'il utilise parce qu'il est marqué avec le symbole @hide et vous devez prendre note du point 3 ci-dessous.

  3. Vous devez no l'utiliser du tout puisqu'elle ne fait pas partie de l'API et que les développeurs peuvent la supprimer quand ils le souhaitent. Ils auraient même le droit, s'ils avaient un penchant sadique, de la remplacer par une fonction qui ferait disjoncter l'appareil sur lequel elle est exécutée (mais peut-être pas au sens juridique strict).

4voto

leonardkraemer Points 2908

Le site @hide signifie que cette interface ne fait pas partie de l'API publique et ne doit pas être utilisée dans votre code. Les méthodes sont uniquement destinées à un usage interne de l'AOSP.

Google a en fait commencé à restreindre l'utilisation des interfaces non SDK . Cela inclut les interfaces marquées avec @hide

Les méthodes sont classées en quatre listes :

  • liste blanche : le SDK
  • light-greylist : méthodes / champs non SDK qui sont toujours accessibles.
  • dark-greylist :
  • Pour les applications dont le SDK cible est inférieur au niveau 28 de l'API : chaque utilisation d'une interface de type dark greylist est autorisée.
  • Pour les applications dont le SDK cible est de niveau API 28 ou supérieur : même comportement que la liste noire.
  • liste noire : restreint indépendamment du SDK cible. La plate-forme se comportera comme si l'interface était absente. Par exemple, elle lancera NoSuchMethodError/NoSuchFieldException lorsque l'application tente de l'utiliser l'utiliser, et ne l'inclura pas lorsque l'application voudra connaître la liste des champs/méthodes d'une champs/méthodes d'une classe particulière.

Les listes peuvent être trouvées aquí

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X