Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

Android 11 でのパッケージへのアクセス

Android 11 では、デバイス上にユーザーがインストールした別のアプリに対してアプリがクエリまたは操作を行う方法が変更されています。新しい <queries> 要素を使用することで、アプリはアクセス可能なその他のアプリのセットを定義できます。この要素により、アプリに他のどのアプリを認識させるかがシステムに指示され、最小限の権限の原則が促進されます。また、Google Play などのアプリストアが、アプリがユーザーに提供するプライバシーとセキュリティを評価するのに役立ちます。

Android 11 以降をターゲットとしているアプリの場合は、アプリのマニフェスト ファイルに <queries> 要素が必要になることがあります。<queries> 要素内では、パッケージ名インテント シグネチャ、またはプロバイダ オーソリティによってアプリを指定できます。

<queries> 要素を使用すると、アプリから別のアプリを操作する必要がある場合に、そのアプリを指定できます。複数のアプリのパッケージ名またはインテント シグネチャを 1 つの <queries> 要素に指定できます。 特定のユースケースに対応するために他のアプリをクエリする方法については、パッケージへのアクセスのユースケースのガイドをご覧ください。

別のアプリに関する結果を返す PackageManager のメソッド(queryIntentActivities() など)は、呼び出し元のアプリの <queries> の宣言に基づいてフィルタされます。別のアプリへの明示的な操作(startService() など)では、その対象アプリが <queries> 内の宣言のいずれかに一致することも必要です。

環境をセットアップする

<queries> 要素を使用するアプリをビルドするには、次のツールを使用します。

特定のパッケージに対するクエリと操作

別のアプリがご自身のアプリに統合される場合や、ご自身のアプリが別のアプリのサービスを使用する場合など、アプリがクエリや操作を行う特定のアプリのセットについて把握している場合、そのパッケージ名を指定した <package> 要素のセットを <queries> 要素に含めます。

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

インテント フィルタが指定されたアプリに対するクエリと操作

アプリが特定の目的を果たすアプリのセットに対してクエリや操作を行う必要があっても、指定するその個々のパッケージ名がわからない場合があります。その場合は、インテント フィルタのシグネチャのリストを <queries> 要素に指定できます。それにより、アプリは一致する <intent-filter> 要素を持つアプリを見つけることができます。

次の例でアプリは、JPEG 画像の共有をサポートするインストール済みのアプリを見つけることができます。

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

<intent> 要素には以下のような制限があります。

  • <action> 要素は 1 つだけ含める必要があります。
  • <data> 要素内で pathpathPrefixpathPatternport の各属性を使用することはできません。各属性の値を汎用のワイルドカード文字(*)に設定した場合と同じように動作することになります。
  • <data> 要素の mimeGroup 属性は使用できません。
  • 1 つの <intent> 要素の複数の <data> 要素にわたって、以下の各属性を 1 回だけ使用できます。

    • mimeType
    • scheme
    • host

    これらの属性は複数の <data> 要素に分散させることも、1 つの <data> 要素で使用することもできます。

<intent> 要素は、属性の値として以下の汎用のワイルドカード文字(*)をサポートしています。

  • <action> 要素の name 属性。
  • <data> 要素の mimeType 属性のサブタイプ(image/*)。
  • <data> 要素の mimeType 属性のタイプとサブタイプ(*/*)。
  • <data> 要素の scheme 属性。
  • <data> 要素の host 属性。

前のリストで特に指定されていない限り、システムはテキストとワイルドカード文字(prefix* など)の組み合わせに対応していません。

プロバイダ オーソリティが指定されたアプリに対するクエリと操作

コンテンツ プロバイダにクエリする必要があるものの、具体的なパッケージ名がわからない場合は、次のスニペットに示すように、<provider> 要素でプロバイダ オーソリティを宣言できます。

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

複数のプロバイダ オーソリティを 1 つの <queries> 要素で宣言できます。そのためには、次のいずれかを行います。

  • 単一の <provider> 要素で、セミコロン区切りのオーソリティのリストを宣言します。
  • 複数の <provider> 要素をすべて同じ <queries> 要素内に含めます。各 <provider> 要素で、1 つのオーソリティ、またはセミコロン区切りのオーソリティのリストを宣言します。

すべてのアプリに対するクエリと操作

まれなケースですが、アプリがデバイス上のインストール済みのアプリの「すべて」に対して、各アプリに含まれるコンポーネントによらず、クエリや操作を行うことが必要になる場合があります。Android 11 では、アプリがインストール済みの他のすべてのアプリを見つけられるように、QUERY_ALL_PACKAGES 権限が導入されました。

QUERY_ALL_PACKAGES 権限を含めたほうがよいユースケースの例を以下に示します。

  • ランチャー アプリ
  • ユーザー補助機能を利用できるアプリ
  • ブラウザ
  • ピアツーピア(P2P)共有アプリ
  • デバイス管理アプリ
  • セキュリティ アプリ

ほとんどの場合、<queries> 要素を宣言することで、アプリのユースケースを実現できます。ユーザーのプライバシーを尊重し、アプリの動作に最低限必要な範囲で、パッケージへのアクセスをリクエストしてください。

今後のポリシー更新では、QUERY_ALL_PACKAGES 権限を必要とするアプリのガイドラインを Google Play で提供する予定です。

変更の影響を受けないユースケース

<queries> の宣言を必要としないユースケースの例を以下に示します。

  • 対象のアプリが自分のアプリの場合
  • インテントを使用してアクティビティを開始する場合
  • メディア プロバイダなど、Android のコア機能を実装する特定のシステム パッケージをアプリが操作する場合。
  • 対象のアプリが自分のアプリをインストールした場合。自分のアプリの InstallSourceInfo オブジェクトで、getInitiatingPackageName()getInstallingPackageName() の呼び出しで返されたアプリを確認できます。
  • 他のアプリが startActivityForResult() メソッドを使用して自分のアプリを起動する場合(そのアプリは自動的に自分のアプリから参照可能になります)
  • 他のアプリが自分のアプリ内のサービスを開始またはバインドする場合(そのアプリは自動的に自分のアプリから参照可能になります)
  • 他のアプリが自分のアプリ内のコンテンツ プロバイダにリクエストを送信する場合(そのアプリは自動的に自分のアプリから参照可能になります)
  • 自分のアプリがインプット メソッド エディタ(IME)であり、別のアプリに対する入力を提供する場合(そのアプリは自動的に自分のアプリから参照可能になります)

パッケージ フィルタリングのログメッセージ

パッケージへのアクセスの変更がアプリに及ぼす影響の詳細を確認するには、パッケージ フィルタリングのログ メッセージを有効にします。Android Studio でテストアプリやデバッグ可能なアプリを開発している場合は、この機能は自動的に有効になります。それ以外の場合は、ターミナル ウィンドウで次のコマンドを実行すると、手動で有効にできます。

adb shell pm log-visibility --enable PACKAGE_NAME

その後で、パッケージが PackageManager オブジェクトの戻り値からフィルタされるたびに、Logcat に次のようなメッセージが表示されます。

I/AppsFilter: interaction: PackageSetting{7654321 \
  com.example.myapp/12345} -> PackageSetting{...} BLOCKED

変更をテストする

この動作の変更がアプリで有効になっているかどうかは、次の手順で確認できます。

  1. Android Studio 3.6.1 以上をインストールします。
  2. Android Studio がサポートしている最新バージョンの Gradle をインストールします。
  3. アプリの targetSdkVersion30 に設定します。
  4. アプリのマニフェスト ファイルに <queries> 要素は含めないでください。
  5. getInstalledApplications() または getInstalledPackages() を呼び出します。どちらのメソッドも、フィルタされたリストを返します。
  6. アプリのどの機能が動作していなかを確認します。
  7. 適切な <queries> のエントリを含めて、その機能を修正してください。