패키지 공개 상태 요구사항 선언

앱을 만들 때는 앱이 상호작용해야 하는 기기의 다른 앱을 고려하는 것이 중요합니다. 앱이 Android 11(API 수준 30) 이상을 타겟팅한다면 시스템에서 일부 앱을 내 앱에 자동으로 표시하지만 어떤 앱은 기본적으로 필터링됩니다. 이 가이드에서는 필터링되는 앱을 내 앱에 표시하는 방법을 설명합니다.

앱이 Android 11 이상을 타겟팅하며 자동으로 표시되는 앱이 아닌 다른 앱과 상호작용해야 한다면 앱의 매니페스트 파일에 <queries> 요소를 추가하세요. 다음 섹션에서 설명한 대로 <queries> 요소 내에 패키지 이름, 인텐트 서명 또는 제공자 권한으로 다른 앱을 지정합니다.

특정 패키지 이름

쿼리하거나 상호작용하려는 특정 앱(예: 내 앱과 통합된 앱 또는 내가 사용 중인 서비스를 제공하는 앱)을 알고 있다면 <queries> 요소 내의 <package> 요소 집합에 패키지 이름을 포함합니다.

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

라이브러리의 호스트 앱과 통신

Android 라이브러리를 개발한다면 AAR 매니페스트 파일<queries> 요소를 추가하여 패키지 공개 상태 요구사항을 선언할 수 있습니다. 이 <queries> 요소는 앱이 자체 매니페스트에서 선언할 수 있는 요소와 기능이 동일합니다.

라이브러리에 바인드된 서비스 사용과 같은 호스트 앱과의 통신이 포함된 경우 호스트 앱의 패키지 이름을 지정하는 <package> 요소를 포함하세요.

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

이 선언을 포함하면 호스트 앱이 설치되어 있는지 확인하고 bindService()를 호출하는 등의 방식으로 호스트 앱과 상호작용할 수 있습니다. 라이브러리를 사용하는 호출 앱은 이 상호작용의 결과로 호스트 앱에 자동으로 공개됩니다.

인텐트 필터 서명과 일치하는 패키지

앱이 특정 용도로 사용되는 앱 집합을 쿼리하거나 상호작용해야 할 수 있습니다. 그런데 포함할 구체적인 패키지 이름을 모를 수 있습니다. 이럴 때는 <queries> 요소에 인텐트 필터 서명을 나열하면 됩니다. 그러면 <intent-filter> 요소와 일치하는 요소가 있는 앱을 찾을 수 있습니다.

다음 코드 예에는 앱에서 JPEG 이미지 공유를 지원하는 설치된 다른 앱을 볼 수 있게 해주는 <intent> 요소가 나와 있습니다.

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

<intent> 요소에는 몇 가지 제한사항이 있습니다.

  • 정확히 <action> 요소 하나를 포함해야 합니다.
  • <data> 요소에서 path, pathPrefix, pathPattern 또는 port 속성을 사용할 수 없습니다. 시스템은 각 속성 값을 일반 와일드 카드 문자(*)로 설정한 것처럼 동작합니다.
  • <data> 요소의 mimeGroup 속성을 사용할 수 없습니다.
  • 단일 <intent> 요소의 <data> 요소 내에서 다음 각 속성을 최대 한 번 사용할 수 있습니다.

    • mimeType
    • scheme
    • host

    이러한 속성을 여러 <data> 요소 전체에 배포하거나 단일 <data> 요소에서 사용할 수 있습니다.

<intent> 요소는 일반 와일드 카드 문자(*)를 몇 가지 속성의 값으로 지원합니다.

  • <action> 요소의 name 속성
  • <data> 요소(image/*)의 mimeType 속성의 하위유형
  • <data> 요소(*/*)의 mimeType 속성의 유형 및 하위유형
  • <data> 요소의 scheme 속성
  • <data> 요소의 host 속성

이전 목록에 달리 지정되지 않은 한 시스템에서는 텍스트와 와일드 카드 문자의 혼합(예: prefix*)을 지원하지 않습니다.

특정 권한을 사용하는 패키지

콘텐츠 제공자를 쿼리해야 하지만 구체적인 패키지 이름을 모르는 경우 다음 스니펫과 같이 <provider> 요소에서 제공자 권한을 선언할 수 있습니다.

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

단일 <queries> 요소에 제공자 권한을 선언할 수 있습니다. <queries> 요소 내에서 <provider> 요소를 하나 이상 선언할 수 있습니다. <provider> 요소에는 단일 제공업체 권한 또는 세미콜론으로 구분된 제공업체 권한 목록이 포함될 수 있습니다.

모든 앱(권장되지 않음)

드문 경우지만, 포함하는 구성요소와 상관없이 기기에 설치된 모든 앱을 쿼리하거나 상호작용해야 할 수 있습니다. 앱이 설치된 모든 앱을 확인할 수 있도록 허용하려면 시스템에서 QUERY_ALL_PACKAGES 권한을 제공합니다.

QUERY_ALL_PACKAGES 권한이 포함되기에 적절한 사용 사례의 예는 다음과 같습니다.

  • 접근성 앱
  • 브라우저
  • 기기 관리 앱
  • 보안 앱
  • 바이러스 백신 앱

하지만 대개는 자동으로 표시되는 일련의 앱과 상호작용하고 매니페스트 파일에 앱이 액세스해야 하는 다른 앱을 선언하여 앱의 사용 사례를 충족할 수 있습니다. 사용자 개인 정보 보호를 준수하기 위해 앱은 작동하는 데 필요한 패키지 공개 상태를 최소한으로 요청해야 합니다.

Google Play의 정책 업데이트QUERY_ALL_PACKAGES 권한이 필요한 앱에 관한 가이드라인을 제공합니다.