Androidには、SDKを介してアクセスできない2種類のAPIがあります。
最初のものはパッケージにあります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});