配置和处理应用的更新所有权

当应用由商店或安装程序安装时,该商店或安装程序被视为“记录安装程序”,即应用的最后一个安装程序。在 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 中提供拒绝列表,选择一部分软件包退出更新所有权变更。通过将软件包包含在此列表中,任何商店或安装程序都无法请求该软件包的更新所有权。

要选择软件包退出被其他商店或安装程序更新

  1. 请在原始商店或安装程序的 AndroidManifest.xml 文件中包含以下属性

    <application …>
      <property android:name="android.app.PROPERTY_LEGACY_UPDATE_OWNERSHIP_DENYLIST"
                android:resource="@xml/legacyOwnershipDenylist" />
    </application>
    

    此示例引用了一个名为 legacyOwnershipDenylist 的 XML 拒绝列表。

  2. 创建格式如下的原始 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

为预加载的应用建立所有权

预加载的应用通常不属于特定的安装程序。而是使用系统配置为预加载的应用分配新的所有者,如选择软件包加入更新所有权中所示。