Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Visibilidad de paquetes en Android 11

Con Android 11, cambia la forma en que las apps pueden consultar a otras apps que el usuario instaló en un dispositivo e interactuar con ellas. Mediante el nuevo elemento <queries>, las apps pueden definir el conjunto de otras apps a las que pueden acceder. Este elemento ayuda a fomentar el principio de privilegios mínimos indicándole al sistema qué otras apps debe mostrar para tu app y ayuda a que las tiendas de apps como Google Play evalúen la privacidad y seguridad que proporciona tu app.

Si tu app está orientada a Android 11, es posible que debas agregar el elemento <queries> en el archivo de manifiesto. Dentro del elemento <queries>, puedes especificar apps por nombre de paquete o por firma de intent.

El elemento <queries> te permite describir con qué otras apps puede tener que interactuar la tuya. Puedes especificar apps por nombre de paquete o por firma de intent dentro de un solo elemento <queries>. Para obtener información sobre cómo consultar otras apps a fin de cumplir con un caso práctico específico, consulta la guía de casos prácticos de visibilidad del paquete.

Los métodos PackageManager que muestran resultados sobre otras apps, como queryIntentActivities(), se filtran según la declaración <queries> de la app que realiza la llamada. Las interacciones explícitas con otras apps, como startService(), también requieren que la app de destino coincida con una de las declaraciones de <queries>.

Nos interesan tus comentarios. Responde esta encuesta breve para contarnos cómo utilizas la función. En particular, queremos conocer casos prácticos en los que haya tenido un impacto.

Cómo configurar tu entorno

Para compilar una app que utilice el elemento <queries>, usa las siguientes herramientas:

Cómo realizar consultas de paquetes específicos e interactuar con ellos

Si conoces el conjunto específico de apps a las que quieres realizar consultas o con las que quieres interactuar (como las que se integran con tu app o aquellas cuyos servicios usas), incluye los nombres en un conjunto de elementos <package> dentro del elemento <queries>:

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

Cómo realizar consultas a otras apps e interactuar con ellas según un filtro de intents

Es posible que tu app necesite realizar consultas a un conjunto de apps que cumplan con un propósito determinado o interactuar con ese conjunto, pero tal vez no sepas los nombres de los paquetes específicos que debes incluir. En esta situación, puedes mostrar las firmas de filtros de intents en el elemento <queries>. Luego, tu app puede descubrir apps con elementos <intent-filter> que coincidan.

En el siguiente ejemplo, la app puede ver las apps instaladas que admiten el uso compartido de imágenes JPEG:

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

El elemento <intent> tiene algunas restricciones:

  • Debes incluir exactamente un elemento <action>.
  • No puedes usar los atributos path, pathPrefix, pathPattern o port en un elemento <data>. El sistema se comporta como si configuraras el valor de cada atributo para el carácter comodín genérico (*).
  • No puedes usar el atributo mimeGroup de un elemento <data>.
  • Dentro de los elementos <data> de un solo elemento <intent>, puedes usar cada uno de los siguientes atributos una vez como máximo:

    • mimeType
    • scheme
    • host

    Puedes distribuir esos atributos en varios elementos <data> o usarlos en un elemento <data> único.

El elemento <intent> admite el carácter comodín genérico (*) como valor para algunos atributos:

  • El atributo name del elemento <action>
  • El subtipo del atributo mimeType de un elemento <data> (image/*)
  • El tipo y el subtipo del atributo mimeType de un elemento <data> (*/*)
  • El atributo scheme de un elemento <data>
  • El atributo host de un elemento <data>

A menos que se especifique lo contrario en la lista anterior, el sistema no admite una combinación de caracteres de texto y comodín, como prefix*.

Cómo realizar consultas a todas las apps e interactuar con ellas

En raras ocasiones, es posible que la app necesite realizar consultas a todas las apps instaladas en un dispositivo o interactuar con todas ellas, independientemente de los componentes que incluyan. Para permitir que la app vea todas las demás apps instaladas, Android 11 incluye el permiso QUERY_ALL_PACKAGES.

En la siguiente lista, se muestran algunos casos prácticos en los que es apropiado incluir el permiso QUERY_ALL_PACKAGES:

  • Apps de lanzamiento
  • Apps de accesibilidad
  • Navegadores
  • Apps de uso compartido entre pares (P2P)
  • Apps de administración de dispositivos
  • Apps de seguridad

Sin embargo, en la gran mayoría de los casos, es posible cumplir con los casos prácticos de tu app declarando el elemento <queries>. Para respetar la privacidad del usuario, tu app debe solicitar la menor cantidad de visibilidad del paquete necesaria para funcionar.

En una próxima actualización de la política, busca en Google Play los lineamientos para las apps que necesitan el permiso QUERY_ALL_PACKAGES.

Casos prácticos que no se ven afectados por el cambio

En la siguiente lista, se incluyen varios ejemplos de casos prácticos que no requieren una declaración de <queries>:

  • La app de destino es tu propia app.
  • Usas un intent implícito para iniciar una actividad.
  • La app interactúa con determinados paquetes del sistema, como el proveedor de contenido multimedia, que implementan la funcionalidad principal de Android.
  • Una app inicia la tuya con el método startActivityForResult(). (Esa app se hace visible automáticamente).
  • Una app se inicia o se vincula a un servicio de tu app. (Esa aplicación se hace visible automáticamente).
  • Una app envía una solicitud a un proveedor de contenido de tu app. (Esa aplicación se hace visible automáticamente).

Cómo usar los mensajes de registro de filtrado de paquetes

A fin de descubrir más detalles sobre cómo los cambios en la visibilidad del paquete afectan la app, puedes habilitar los mensajes de registro de filtrado de paquetes. Si estás desarrollando una app de prueba o depurable en Android Studio, tendrás la función habilitada. De lo contrario, puedes ejecutar el siguiente comando en una ventana de terminal para habilitarla manualmente:

adb shell pm log-visibility --enable PACKAGE_NAME

Luego, cada vez que se filtran paquetes de los valores que se muestran de un objeto PackageManager, aparece un mensaje similar al siguiente en Logcat:

I/AppsFilter: interaction: PackageSetting{7654321 \
  com.example.myapp/12345} -> PackageSetting{...} BLOCKED

Cómo probar el cambio

Para comprobar si se aplicó este cambio de comportamiento en tu app, sigue estos pasos:

  1. Instala Android Studio 3.6.1 o una versión posterior.
  2. Instala la versión más reciente de Gradle que admita Android Studio.
  3. Establece la 30 de tu app como targetSdkVersion.
  4. No incluyas el elemento <queries> en el archivo de manifiesto de tu app.
  5. Llama al método getInstalledApplications() o getInstalledPackages(). Ambos deben mostrar una lista filtrada.
  6. Descubre qué funciones de tu app no funcionan.
  7. Introduce entradas <queries> apropiadas para solucionar los problemas de estas funciones.