1. ホーム
  2. android

[解決済み] Androidのソースコードにある@hideの意味とは?

2022-07-16 01:29:31

質問

について Activity ソースコード の、3898行目(一番下に近いところ)。

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

は何をするのか @hide は何を意味するのでしょうか?

私は自分の public class ChildActivity extends Activity { ... } が使えない/見えない Activity.isResumed() . これは正常ですか?どうすればアクセスできるのでしょうか?

どのように解決するのですか?

Androidには、SDKからアクセスできないAPIが2種類あります。

1つ目は、パッケージ com.android.internal . 2つ目のAPIタイプは、クラスとメソッドの集まりで、マークされた @hide Javadoc 属性 .

Android 9 (API レベル 28) から、Google は 非 SDK インターフェイスの使用に関する新しい制限事項 直接、リフレクション、または JNI を介してかどうかにかかわらず。これらの制限は、アプリが非 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});