システム パッケージのプリインストール

Android では、1 台のデバイスで複数のユーザーをサポートします。詳細については、複数ユーザーのサポートをご覧ください。すべてのシステム パッケージがすべてのタイプの Android ユーザーにとって有用とは限らないため、許可リストを使用して、プリインストールする必要があるシステム パッケージをユーザーのタイプごとに指定できます。不要なシステム パッケージをプリインストールしないことで、ユーザーの作成時間、開始時間、メモリ使用量を最適化できます。

frameworks/base/data/etc/preinstalled-packages-platform.xml でモデル化されたシステム構成 XML ファイルを使用し、新規ユーザーに最初にインストールする必要があるシステム パッケージをユーザータイプに基づいて宣言します。デバイス上のすべてのシステム パッケージには、対応するオーバーレイ ターゲット パッケージのエントリに基づいて自動的に処理される静的オーバーレイを除き、XML ファイルのエントリ(マニフェスト名がキー)が含まれているのが理想的です。 ここに記載されていないシステム パッケージをデバイスで処理する方法は、構成モードによって管理されます。

ユーザータイプ

基本のユーザータイプ(すべてのユーザーがこれらのうち少なくとも 1 つのタイプになります):

ユーザータイプ 説明
SYSTEM ユーザー 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 カスタム ユーザータイプを含む)のいずれか 1 つに該当します。個別のユーザータイプを指定することで、きめ細かい管理が可能になります。詳しくは、ユーザータイプのページをご覧ください。現在のところ、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. システム パッケージをユーザー 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-in タグと do-not-install-in タグは遵守されます)。ただし、記載されていないシステム パッケージは、すべてのユーザーについて install-in のように扱われます。

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