Configurar e identificar a propriedade de atualizações de apps

Quando um app é instalado por uma loja ou um instalador, a loja ou o instalador é considerado o "instalador do registro", representando o último instalador do app. Antes do Android 14, outra loja ou instalador podia se tornar o instalador do registro e atualizar o app sem notificar o usuário.

No Android 14, o instalador inicial de um app pode se declarar "proprietário das atualizações" do app. Se outro instalador tentar atualizar o app, o usuário tem a possibilidade de aprovar a nova atualização antes de continuar.

Ativar a atualização de propriedade em pacotes

Para declarar que uma loja ou instalador é o proprietário de um pacote de apps, inclua a tag update-ownership ao sysconfig XML para cada pacote desta forma:

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

Neste exemplo, com.example.application é o pacote de apps a ser adquirido, e com.example.installer é o proprietário do pacote. Quando a propriedade de um pacote pode ser atualizada, outras lojas ou instaladores com privilégio precisam identificar o proprietário da atualização e obter consentimento do usuário para atualizar o app.

Desativar alterações de propriedade em pacotes

Sua loja ou instalador pode desativar a atualização de propriedade de um subconjunto de pacotes fornecendo uma lista de bloqueio no APK. Com a inclusão de um pacote nessa lista, nenhuma loja ou instalador pode solicitar propriedade de atualização do pacote.

Para não permitir atualização de pacotes por outra loja ou instalador:

  1. Inclua a propriedade abaixo no arquivo AndroidManifest.xml da loja ou instalador original:

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

    Esse exemplo faz referência a uma lista de bloqueio XML chamada legacyOwnershipDenylist.

  2. Crie uma lista de bloqueio como um recurso XML bruto com o seguinte formato:

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

Se uma loja ou um instalador solicitar a propriedade de um pacote que esteja em uma lista de bloqueio, a propriedade não será concedida, e o pacote vai continuar instalado, mas não será de propriedade de nenhum instalador. Além disso, independente do instalador, um app que esteja em uma lista de bloqueio não será de propriedade de ninguém.

O conjunto de pacotes dessa lista pode ser alterado com uma atualização no APK do instalador que fornece a lista. Qualquer propriedade que esteja definida para um pacote e que seja depois incluída em uma lista de bloqueio é excluída quando o instalador é atualizado. Dessa forma, atualizações futuras feitas no pacote de apps da lista de bloqueio não vão exigir interação com o usuário.

Identificar o proprietário da atualização e pedir o consentimento do usuário

Com o Android 14, mesmo que uma loja ou um instalador de apps tenha a permissão android.permission.INSTALL_PACKAGES, ainda precisará processar o estado STATUS_PENDING_USER_ACTION se quiser atualizar um app cujas atualizações sejam de propriedade de outra loja ou outro instalador.

O app de exemplo InstallAPKSessionApi.java também mostra como lidar com STATUS_PENDING_USER_ACTION.

Estabelecer a propriedade para apps pré-carregados

Em geral, apps pré-carregados não são de propriedade de um instalador específico, mas são atribuídos a um novo proprietário, usando a configuração do sistema, conforme mostrado em Ativar a atualização de propriedade em pacotes.