web-dev-qa-db-ja.com

新しい@SystemApiアノテーションの意味は何ですか?@hideとの違いは何ですか?

Androidは最近、SDKソースコードに@SystemApiを導入しました。 SDK jarクラスからも削除されているため、以前の@hideアノテーションと同じように機能しているようです。

アプリが古い@hideAPIとは異なる方法でそれらを呼び出すことができる可能性はありますか?.

/**
 * 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
 */
15
Oasis Feng

@SystemApiアノテーションが付けられたメソッドは、@ hideアノテーションが付けられたメソッドのサブセットです。パブリック開発者向けではありませんが、これらのメソッドが実際のAPIであることは、内部チーム(おそらくパートナーも)にとって明らかに指標です。

その結果、@ SystemApiメソッドは@hideメソッドよりも安定します。@ hideメソッドは、互換性を考慮せずに将来いつでも変更できます。また、OEMは自由に変更できます。

リフレクションを介して内部APIを呼び出そうとしている場合は、将来の互換性を高めるために、常に@SystemApiメソッドを優先してください。

4
Oasis Feng

_@SystemApi_、_@PrivateApi_および_@hide_

このコミット によると、_@SystemApi_は古い_@PrivateApi_の名前を変更したものです。 _@hide_とマークされたAPIは必ずしも_@SystemApi_である必要はありませんが、_@SystemApi_には_@hide_が必要です。

_@hide_ javadocアノテーションの詳細については、 この投稿 が適切な回答を提供します。

私自身の実験に基づくと、1つ(非システムアプリケーション)は引き続き_@hide_ APIとフィールドにアクセスできます Javaリフレクションを使用して(from この郵便受け ):

_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コード では、setWifiApEnabledおよびgetPrivilegedConfiguredNetworksAPIは次のように定義されています。

_/**
 * 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;
    }
}
_
25
Moony Chou