如果应用商店或安装程序安装某款应用,相应商店或安装程序会被视为“记录安装程序”,即这款应用的最后一个安装程序。在 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>
此示例引用了一个名为
legacyOwnershipDenylist
的 XML 拒绝名单。使用以下格式创建一份拒绝名单作为原始 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
。
为预加载应用建立所有权
预加载应用通常不归特定安装程序所有,而是会由系统按照允许软件包更新所有权部分中所示的系统配置分配新的所有者。