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

时间:2013-06-11 01:32:56

标签: android android-activity android-source

对于Activity source code,第3898行(靠近底部):

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

@hide是什么意思?

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

3 个答案:

答案 0 :(得分:168)

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

第一个位于com.android.internal包中。第二种API类型是标有@hide javadoc attribute的类和方法的集合。

从Android 9(API级别28)开始,Google引入new restrictions on the use of non-SDK interfaces,无论是直接,通过反射还是通过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});

答案 1 :(得分:21)

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

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

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

答案 2 :(得分:1)

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

Google实际上已经开始restrict the usage of non-sdk interfaces。这包括标有@hide

的接口

方法分为四个列表:

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

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