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


120

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

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

什么@hide意思

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

Answers:


182

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

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

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

但是在API级别28之前,仍可以通过Java反射访问隐藏的方法。该@hide属性只是Javadoc的一部分(也是droiddoc),因此@hide仅表示方法/类/字段已从API文档中排除。

例如,中的checkUidPermission()方法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;
}

但是,我们可以通过反射来称呼它:

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

1
你好@StarPinkER我可以使用隐藏或内部api或通过反思授予“ android.permission.CHANGE_COMPONENT_ENABLED_STATE”权限吗?
Hardik 2014年

1
首先检查此答案。此权限是签名/系统权限。在大多数情况下,除非它是系统应用程序,否则无法获得此权限。这意味着您需要修改Android Source才能接受您的应用程序或将您的应用程序设置为system-app并对其进行签名。但是,除非您要制作自己的Android系统,否则您将无法执行此操作。反射可以处理“隐藏”,但不能更改Android安全系统的逻辑。您可以想象如果能够做到的话,我们将如何轻松地攻击Android设备。@Hardik
StarPinkER 2014年

2
感谢您的回答,但是我认为答案有两个问题,如果我错了,请纠正我。如果尝试通过“ ActivityManager”而不是“ android.app.ActivityManager”和“ m.invoke(c)来找到它,我会收到classnotfound错误,对于静态方法和“ m”来说似乎应该为“ m.invoke(null”)。对于动态方法,invoke(o,“,其中o是类型c的对象。对不起,我的波兰语语法:)
lindenrovio

3
只是关于反射的注释:由于这些方法/字段不是官方SDK的一部分,因此不能保证它们会出现在将来的任何Android版本中。
sstn 2014年

2
如果注释仅从文档中删除了该方法,为什么我仍不能在代码中使用它?
哈维尔·德尔加多

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

  2. 没错,您无法覆盖它。这是正常现象,这是设计使然,因为标记为final。您应该能够使用它,尽管编辑器可能不会在使用的任何智能感知中向您展示它,因为它用标记了@hide,并且应该注意下面的第3点。

  3. 您根本应该使用它,因为它不是API的一部分,开发人员可以随时将其删除。如果他们悲痛欲绝,他们甚至将在自己的权利之内,以取代使运行该设备的功能变砖石的功能(尽管从严格的法律意义上来说)。


哦,是的... final我当然不能覆盖它。抱歉,这是我的错误:x
Midnite 2013年

您的意思是,它public在开发阶段涉及所有课程。但是它的作用像private还是/*package*/像我们这样的用户?
Midnite

嗯...那只是一条评论。我了解它的含义。但是在代码级别上什么以及在哪里强制执行此行为?
2013年

1
为什么要公开,我真的不能发表评论。也许代码实现Activity分散在许多类中,并且它们都需要访问此成员。底线是,它公共的,但不是API的一部分,这意味着您需要自己承担风险。
paxdiablo

1
@ midnite,Eclipse有它自己的Java编译器,毫无疑问,它与智能感知功能集成在一起。我建议如果您使用Java SDK进行编译,则可以正常编译。这并不是说我建议这门课程的,见点3
paxdiablo

4

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

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

这些方法分为四个列表:

  • 白名单:SDK
  • 浅灰色清单:仍可访问的非SDK方法/字段。
  • 黑名单:
    • 对于目标SDK低于API级别28的应用程序:允许每次使用深灰色列表界面。
    • 对于目标SDK为API级别28或更高级别的应用:与黑名单相同的行为
  • 黑名单:不受目标SDK限制。该平台的行为就像没有界面一样。例如,当应用程序尝试使用它时,它将抛出NoSuchMethodError / NoSuchFieldException,而当应用程序想知道特定类的字段/方法列表时,它将不包含它。

可以在以下位置找到列表:https : //android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.