当应用程序由商店或安装程序安装时,商店或安装程序被视为“记录安装程序”,即应用程序的最后一个安装程序。在 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
。
建立预装应用程序的所有权
预加载的应用程序通常不属于特定安装程序。相反,预加载的应用程序会使用系统配置分配新的所有者,如选择包更新所有权中所示。