@SystemApi @hide @NonNull @TargetApi

来源:互联网 发布:易建联发展联盟数据 编辑:程序博客网 时间:2024/04/30 10:32

  • Android中SystemApi hide NonNull TargetApi
    • SystemApi hide PrivateApi
    • NonNull TargetApi
    • 参考信息

Android中@SystemApi @hide @NonNull @TargetApi

我们时常在Android源代码中看到的注释,如SystemApi hide NonNull TargetApi 那么它呢么具体代表什么意思?

@SystemApi @hide @PrivateApi

有关@SystemApi的信息可以首先参见这个链接 ;@SystemApi 是 @PrivateApi的别名;使用@hide标记的API可以不使用@SystemApi进行标;但是当使用@SystemApi标记的API则必须使用@hide
在Android源码中,有两种类型的API无法通过标准的SDK进行访问
如下图所示;
hide_SystemApi

  • 位于com.android.internal包中的
  • 类/方法 被 @hide修饰的

值得注意的是:隐藏的方法(使用@hide修饰的)仍然可以通过java 反射机制进行访问;@hide标识只是javadoc的一部分(也是Android doc的一部分),所以@hide修饰符仅仅指示了method/class/field 不会被暴露到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;}

但是我们可以通过java的反射机制来访问

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

下面来看看@SystemApi 和@hide的不同之处
如上文所示:使用@hide修饰的method/class/field,我们仍然何以通过java反射机制进行访问。
但是使用@SystemApi修饰的method/class/field,无法通过java 反射机制进行访问(会触发invocationTargetException异常)

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);Method method = manager.getClass()                    .getMethod("getPrivilegedConfiguredNetworks");List<WifiConfiguration> configs =            (List<WifiConfiguration>)method.invoke(manager);

列出源码

/** * Start AccessPoint mode with the specified * configuration. If the radio is already running in * AP mode, update the new configuration * Note that starting in access point mode disables station * mode operation * @param wifiConfig SSID, security and channel details as *        part of WifiConfiguration * @return {@code true} if the operation succeeds, {@code false} otherwise * * @hide Dont open up yet */public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {    try {        mService.setWifiApEnabled(wifiConfig, enabled);        return true;    } catch (RemoteException e) {        return false;    }}/** @hide */@SystemApipublic List<WifiConfiguration> getPrivilegedConfiguredNetworks() {    try {        return mService.getPrivilegedConfiguredNetworks();    } catch (RemoteException e) {        return null;    }

@NonNull @TargetApi

TargetApi & NonNull如下图所示:
TargetApi
TargetApi
NonNull
NonNull
TargetApi的常见用法是指定当前class/method/field所使用的api版本,也就是所谓的android 4.4/5.0/5.1/
NonNull常见用于修饰参数,用于表明该参数不为空!

参考信息

github rename PrivateApi to SystemApi
Stackoverflow SystemApi
Stackoverflow @hide

1 0
原创粉丝点击