it-swarm.com.de

Was bedeutet @hide im Android Quellcode?

Für den Activity Quellcode , Zeile 3898 (ganz unten):

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

Was bedeutet @hide?

Ich habe festgestellt, dass mein public class ChildActivity extends Activity { ... }Activity.isResumed() nicht verwenden/sehen kann. Ist das normal? Wie kann ich darauf zugreifen?

110
midnite

Android verfügt über zwei Arten von APIs, auf die über das SDK nicht zugegriffen werden kann.

Der erste befindet sich im Paket com.Android.internal. Der zweite API-Typ ist eine Sammlung von Klassen und Methoden, die mit dem Javadoc-Attribut @ hide gekennzeichnet sind.

Ab Android 9 (API-Stufe 28)) führt Google neue Einschränkungen für die Verwendung von Nicht-SDK-Schnittstellen ein, sei es direkt, über Reflection oder über JNI Einschränkungen gelten immer dann, wenn eine App auf eine Nicht-SDK-Schnittstelle verweist oder versucht, ihr Handle über Reflection oder JNI abzurufen.

Vor API-Level 28 war der Zugriff auf die versteckten Methoden jedoch noch über Java Reflection. Das Attribut @hide Ist nur ein Teil von Javadoc (auch Droiddoc), also das Attribut @hide bedeutet einfach nur, dass die Methode/Klasse/das Feld aus den API-Dokumenten ausgeschlossen ist.

Beispielsweise verwendet die checkUidPermission() -Methode in ActivityManager.Java@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;
}

Wir können es jedoch durch Nachdenken bezeichnen:

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 Wird für Dinge verwendet, die aus verschiedenen Gründen sichtbar sein müssen, aber nicht Teil der veröffentlichten API sind. Sie werden nicht in die Dokumentation aufgenommen, wenn die API automatisch aus der Quelle extrahiert wird.

  2. Du hast recht, du kannst es nicht überschreiben. Dies ist normal, das ist beabsichtigt, da es als final markiert ist. Sie sollten in der Lage sein, es zu verwenden, obwohl ein Editor es Ihnen möglicherweise nicht als eine der Auswahlmöglichkeiten in dem von ihm verwendeten Intellisense anzeigt, da es mit @hide Markiert ist, und Sie sollten dies zur Kenntnis nehmen von Punkt 3 unten.

  3. Sie sollten es nicht verwenden, da es nicht Teil der API ist und die Entwickler es jederzeit entfernen können. Sie wären sogar im Rahmen ihrer Rechte, wenn sie sadistisch veranlasst wären, es durch eine Funktion zu ersetzen, die das Gerät, auf dem es lief, blockiert (wenn auch möglicherweise nicht im strengen rechtlichen Sinne).

22
paxdiablo

Das @hide Anmerkung bedeutet, dass diese Schnittstelle nicht Teil der öffentlichen API ist und nicht in Ihrem Code verwendet werden sollte. Die Methoden sind nur für den internen Gebrauch des AOSP bestimmt.

Google hat tatsächlich damit begonnen die Verwendung von Nicht-SDK-Schnittstellen einzuschränken . Dies schließt Schnittstellen ein, die mit @hide

Die Methoden sind in vier Listen unterteilt:

  • whitelist: das SDK
  • hellgrau-Liste: Nicht-SDK-Methoden/-Felder, auf die noch zugegriffen werden kann.
  • dunkelgrauer:
    • Für Apps, deren Ziel-SDK unter API-Level 28 liegt: Jede Verwendung einer dunkelgrauen Benutzeroberfläche ist zulässig.
    • Für Apps, deren Ziel-SDK API-Level 28 oder höher ist: dasselbe Verhalten wie bei der Blacklist
  • blacklist: unabhängig vom Ziel-SDK eingeschränkt. Die Plattform verhält sich so, als ob die Schnittstelle fehlt. Beispielsweise wird NoSuchMethodError/NoSuchFieldException ausgelöst, wenn die App versucht, es zu verwenden, und wird es nicht einschließen, wenn die App die Liste der Felder/Methoden einer bestimmten Klasse kennen möchte.

Die Listen finden Sie hier: https://Android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

1
leonardkraemer