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});