@ hide 在 Android 源代码中是什么意思?

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

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

@hide是什么意思?

我发现我的 public class ChildActivity extends Activity { ... }无法使用/查看 Activity.isResumed()。这是正常的吗? 我如何访问它?

55852 次浏览
  1. 由于各种原因,@hide用于需要可见的内容,但是 没有是已发布 API 的一部分。当文档自动从源代码中提取 API 时,它们将不包括在文档中。

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

  3. 您完全应该使用 没有,因为它不是 API 的一部分,开发人员可以随时删除它。他们甚至可以在他们的权利范围内,如果他们有施虐倾向的话,用一个砖砌的设备来替换它(尽管可能不是在严格的法律意义上)。

Android 有两种不能通过 SDK 访问的 API。

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

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

然而,我们可以通过反思来称之为:

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

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

Google 实际上已经开始使用 限制非 sdk 接口的使用了,这包括标记为 @hide的界面

这些方法分为四类:

  • 白名单: SDK
  • Light-greylist: 仍然可以访问的非 SDK 方法/字段。
  • 深灰名单:
  • 对于目标 SDK 低于 API 级别28的应用程序: 允许每次使用深灰色列表接口。
  • 对于目标 SDK 为 API 级别28或更高的应用程序: 与黑名单相同的行为
  • 黑名单: 受限制,不管目标 SDK。平台的行为就好像没有接口一样。例如,它会抛出 当应用程序试图 使用它,并且当应用程序想要知道列表时不会包含它 特定类的字段/方法。

列表可以找到 给你