usar studio now must flavors flavordimensions flavor ext compile como belong all android xml android-shortcut

studio - flavordimensions android



Atajos de Android estáticos para múltiples sabores? (4)

¿Es posible definir accesos directos estáticos para múltiples versiones sin duplicar los accesos directos.xml? Tengo dos sabores:

  • main (paquete: com.test)
  • gratis (paquete: com.test.free)

El shortcuts.xml tiene este aspecto:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@drawable/ic_shortcut_add_photo" android:shortcutId="new_photo" android:shortcutLongLabel="@string/new_photo" android:shortcutShortLabel="@string/new_photo"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.test.MainActivity" android:targetPackage="com.test"/> </shortcut>

El problema es que el nombre del paquete en la intención no puede referirse a un recurso de cadena y debe estar codificado en el archivo xml.

Para proporcionar también los accesos directos para el sabor libre, tengo que copiar los accesos directos.xml y cambiar el targetPackage a com.test.free, que es una mala solución.


Al investigar esto, encontré esta biblioteca, que parece hacer el truco:

https://github.com/Zellius/android-shortcut-gradle-plugin

Desventaja: no puede tener su shortcuts.xml dentro de la carpeta res de su aplicación, ya que el complemento toma el archivo, lo modifica para agregar automáticamente el targetPackage , y luego lo suelta durante el tiempo de compilación, y si ya tiene uno definido, causará un error en los recursos duplicados.

Aparte de eso, parece funcionar muy bien!


Creé un complemento que hace posible usar manifestPlaceholders en los recursos y se puede usar con la versión 3.0.0 del complemento android gradle

https://github.com/timfreiheit/ResourcePlaceholdersPlugin

src / main / res / shortcuts.xml:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@drawable/ic_shortcut_add_photo" android:shortcutId="new_photo" android:shortcutLongLabel="@string/new_photo" android:shortcutShortLabel="@string/new_photo"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.test.MainActivity" android:targetPackage="${applicationId}"/> </shortcut>


Puede tener varios shortcuts.xml con diferentes targetPackage (de acuerdo con sus identificadores de aplicación) en la carpeta de variantes de compilación respectiva. Por ejemplo :

app/src/debug/res/xml/shortcuts.xml app/src/staging/res/xml/shortcuts.xml

Esto funciona para mi.


IMPORTANTE: esta solución solo funciona para las versiones de Android gradle plugin anteriores a 3.0 debido a los cambios en la forma en que se procesan los recursos.

Así que solo tiene que solucionar este problema ahora debido al sufijo .debug en nuestro ID de aplicación para compilaciones de depuración. Esta es nuestra solución (tenga en cuenta que esta es una adaptación no probada de nuestro código base):

src/main/res/shortcuts.xml :

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:icon="@drawable/ic_shortcut_add_photo" android:shortcutId="new_photo" android:shortcutLongLabel="@string/new_photo" android:shortcutShortLabel="@string/new_photo"> <intent android:action="android.intent.action.VIEW" android:targetClass="com.test.MainActivity" android:targetPackage="@string/application_id"/> </shortcut>

<android module name>/build.gradle :

apply plugin: ''com.android.application'' //region: Fix shortcuts.xml by manually replacing @string/application_id final String APPLICATION_ID_STRING_RES_KEY = "application_id" android.applicationVariants.all { variant -> // Add the application id to the strings resources // We do this so that in the future if google fixes the // processing of the shortcuts.xml we can leave this // and remove the `mergeResources.doLast` block below resValue "string", APPLICATION_ID_STRING_RES_KEY, variant.applicationId // Manually replace @string/application_id with `variant.applicationId` variant.mergeResources.doLast { println("variant = ${variant.applicationId}") final File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/xml/shortcuts.xml") final String content = valuesFile.getText(''UTF-8'') final String updatedContent = content .replace("@string/${APPLICATION_ID_STRING_RES_KEY}", variant.applicationId) valuesFile.write(updatedContent, ''UTF-8'') } } //endregion android { ... }