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


120

以下のためのActivityソースコード、行3898(底に近いです)。

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

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

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

回答:


182

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

1
こんにちは@StarPinkER私は「android.permission.CHANGE_COMPONENT_ENABLED_STATE」許可を非表示または内部のAPIを使用して、またはリフレクションによって付与できますか?
Hardik 2014

1
最初にこの答えを確認してください。この権限は、署名/システム権限です。ほとんどの場合、システムアプリケーションでない限り、この権限を取得できません。つまり、アプリを受け入れるか、アプリをシステムアプリにして署名するようにAndroidソースを変更する必要があります。ただし、独自のAndroidシステムを作成しない限り、これを行うことはできません。Reflectionは「非表示」を処理できますが、Androidセキュリティシステムのロジックを変更することはできません。これができれば、Androidデバイスを簡単に攻撃できる方法を想像できます。@Hardik
StarPinkER

2
回答ありがとうございます。回答には2つの問題があると思います。間違っている場合は訂正してください。「android.app.ActivityManager」ではなく「ActivityManager」で検索しようとするとclassnotfoundエラーが発生し、静的メソッドの場合「m.invoke(c、」は「m.invoke(null」)である必要があります。 invoke(o、 "、ここでoは動的メソッドのc型のオブジェクトです。ポーランド語の文法では申し訳ありません:)
lindenrovio

3
リフレクションに関する注意事項:これらのメソッド/フィールドは公式SDKの一部ではないため、将来のAndroidリビジョンに存在するという保証はありません。
sstn 2014年

2
アノテーションがドキュメントからメソッドを削除するだけの場合、なぜコードでそれをまだ使用できないのですか?
Javier Delgado

25
  1. @hideさまざまな理由で表示される必要があるものの、公開されたAPIの一部ではないものに使用されます。ソースからAPIを自動的に抽出する場合、それらはドキュメントに含まれません。

  2. あなたは正しい、あなたはそれを上書きすることはできません。としてマークされてfinalいるため、これは仕様によるものです。あなたはそれを使用できるはずですが、エディターはそれがでマークされているため、使用するインテリセンスの選択肢の1つとして表示しない場合があり@hideます。また、以下の3の点に注意してください。

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


ああそう... finalもちろんそれを上書きすることはできません。すみません、それは私の間違いです:x
midnite 2013年

publicつまり、開発段階ではすべてのクラスに渡っています。しかし、それは私たちのように、privateまたは/*package*/私たちのようなユーザーに対して機能しますか?
midnite 2013年

うーん...それは単なるコメントです。私はその意味を理解しています。しかし、コードレベルでこの動作を強制するために何をどこで行うのでしょうか。
midnite 2013年

1
なぜそれが公開されているの、私はコメントできません。多分実装するコードActivityは多くのクラスに分散していて、すべてがこのメンバーにアクセスする必要があります。結論としては、それ公開されていますが、APIの一部ではないため、自己責任で使用してください。
paxdiablo 2013年

1
@ midnite、Eclipseには独自のJavaコンパイラーがあり、Intellisenseのものと間違いなく統合されています。これをJava SDKでコンパイルした場合、問題なくコンパイルできます。私はもちろん、このことを示唆しています、ポイント3を見ていないこと
paxdiablo

4

@hide注釈は、このインターフェースは、パブリックAPIの一部ではなく、あなたのコードでは使用すべきではないということを意味します。これらのメソッドは、AOSPの内部使用のみを目的としています。

Googleは実際には非SDKインターフェースの使用制限し始めています。これには、@hide

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.