Android には、SDK 経由ではアクセスできない 2 種類の API があります。
最初のものは package にありますcom.android.internal
。2 番目の API タイプは、 @hide Javadoc 属性でマークされたクラスとメソッドのコレクションです。
Android 9 (API レベル 28) 以降、Google は直接、リフレクション経由、または JNI 経由の非 SDK インターフェースの使用に関する新しい制限を導入しています。これらの制限は、アプリが非 SDK インターフェイスを参照するか、リフレクションまたは JNI を使用してそのハンドルを取得しようとするたびに適用されます。
しかし、API レベル 28 より前では、非表示のメソッドには Java リフレクションを介してアクセスできました。@hide
属性は Javadoc (droiddoc も) の一部にすぎないため、単に@hide
メソッド/クラス/フィールドが API ドキュメントから除外されていることを意味します。
たとえば、 のcheckUidPermission()
メソッドは次をActivityManager.java
使用し@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});