¿Cómo tratar con "$ {applicationid}" en Xamarin?
Estoy tratando de crear enlaces para la biblioteca de Zendesk y me enfrenté con un problema.
Zendesk Belvedere biblioteca (belvedere-1.0.2.1.aar) contiene un proveedor de archivos en su archivo de manifiesto:
- Xamarin C # - Android - Impedir que un AlertDialog cierre en PositiveButton haga clic
- Pasar referencias a la intención de la actividad
- ¿Cómo generar Xamarin vinculante para AAR con muchas dependencias?
- Protección de bases de datos SQLite locales (aplicación Android)
- App Crash instantáneamente sin excepción o registro (parece como xamarin / mono error)
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... ... <application> <provider android:name="com.zendesk.belvedere.BelvedereFileProvider" android:authorities="${applicationId}.belvedere.attachments" android:exported="false" android:grantUriPermissions="true" > <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/belvedere_attachment_storage" /> </provider> </application> </manifest>
Cuando Gradle se utiliza como herramienta de compilación, coloca este aar en el archivo APK y reemplaza ${applicationId}.belvedere.attachments
con com.your_package_name_here.belvedere.attachments
en el archivo de manifiesto fusionado. Está bien.
Sin embargo, Xamarin lo maneja de manera diferente. Esto es lo que encontré en el manifiesto de mi APK final:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... ... <application ... ... <provider android:name="com.zendesk.belvedere.BelvedereFileProvider" android:exported="false" android:authorities="dollar_openBracket_applicationId_closeBracket" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/belvedere_attachment_storage" /> </provider> ... ... </application> </manifest>
Obviamente, dollar_openBracket_applicationId_closeBracket
no es lo que necesito.
Parece que todo funciona, sin embargo, hace imposible instalar varias aplicaciones Xamarin que usan estos enlaces, porque todos tendrían proveedores en conflicto con la misma autoridad (y el usuario obtendría el error INSTALL_FAILED_CONFLICTING_PROVIDER
).
¿Hay una manera de cambiar dollar_openBracket_applicationId_closeBracket
en el manifiesto?
Editar: un pequeño ejemplo que muestra el problema: https://gitlab.com/lassana/ZendeskXamarin/
- ¿Cómo evitar que la aplicación de Android se desinstale durante la implementación con Xamarin Studio?
- ¿Cómo obtengo la dirección MAC y el dispositivo Android con 6.0 o superior en c #?
- Cómo MvvmCross enlazar drawableId a Imageview
- Transferencia eficiente de datos de objetos personalizados entre las actividades de Android
- Xamarin Forms - Media Plugin - Vaciar las miniaturas en el teléfono
- Monodroid - Manejo Haga clic en eventos dentro de las filas ListAdapter
- System.ObjectModel Advertencia Xamarin no se ejecuta en Android
- Bluetooth Android / Xamarin transmisión de dispositivo en serie con outputtream vacío
La tarea de generación de combinación de manifiesto Xamarin.Android
actual, hasta e incluyendo la versión 7.1.0.19
, no proporciona ninguna sustitución bundeID / ApplicationID ( ${}
} en el manifiesto combinado como gradle
.
Esto es sólo una limitación en la tarea de procesamiento / fusión manifiesta, por lo que dollar_openBracket_applicationId_closeBracket
con dollar_openBracket_applicationId_closeBracket
en tu manifiesto final y tendrás que corregir ambos manifiestos.
La única solución actual me sabe para evitar la tarea de fusión de manifiesto y su limitación es:
- Quite la entrada del proveedor de archivos del manifiesto '.aar`
- Agregue la entrada completa del proveedor de archivos al manifiesto de su aplicación
Nota: Tienes que hacer ambos pasos
Dependiendo de la frecuencia con la que el .aar
está cambiando y de dónde está obteniendo el archivo .aar
de:
-
aar
manualmente elaar
, quite la entrada y vuelva a cerrar elaar
(la forma más rápida) - Automatizado esto en un paso de construcción a través de un script de shell usando bash o powershell cmds
- Escriba una tarea basada en MSBuild C # para hacerlo.
- Solicitar que el manifiesto
aar
se cambie aguas arriba (no es probable que ocurra 😉 ya que funciona bien congradle
)
FYI: Personalmente he visto el problema ${applicationId}
que estás teniendo varias veces. He escrito scripts de construcción ( bash/.ps1
) para hacer el arreglo de manifiesto, ya que parece ser siempre un caso especial en el manifiesto de .arr
el que estoy tratando.
El archivo de manifiesto principal de su proyecto es el manifiesto de mayor prioridad, por lo que si agrega el elemento de proveedor al archivo de manifiesto principal y aplica un marcador de regla de combinación para android:authorities
atributo de android:authorities
, las herramientas de fusión sustituyen al valor de android:authorities
que declara en el Manifiesto principal
Declarar el elemento del provider
en el manifiesto principal:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> ... ... <application> <provider android:name="com.zendesk.belvedere.BelvedereFileProvider" android:authorities="com.example.belvedere.attachments" tools:replace=”android:authorities” > </provider> </application>
- VIEW de un URI del proveedor de contenido?
- Compartir cookies desde la vista web con BasicHttpRequest en Android