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
*/
@SystemApiアノテーションが付けられたメソッドは、@ hideアノテーションが付けられたメソッドのサブセットです。パブリック開発者向けではありませんが、これらのメソッドが実際のAPIであることは、内部チーム(おそらくパートナーも)にとって明らかに指標です。
その結果、@ SystemApiメソッドは@hideメソッドよりも安定します。@ hideメソッドは、互換性を考慮せずに将来いつでも変更できます。また、OEMは自由に変更できます。
リフレクションを介して内部APIを呼び出そうとしている場合は、将来の互換性を高めるために、常に@SystemApiメソッドを優先してください。
@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);
_
WifiManager
Javaコード では、setWifiApEnabled
およびgetPrivilegedConfiguredNetworks
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;
}
}
_