2014-11-05 60 views
11

Android最近在其SDK源代碼中引入了@SystemApi。看起來和之前的@hide註解一樣有效,因爲它們也從SDK jar類中剝離。新@SystemApi註釋的含義是什麼,與@hide有什麼不同?

應用程序是否有可能以不同於舊的@hide API的方式調用它們。

/** 
* Indicates an API is exposed for use by bundled system applications. 
* <p> 
* These APIs are not guaranteed to remain consistent release-to-release, 
* and are not for use by apps linking against the Android SDK. 
* </p><p> 
* This annotation should only appear on API that is already marked <pre>@hide</pre>. 
* </p> 
* 
* @hide 
*/ 

回答

0

中的方法@SystemApi註釋是那些與@hide的子集。 這顯然是內部團隊(也可能是合作伙伴)的一個指標,即這些方法是實際的API,但不適用於公共開發者。

因此,@SystemApi方法比@hide方法更穩定,在未來任何時候都可以進行更改,而無需考慮任何兼容性,並且任何OEM都可以根據自己的意願更改它們。

如果您嘗試通過反射調用內部API,則始終首選@SystemApi方法以實現更好的未來兼容性。

15

@SystemApi@PrivateApi@hide

this commit@SystemApi是老@PrivateApi重命名。標記爲@hide的API不一定是@SystemApi,但@SystemApi需要@hide

有關@hide javadoc註釋的更多信息,this post給出了一個很好的答案。

根據我自己的實驗,一個(非系統應用程序)仍然可以訪問@hide API和領域使用Java反射像(來自this post):

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

WifiConfiguration config = new WifiConfiguration(); 
config.SSID = "AccessPointSSID"; 

Method method = manager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); 
method.invoke(manager, config, true); 

試圖訪問@SystemApi事情使用Java反射是不可能的(以下代碼將觸發invocationTargetException):

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

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

P.S.

WifiManager java code中,setWifiApEnabledgetPrivilegedConfiguredNetworks的API被定義爲:

/** 
* 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 */ 
@SystemApi 
public List<WifiConfiguration> getPrivilegedConfiguredNetworks() { 
    try { 
     return mService.getPrivilegedConfiguredNetworks(); 
    } catch (RemoteException e) { 
     return null; 
    } 
} 
+0

感謝您的解釋!在我的測試中,大多數使用'@SystemApi'和'@ hide'註釋的API(以前只有'@ hide'註解)仍然可以通過反射訪問。你的情況下'InvocationTargetException'的詳細信息是什麼? – 2014-12-07 11:57:01

+0

我使用Android 5.0在Nexus 5上做了實驗。 @ oasis-feng我猜''SystemApi'的行爲是版本相關的? – 2015-01-12 03:05:17

+0

我還使用Android 5.0.2在Nexus 5上測試了它。也許它不同於API到API。你可以粘貼你的InvocationTargetException的詳細消息嗎? – 2015-01-12 08:43:39