web-dev-qa-db-ja.com

Androidソースコードで@hideはどういう意味ですか?

Activityソースコード の場合、3898行目(一番下に近い):

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

@hideはどういう意味ですか?

public class ChildActivity extends Activity { ... }Activity.isResumed()を使用/表示できないことがわかりました。これは正常ですか?どうすればアクセスできますか?

110
midnite

Androidには、SDKを介してアクセスできない2種類のAPIがあります。

最初のものはパッケージcom.Android.internalにあります。 2番目のAPIタイプは、 @ hide Javadoc属性 でマークされたクラスとメソッドのコレクションです。

Android 9(APIレベル28)以降、Googleは SDK以外のインターフェースの使用に関する新しい制限 を導入します。直接、リフレクション、またはJNIを介して。これらの制限は、アプリが非SDKインターフェイスを参照するか、リフレクションまたはJNIを使​​用してハンドルを取得しようとするたびに適用されます。

ただし、APIレベル28以前では、Javaリフレクションを介して隠しメソッドにアクセスできました。 @hide属性はJavadoc(droiddocも)の一部であるため、@hideは単にメソッド/クラス/フィールドがAPIドキュメントから除外されることを意味します。

たとえば、ActivityManager.JavacheckUidPermission()メソッドは@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});
171
StarPinkER
  1. @hideは、さまざまな理由で表示する必要があるが、公開されたAPIの一部であるnotに使用されます。ソースからAPIを自動的に抽出する場合、ドキュメントに含まれません。

  2. あなたは正しい、あなたはそれをオーバーライドすることはできません。 finalとしてマークされているため、これは仕様です。 seできるはずです。ただし、@hideでマークされているため、エディターは使用するインテリセンスの選択肢の1つとして表示しない場合があります。以下のポイント3。

  3. not APIの一部ではなく、開発者はいつでも削除できるため、まったく使用しないでください。彼らはサディスティックに傾いた場合、それを実行したデバイスをブロックする機能に置き換えるために、彼らの権利の範囲内にさえいるでしょう(ただし、厳密な法的意味ではないかもしれません)。

22
paxdiablo

@hide注釈は、このインターフェイスがパブリックAPIの一部ではないことを意味し、コードで使用しないでください。メソッドは、AOSPの内部使用専用です。

Googleは実際に 非SDKインターフェイスの使用を制限する を開始しました。これには、@hideでマークされたインターフェイスが含まれます

メソッドは4つのリストに分類されます。

  • ホワイトリスト:SDK
  • light-greylist:まだアクセス可能な非SDKメソッド/フィールド。
  • ダークグレーリスト:
    • ターゲットSDKがAPIレベル28未満のアプリの場合:ダークグレーリストインターフェイスの使用はそれぞれ許可されます。
    • ターゲットSDKがAPIレベル28以上のアプリの場合:ブラックリストと同じ動作
  • ブラックリスト:ターゲットSDKに関係なく制限されています。プラットフォームは、インターフェイスが存在しないかのように動作します。たとえば、アプリが使用しようとするたびにNoSuchMethodError/NoSuchFieldExceptionをスローし、アプリが特定のクラスのフィールド/メソッドのリストを知りたい場合はNoSuchMethodError/NoSuchFieldExceptionをスローしません。

リストはここにあります: https://Android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

1
leonardkraemer