@hide在Android源代码中的含义是什么?

mid*_*ite 113 android android-source android-activity

对于Activity源代码,第3898行(靠近底部):

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}
Run Code Online (Sandbox Code Playgroud)

什么@hide意思?

我发现我public class ChildActivity extends Activity { ... }不能用/看Activity.isResumed().这是正常的吗?我该如何访问它?

Sta*_*kER 176

Android有两种类型的API无法通过SDK访问.

第一个位于com.android.internal包中.第二种API类型是使用@hide javadoc属性标记的类和方法的集合.

从Android 9(API级别28)开始,Google引入了对非SDK接口使用的新限制,无论是直接,通过反射还是通过JNI.只要应用程序引用非SDK接口或尝试使用反射或JNI获取其句柄,就会应用这些限制.

但是在API级别28之前,仍然可以通过java反射访问隐藏方法.@hide属性只是javadoc(也是droiddoc)的一部分,所以@hide只是意味着方法/类/字段被排除在API文档之外.

例如,ActivityManager.java中的checkUidPermission方法是@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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我们可以通过反思来称呼它.

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});
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,但我认为答案中有两个问题,如果我错了,请纠正我。如果尝试通过“ActivityManager”而不是“android.app.ActivityManager”和“m.invoke(c,”似乎应该是“m.invoke(null,”对于静态方法和“m. invoke(o,", 其中 o 是类型 c 的对象,用于动态方法。对不起我的波兰语语法:) (2认同)
  • 关于反思的注释:由于这些方法/字段不是官方SDK的一部分,因此无法保证它们将出现在任何未来的Android版本中. (2认同)
  • 如果注释只是从文档中删除了方法,为什么我仍然不能在代码中使用它? (2认同)

pax*_*blo 22

  1. @hide用于因各种原因需要显示但属于已发布API的内容.当它从源自动提取API时,它们将不会包含在文档中.

  2. 你是对的,你无法覆盖它.这是正常的,这是设计的,因为它被标记为final.您应该能够使用它,尽管编辑器可能不会将其显示为您使用的任何intellisense中的选项之一,因为它标记为@hide,您应该注意下面的第3点.

  3. 您根本应该使用它,因为它不是API的一部分,开发人员可以随时删除它.他们甚至会在他们的权利范围内,如果他们有悲观的倾向,用一个砖块化它运行的设备的功能取代它(虽然可能没有严格的法律意义).


leo*_*mer 5

@hide注释意味着该接口不是公共 API 的一部分,不应在您的代码中使用。这些方法仅供 AOSP 内部使用。

Google实际上已经开始限制非sdk接口的使用。这包括标有的接口@hide

这些方法分为四个列表:

  • 白名单:SDK
  • 浅灰名单:仍可访问的非 SDK 方法/字段。
  • 深灰名单:
  • 对于目标 SDK 低于 API 级别 28 的应用程序:允许每次使用深灰名单接口。
  • 对于目标 SDK 为 API 级别 28 或更高级别的应用:与黑名单相同的行为
  • 黑名单:无论目标 SDK 如何,都受到限制。平台的行为就像接口不存在一样。例如,每当应用程序尝试使用它时,它都会抛出 NoSuchMethodError/NoSuchFieldException,并且当应用程序想要知道特定类的字段/方法列表时,它不会包含它。

列表可以在这里找到