web-dev-qa-db-fra.com

Que signifie @hide dans le code source Android?

Pour le Activity code source , ligne 3898 (proche du bas):

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

Que signifie @hide?

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

110
midnite

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 un ensemble de classes et de méthodes marquées avec le attribut Javadoc @ hide .

À partir de Android 9 (API de niveau 28), Google introduit nouvelles restrictions relatives à l'utilisation d'interfaces non SDK) , que ce soit directement, par réflexion ou via JNI. des restrictions sont appliquées chaque fois qu'une application fait référence à une interface non-SDK ou tente d'obtenir son descripteur à l'aide de réflexion ou de JNI.

Mais avant le niveau 28 de l’API, il était toujours possible d’accéder aux méthodes cachées via Java réflexion. L’attribut @hide Fait tout simplement partie de Javadoc (droiddoc également)), de sorte que @hide signifie simplement que la méthode/classe/champ est exclu de la documentation de l'API.

Par exemple, la méthode checkUidPermission() 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});
171
StarPinkER
  1. @hide est utilisé pour des éléments qui doivent être visibles pour diverses raisons mais qui ne font pas de l'API publiée. Ils ne seront pas inclus dans la documentation lors de l'extraction automatique de l'API à partir de la source.

  2. Vous avez raison, vous ne pouvez pas le remplacer. C'est normal, cela est inhérent à la conception, car il est marqué comme final. Vous devriez être capable de l'utiliser , bien qu'un éditeur ne vous le montre pas comme l'un des choix que vous utilisiez dans intellisense car il est marqué avec @hide, et vous devriez prendre note du point 3 ci-dessous.

  3. Vous devriez ne pas l'utiliser car il ne fait pas partie de l'API et les développeurs peuvent le supprimer à tout moment. Ils seraient même dans leurs droits, s'ils étaient enclins à la sadisme, à le remplacer par une fonction qui rendait le dispositif sur lequel il fonctionnait (bien que ce ne soit peut-être pas au sens juridique du terme).

22
paxdiablo

Le @hide annotation 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 du PSBA.

Google a en fait commencé à restreindre l'utilisation d'interfaces non-SDK . Ceci 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 disponibles dans le SDK.
  • dark-greylist:
    • Pour les applications dont le SDK cible est inférieur au niveau 28 de l'API: chaque utilisation d'une interface 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 quel que soit le SDK cible. La plate-forme se comportera comme si l'interface était absente. Par exemple, elle lève une exception NoSuchMethodError/NoSuchFieldException chaque fois que l'application tente de l'utiliser, mais ne l'inclut pas lorsqu'elle souhaite connaître la liste des champs/méthodes d'une classe particulière.

Les listes peuvent être trouvées ici: https://Android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

1
leonardkraemer