Cómo configurar y controlar la propiedad de apps

Cuando un instalador o una tienda instala una app, se los considera como el "instalador de registros", lo que significa que son el último ente que instaló la app. En las versiones anteriores a Android 14, el sistema operativo permitía que otro instalador de apps o tienda sea el instalador de registros y que actualizara la app sin notificar al usuario.

En Android 14, el instalador inicial de una app puede declararse "propietario de la actualización" y brindar actualizaciones a la app. Si otro instalador intenta actualizar la app, el usuario tiene la posibilidad de aprobar la actualización antes de continuar.

Cómo habilitar las actualizaciones de propiedad de paquetes

Para declarar una tienda o un instalador como propietario de un paquete de aplicaciones, incluye la etiqueta update-ownership en tu sysconfig XML de cada paquete, como se muestra a continuación:

<update-ownership package="com.example.application" installer="com.example.installer" />

En este ejemplo, com.example.application representa el paquete de la app y com.example.installer es el propietario de dicho paquete. Cuando se habilita un paquete para actualizar su propiedad, otros instaladores y tiendas con privilegios deben encargarse del propietario de la actualización y obtener el consentimiento del usuario para actualizar la app.

Cómo inhabilitar los cambios de propiedad de paquetes

Puedes brindar una lista de bloqueo en el APK para hacer que el instalador o la tienda rechacen un subconjunto de paquetes del propietario de la actualización. Si incluyes un paquete en esta lista, ningún instalador o tienda podrá solicitar la propiedad de las actualizaciones del paquete.

Para inhabilitar los paquetes y que ningún instalador o tienda pueda actualizarlos, haz lo siguiente:

  1. Incluye la siguiente propiedad en el instalador o la tienda original del archivo AndroidManifest.xml:

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

    Este ejemplo hace referencia a una lista de bloqueo XML denominada legacyOwnershipDenylist.

  2. Crea una lista de bloqueo como un recurso XML sin procesar con el siguiente formato:

    <deny-ownership>com.example.app1</deny-ownership>
    <deny-ownership>com.example.app2</deny-ownership>
    

Si un instalador o una tienda solicitan la propiedad de un paquete en la lista de bloqueo, no se otorgará la propiedad y se dejará instalado el paquete, pero no será propiedad de ningún instalador. Además, sin importar el instalador, una app en una lista de bloqueo no puede ser propiedad de ninguna entidad.

El conjunto de paquetes en esta lista puede cambiar con una actualización en el instalador de APK que brinda la lista. Cualquier propiedad que se establezca en un paquete que luego se introduzca en una lista de bloqueo se elimina cuando se actualiza el instalador. Como consecuencia, las siguientes actualizaciones del paquete de la app en una lista de bloqueo no solicitará la interacción del usuario.

Cómo controlar las actualizaciones de propietarios y obtener el consentimiento del usuario

Con Android 14, incluso si una tienda o un instalador de apps tiene el permiso android.permission.INSTALL_PACKAGES, deberá controlar el estado STATUS_PENDING_USER_ACTION si quiere actualizar una app cuyas actualizaciones son de otro instalador o tienda.

La app de ejemplo InstallAPKSessionApi.java también muestra cómo controlar STATUS_PENDING_USER_ACTION.

Cómo establecer la propiedad en apps precargadas

Por lo general, las apps precargadas no son propiedad de un instalador específico. En cambio, se les asigna uno nuevo con un sistema de configuración como se muestra en Cómo habilitar las actualizaciones de propiedad de paquetes.