Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

Android 11의 패키지 공개 상태

Android 11에서는 앱이 사용자가 기기에 설치한 다른 앱을 쿼리하고 상호작용하는 방법을 변경합니다. 새로운 <queries> 요소를 사용하여 앱은 액세스할 수있는 다른 앱 집합을 정의할 수 있습니다. 이 요소를 통해 앱에 표시될 다른 앱을 시스템에 알려 최소 권한의 원칙을 촉진할 수 있습니다. 또한 Google Play와 같은 앱 스토어에서 앱이 사용자에게 제공하는 개인정보 보호 및 보안을 평가할 수 있습니다.

앱이 Android 11을 타겟팅하는 경우 앱의 매니페스트 파일에 <queries> 요소를 추가해야 할 수 있습니다. <queries> 요소 내에서 패키지 이름별 또는 인텐트 서명별로 앱을 지정할 수 있습니다.

<queries> 요소를 사용하면 앱이 상호작용해야 할 수도 있는 다른 앱을 설명할 수 있습니다. 단일 <queries> 요소 내에서 패키지 이름별 또는 인텐트 서명별로 앱을 지정할 수 있습니다. 특정 사용 사례를 처리하도록 다른 앱을 쿼리하는 방법에 관한 자세한 내용은 패키지 공개 상태 사용 사례 가이드를 참조하세요.

queryIntentActivities()와 같은 다른 앱에 관한 결과를 반환하는 PackageManager 메서드는 호출하는 앱의 <queries> 선언에 따라 필터링됩니다. 또한 startService()와 같은 다른 앱과의 명시적 상호작용을 위해서는 타겟 앱이 <queries>의 선언 중 하나와 일치해야 합니다.

Google은 항상 소중한 의견에 귀 기울이고 있습니다. 이 간단한 설문조사를 통해 기능 사용 방식을 알려주세요. 특히 이 기능의 영향을 받은 사용 사례에 관해 알려주세요.

환경 설정

<queries> 요소를 사용하는 앱을 빌드하려면 다음 도구를 사용하세요.

특정 패키지 쿼리 및 상호작용

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

<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> 요소 하나를 포함해야 합니다.
  • <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*)가 혼합된 경우를 지원하지 않습니다.

모든 앱 쿼리 및 상호작용

드물지만 포함하는 구성요소와 상관없이 기기에 설치된 모든 앱을 쿼리하거나 상호작용해야 할 수 있습니다. 앱에서 설치된 다른 모든 앱을 확인할 수 있도록 Android 11에는 QUERY_ALL_PACKAGES 권한이 도입되었습니다.

다음 목록은 QUERY_ALL_PACKAGES 권한을 포함하기에 적절한 사용 사례의 예입니다.

  • 런처 앱
  • 접근성 앱
  • 브라우저
  • P2P 공유 앱
  • 기기 관리 앱
  • 보안 앱

그러나 대부분의 상황에서 <queries> 요소를 선언하여 앱의 사용 사례를 실행할 수 있습니다. 사용자 개인정보 보호를 준수하기 위해 앱은 앱이 작동하는 데 필요한 패키지 공개 상태를 최소한으로 요청해야 합니다.

예정된 정책 업데이트에서 QUERY_ALL_PACKAGES 권한이 필요한 앱에 관한 가이드라인을 제공하는 Google Play를 확인하세요.

변경사항의 영향을 받지 않는 사용 사례

다음 목록에는 <queries> 선언이 필요하지 않은 여러 사용 사례가 포함되어 있습니다.

  • 타겟 앱이 자체 앱입니다.
  • 암시적 인텐트를 사용하여 활동을 시작합니다.
  • 앱이 핵심 Android 기능을 구현하는 특정 시스템 패키지(예: 미디어 제공업체)와 상호작용합니다.
  • 앱이 startActivityForResult() 메서드를 사용하여 개발자 앱을 실행합니다. 이 앱은 개발자 앱에 자동으로 표시됩니다.
  • 앱이 개발자 앱의 서비스를 시작하거나 서비스에 바인드됩니다. 이 앱은 개발자 앱에 자동으로 표시됩니다.
  • 앱이 개발자 앱의 콘텐츠 제공업체에 요청합니다. 이 앱은 개발자 앱에 자동으로 표시됩니다.

패키지 필터링의 로그 메시지

패키지 공개 상태의 변경사항이 앱에 어떤 영향을 미치는지 자세히 알아보려면 패키지 필터링의 로그 메시지를 사용 설정하면 됩니다. Android 스튜디오에서 테스트 앱 또는 디버그 가능한 앱을 개발하고 있다면 이 기능이 사용 설정됩니다. 그 외에는 터미널 창에서 다음 명령어를 실행하여 수동으로 사용 설정할 수 있습니다.

adb shell pm log-visibility --enable PACKAGE_NAME

그러면 패키지가 PackageManager 객체의 반환 값에서 필터링될 때마다 Logcat의 다음과 유사한 메시지가 표시됩니다.

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

변경사항 테스트

이 동작 변경사항이 앱에 적용되었는지 테스트하려면 다음 단계를 완료하세요.

  1. Android 스튜디오 3.6.1 이상을 설치합니다.
  2. Android 스튜디오에서 지원하는 최신 버전의 Gradle을 설치합니다.
  3. 앱의 targetSdkVersion30로 설정합니다.
  4. 앱의 매니페스트 파일에 <queries> 요소를 포함하지 않습니다.
  5. getInstalledApplications() 또는 getInstalledPackages()를 호출합니다. 두 메서드는 모두 필터링된 목록을 반환해야 합니다.
  6. 작동하지 않는 앱 기능을 확인합니다.
  7. 적절한 <queries> 항목을 도입하여 이러한 기능을 수정합니다.