play license instant google developer descargar apps android android-studio android-gradle android-build android-instant-apps

license - Android Instant App: ¿Cómo crear módulos direccionables URL?



play store apk (5)

Google actualizó su documentación sobre aplicaciones instantáneas recientemente: prepara tu aplicación

La mayoría de los puntos son claros, excepto 3. Refactoriza tu aplicación, si es necesario .

Sugieren módulos de venta al por menor como navegar, buscar, detalles de artículos y retirar.

Pregunta : ¿Cómo divido la aplicación en módulos que sean completamente funcionales y direccionables por URL?

Veo aquí varios problemas:

  • Si usamos bibliotecas como Dagger, Butterknife, ... todos los módulos dependerían de otros módulos.
  • Si nuestros módulos contienen (vistas) según sea necesario, ¿cómo debería implementarse una transición a otra vista (desde otro módulo) sin importar este módulo?

¿Alguien puede arrojar luz en la oscuridad? ¡Gracias!


Considera este diagrama.

P: ¿Cómo divido la aplicación en módulos que sean completamente funcionales y direccionables por URL?

Módulo base: contiene todos los recursos comunes requeridos por su aplicación. Entonces, en nuestro caso, todas las actividades de feature1 y feature2 estarían usando res compartidas del módulo base. Puede tener bibliotecas como dagger, butterknife.

Ahora es el momento de dividir toda la aplicación en una unidad más pequeña llamada característica. Una sola función puede consistir en múltiples actividades que solo pueden dar un vistazo a su aplicación o lograr un objetivo que impulsa a los usuarios a instalar esa aplicación. Ahora depende completamente de ti lo que quieras entregar al usuario que insista en que descargue tu aplicación.

Feature1: Así que hemos dividido la aplicación en feature1 y feature2. En esta característica 1, les estamos dando a los usuarios que busquen y busquen elementos. Siempre que el usuario haga clic en el elemento, necesitamos cargar los detalles del elemento de feature2, así que al hacer clic en el elemento de la actividad de exploración llamaremos como

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://yourdomain.com/itemdetail")); intent.setPackage(getPackageName()); intent.addCategory(Intent.CATEGORY_BROWSABLE); startActivity(intent);

Porque: Activity1 de feature1 no puede llamar directamente Activity2 en feature2. Para hacerlo, debe solicitar la dirección URL de activity2 de activity1.

Feature2: Ahora, Feature2 se carga en la aplicación instantánea, por lo que ahora podemos ver la actividad de detalles del elemento.

NOTA: También debe considerar el tamaño de su característica al dividir la funcionalidad de la aplicación porque cada característica no debe exceder el tamaño de 4 MB, de lo contrario, la validación se produce al cargar apk en Play Store.


Consulte la documentación oficial ahora que las aplicaciones instantáneas están generalmente disponibles para los desarrolladores.

Para resumir, todas las aplicaciones instantáneas tendrán al menos lo que se llama un módulo de funciones básicas que contiene código común en la aplicación instantánea. Además de eso, las aplicaciones instantáneas pueden tener opcionalmente 1 o más bibliotecas de funciones adicionales que dependen del módulo de funciones base. Cada módulo de función puede tener sus propios puntos de entrada que son direccionables mediante URL, aunque los módulos de función en sí no tienen que depender unos de otros. Si uno necesita llamar al otro, eso se puede hacer a través de un Intento basado en URL.

El diagrama del sitio de documentos ayuda un poco:

Todos los módulos de funciones utilizan el nuevo complemento com.android.feature , que se usa de manera similar al complemento tradicional com.android.library en términos de cómo puede usarlo en su proyecto de Android y, por lo tanto, la documentación de la biblioteca se puede usar como una referencia. En términos de cómo difiere, emitirá un archivo AAR normal cuando se use con su módulo de aplicación instalable, y emitirá una característica APK cuando se use con el nuevo módulo de aplicación instantánea.


Creo que el módulo de características viene con todo en concepto modular. Al final, cada característica posible se separa en el módulo de características.

Empiezo a entender una nueva forma de estructurar proyectos a partir de esta talk . Me deja claro por algún punto.

Al igual que si creamos un módulo de funciones y queremos vincularlo a un módulo base de funciones, probablemente androidTest eliminar los androidTest test y res androidTest test no utilizados.

También crea un proyecto simple con nueva estructura here

En estos repositorios, intente comenzar desde cero siguiendo el documento y más arriba para cambiar de módulo de aplicación a módulo de funciones y agregue el módulo de aplicación instantáneo en base de código.


La separación adecuada de módulos requerida por Instant Apps se puede hacer fácilmente siguiendo los siguientes pasos:

  1. Cree un módulo compartido que contendrá el código y los recursos que deben compartirse entre los módulos de funciones.
  2. Cree varios módulos de funciones para cada función principal (en el ejemplo proporcionado por Google: exploración, búsqueda, detalle de elementos y verificación). Estos módulos pueden depender del módulo compartido creado en la p.1, pero no deben saber nada entre sí.
  3. Para iniciar una actividad desde un módulo diferente, haga que la actividad de destino sea direccionable por URL, y comience a través de una intención implícita. Google sugiere utilizar los enlaces de aplicaciones para eso.
  4. Para crear su aplicación regular de Android, cree un módulo de aplicación que dependa de los módulos de funciones.
  5. Una vez que Google lance su Android InstantApp SDK al público, puede crear sus aplicaciones instantáneas (una por función).

No estoy seguro de si estoy malinterpretando tu pregunta, pero trataré de descifrarla. Para mi explicación a continuación, haré referencia a este ejemplo de código de Google varias veces. Sugiero ALTAMENTE clonar ese repo y jugar con él, ya que creo que responderá a tu pregunta.

Si usamos bibliotecas como Dagger, Butterknife, ... todos los módulos dependerían de otros módulos.

Como lo mencionaron otros, las bibliotecas que serán utilizadas por todas sus características irán a su característica base.

Si nuestros módulos contienen (vistas) según sea necesario, ¿cómo debería implementarse una transición a otra vista (desde otro módulo) sin importar este módulo?

Esta respuesta cubre la descripción general, pero esta parte parece ser la raíz de tu pregunta, así que trataré de profundizar un poco más.

Digamos que Feature1 ( BrowseActivity ) quiere abrir Feature2 ( ItemDetailActivity ). En lugar de que Feature1 llame a startActivity(ItemDetailActivity.class) directamente, tendrá que usar el método de llamada a continuación (esto se debe a que Feature1 no tiene acceso a ItemDetailActivity.class de Feature2 ya que no dependen entre sí). Aquí está el ejemplo del código proporcionado por Google

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com/itemdetail")); intent.setPackage(getPackageName()); intent.addCategory(Intent.CATEGORY_BROWSABLE); startActivity(intent);

Ahora, la parte que falta es que en el AndroidManifest de Feature2 debe declarar que ItemDetailActivity está escuchando el enlace https://example.com/itemdetail . Aquí está el ejemplo de código relevante de Google

<activity android:name=".ItemDetailActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:host="example.com" /> <!-- IMPORTANT --> <data android:pathPrefix="/itemdetail"/> </intent-filter> <meta-data android:name="default-url" android:value="https://www.example.com/itemdetail" /> </activity>

Para obtener más información, lea los enlaces de activos digitales , así como el enlace profundo general