ストアやインストーラでインストールされたアプリの場合、そのストアやインストーラはアプリの最終的なインストーラを意味する「記録上のインストーラ」と見なされます。Android 14 まで、Android は別のストアやアプリ インストーラが記録上のインストーラになること、およびそれらがユーザーに通知せずにアプリを更新することを認めていました。
Android 14 では、アプリの最初のインストーラが、自身を「アップデート オーナー」と宣言して、アプリのアップデートを所有することができます。別のインストーラがアプリを更新しようとすると、更新に進む前に新しいアップデートを承認する機会がユーザーに付与されます。
アップデート オーナー権限にパッケージをオプトインする
ストアやインストーラがアプリ パッケージを所有することを宣言するには、以下のように、パッケージごとに sysconfig
XML に update-ownership
を追加します。
<update-ownership package="com.example.application" installer="com.example.installer" />
上記の例では、com.example.application
が所有対象のアプリ パッケージで、com.example.installer
がパッケージのオーナーです。パッケージをアップデート オーナー権限にオプトインした場合、権限のある他のストアやインストーラがアプリを更新するにはアップデート オーナーを処理してユーザーの同意を得ることが必要になります。
オーナー権限の変更からパッケージをオプトアウトする
APK で拒否リストを指定することで、ストアやインストーラが更新できないようアップデート オーナーの変更からパッケージのサブセットをオプトアウトできます。拒否リストにパッケージを追加すると、ストアやインストーラはパッケージのアップデート オーナー権限をリクエストできなくなります。
別のストアやインストーラが更新できないようパッケージをオプトアウトするには:
元のストアまたはインストーラの
AndroidManifest.xml
ファイルに以下のプロパティを追加します。<application …> <property android:name="android.app.PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST" android:resource="@xml/legacyOwnershipDenylist" /> </application>
上記の例で、XML 拒否リストは
legacyOwnershipDenylist
です。拒否リストは以下の形式で未加工の XML リソースとして作成します。
<deny-ownership>com.example.app1</deny-ownership> <deny-ownership>com.example.app2</deny-ownership>
拒否リストにあるパッケージのオーナー権限をストアやインストーラがリクエストしても、オーナー権限は付与されません、パッケージはインストールされますが、どのインストーラもオーナーにはなりません。さらに、インストーラにかかわらず、誰も拒否リストにあるアプリのオーナーになることはできません。
拒否リスト内の一連のパッケージは、そのリストを指定したインストーラ APK を更新することで変更できます。インストーラが更新されると、その後拒否リストに追加されたパッケージに設定されたオーナー権限はすべてクリアされます。このように、拒否リストにあるアプリ パッケージの今後の更新にユーザーの介入は必要なくなります。
アップデート オーナーを処理してユーザーの同意を得る
Android 14 では、ストアやアプリ インストーラに android.permission.INSTALL_PACKAGES
権限があっても、別のストアまたはインストーラがアップデートのオーナーであるアプリを更新する場合は、STATUS_PENDING_USER_ACTION
状態を処理する必要があります。
InstallAPKSessionApi.java
サンプルアプリに STATUS_PENDING_USER_ACTION
を処理する方法も示されています。
プリロードされたアプリのオーナー権限を設定する
一般に、プリロードされたアプリを所有しているのは特定のインストーラではありません。代わりに、アップデート オーナー権限にパッケージをオプトインするで説明したように、プリロードされたアプリには、システム設定を使用して新しいオーナーが割り当てられます。