사전 설치된 시스템 패키지

Android는 하나의 기기를 여러 사용자가 사용할 수 있는 기능을 지원합니다. 자세한 내용은 여러 사용자 지원을 참고하세요. 모든 유형의 Android 사용자에게 모든 시스템 패키지가 유용하지는 않으므로 허용 목록을 사용하여 각 사용자 유형에 맞게 사전 설치되어야 하는 시스템 패키지를 지정할 수 있습니다. 불필요한 시스템 패키지를 사전 설치하지 않으므로 사용자 생성 시간, 시작 시간 및 메모리 사용량을 최적화하는 것이 가능합니다.

frameworks/base/data/etc/preinstalled-packages-platform.xml에 모델링된 시스템 구성 XML 파일을 사용하여 신규 사용자의 사용자 유형에 맞게 초기에 설치되어야 하는 시스템 패키지를 선언합니다. 기기의 모든 시스템 패키지에는 정적 오버레이를 제외하고 XML 파일에 항목 매니페스트 이름으로 키가 지정된 항목이 있는 것이 좋습니다. 정적 오버레이는 해당 오버레이 타겟 패키지의 항목에 따라 자동으로 처리됩니다. 기기에서 여기에 나열되지 않은 시스템 패키지를 처리하는 방식은 구성 모드를 통해 제어됩니다.

사용자 유형

기본 사용자 유형(모든 사용자가 다음 유형 중 하나 이상에 해당함)은 다음과 같습니다.

사용자 유형 설명
SYSTEM User 0.
FULL 프로필이 없는 실제 사용자
PROFILE 프로필이 있는 실제 사용자

각 값의 정확한 의미는 frameworks/base/core/java/android/content/pm/UserInfo.java에 정의되어 있습니다.

모든 사용자는 frameworks/base/core/java/android/os/UserManager.java에 정의된 AOSP 사용자 유형 및 frameworks/base/services/core/java/com/android/server/pm/UserTypeFactory.java.에 정의된 OEM 맞춤 사용자 유형을 포함하여 정확히 이러한 사용자 유형 중 하나이므로, 개별 사용자 유형을 지정하여 더 상세히 제어할 수 있습니다. 더 자세한 내용은 사용자 유형 페이지를 참고하세요. 현재 AOSP 사용자 유형은 다음과 같습니다.

  • android.os.usertype.full.SYSTEM
  • android.os.usertype.full.SECONDARY
  • android.os.usertype.full.GUEST
  • android.os.usertype.full.DEMO
  • android.os.usertype.full.RESTRICTED
  • android.os.usertype.profile.MANAGED
  • android.os.usertype.system.HEADLESS

다음 예에서는 가장 일반적인 사용 사례를 다룹니다.

  1. User 0에 사전 설치되는 시스템 패키지:
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM" />
     </install-in-user-type>
    
  2. 웹브라우저와 같이 모든 실제 사용자를 대상으로 사전 설치되는 시스템 패키지(즉, 모든 실제 사용자에 해당하는 FULL 또는 PROFILE 사용자 유형을 대상으로 설치됨):
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
    
  3. 프로필 사용자를 제외한 모든 실제 사용자를 대상으로 사전 설치되는 시스템 패키지: 예를 들어, 배경화면 앱에 적용할 수 있습니다.
    <install-in-user-type package="com.android.example">
        <install-in user-type="FULL" />
    </install-in-user-type>
    
  4. 일부 시스템 패키지는 유형과 관계없이 모든 사용자에게 필요합니다. 이러한 경우에는 다음을 사용합니다.
    <install-in-user-type package="com.android.example">
        <install-in user-type="SYSTEM">
        <install-in user-type="FULL" />
        <install-in user-type="PROFILE" />
    </install-in-user-type>
    
  5. 개별 사용자 유형을 지정하여 더 상세한 옵션을 사용할 수도 있습니다. 예를 들어, 다음 샘플 코드에서는 사용자 유형이 관리 프로필이거나 게스트 또는 SYSTEM 기본 유형인 사용자를 대상으로 이 패키지를 설치합니다.
    <install-in-user-type package="com.android.example">
        <install-in user-type="android.os.usertype.profile.MANAGED" />
        <install-in user-type="android.os.usertype.full.GUEST" />
        <install-in user-type="SYSTEM">
    </install-in-user-type>
    

do-not-install-in 태그

또한 do-not-install-in 태그를 사용하여 특정 사용자 유형을 대상으로 패키지가 사전 설치되지 않도록 할 수도 있습니다. do-not-install-in 태그는 모든 파일의 install-in 태그보다 우선 적용됩니다. 예:

<install-in-user-type package="com.android.example">
    <install-in user-type="FULL" />
    <do-not-install-in user-type="android.os.usertype.full.GUEST"/>
</install-in-user-type>
사용자가 android.os.usertype.full.GUEST 유형(FULL의 하위유형)이면 do-not-install-in 태그가 install-in보다 우선하므로 이 패키지가 설치되지 않습니다.

config.xml로 동작 제어

구성 리소스 값인 config_userTypePackageWhitelistMode는 이 기능을 제어하고 기기에서 사용자 유형에 관한 항목이 없는 시스템 패키지를 해석하는 방법을 결정합니다. 자세한 내용은 frameworks/base/core/res/res/values/config.xml#config_userTypePackageWhitelistMode를 참고하세요.

frameworks/base/core/res/res/values/config.xml에서 config_userTypePackageWhitelistMode라는 정수를 다음 값의 조합으로 설정합니다. 이러한 플래그를 조합할 수 있습니다. 가장 중요한 플래그는 다음과 같습니다.

설명
0 (0b0000) 사용 중지: 모든 시스템 패키지를 설치합니다.
1 (0b0001) 시행: 허용 목록에 있는 경우에만 시스템 패키지를 설치합니다.
4 (0b0100) 허용 목록 파일에 언급되지 않은 패키지는 암시적으로 허용 목록에 추가된 것으로 간주합니다.
8 (0b1000) 허용 목록 파일에 언급되지 않은 패키지는 암시적으로 SYSTEM 사용자의 허용 목록에 추가된 것으로 간주합니다.

다음 구성은 (install-indo-not-install-in 태그를 준수하도록) 이 기능을 사용 설정하지만, 언급되지 않은 시스템 패키지는 모든 사용자의 install-in인 것처럼 취급합니다.

<integer name="config_userTypePackageWhitelistMode">5</integer>