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 {
...
}