Как бороться с "$ {applicationid}" в Xamarin?
Я пытаюсь создать привязки для библиотеки Zendesk, и я столкнулся с проблемой.
Библиотека Zendesk Belvedere (belvedere-1.0.2.1.aar) содержит файл файл в файле манифеста:
<?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>
Когда Gradle используется как инструмент сборки, он помещает этот файл в файл APK и заменяет ${applicationId}.belvedere.attachments
на com.your_package_name_here.belvedere.attachments
в объединенном файле манифеста. Это нормально.
Однако Xamarin обрабатывает его по-разному. Вот что я нашел в манифесте моего последнего APK:
<?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>
Очевидно, что dollar_openBracket_applicationId_closeBracket
не то, что мне нужно.
Кажется, все работает, однако невозможно установить несколько приложений Xamarin, которые используют эти привязки, потому что у всех из них будут конфликтующие провайдеры с одинаковыми полномочиями (и пользователь получит ошибку INSTALL_FAILED_CONFLICTING_PROVIDER
).
Есть ли способ изменить dollar_openBracket_applicationId_closeBracket
в манифесте?
Изменить: Небольшой образец, который показывает проблему: https://gitlab.com/lassana/ZendeskXamarin/
Ответы
Ответ 1
По словам команды Microsoft, Xamarin.Build.Download(0.4.12-preview) наконец исправляет эту ошибку.
Итак, вы должны выполнить следующие шаги:
- Обновите пакет Nuget до версии 0.4.12-preview3
- Перезапустите IDE
- Удалить все кэшированные местоположения пакетов NuGet
- Удалить bin/obj
- перестраивать
Ответ 2
Текущая задача создания слияния манифеста Xamarin.Android
, вплоть до
version 7.1.0.19
, не предоставляет никакой подзадачи bundeID/ApplicationID (${}
} в объединенном манифесте, например gradle
.
Это просто ограничение в задаче обработки/слияния манифеста, таким образом, вы заканчиваете с dollar_openBracket_applicationId_closeBracket
в своем последнем манифесте и должны будете исправлять оба.
Единственное текущее решение знает для меня, чтобы избежать задачи слияния манифеста, и это ограничение заключается в следующем:
- Удалить запись поставщика файлов из манифеста .aar.
- Добавить полную запись поставщика файлов в свой манифест приложения
Примечание. Вы должны выполнить оба действия
В зависимости от того, как часто изменяется .aar
, и где вы ищете файл .aar
:
- Вручную разархивируйте
aar
, удалите запись и заново запустите aar
(самый быстрый способ)
- Автоматизировано это на этапе сборки через оболочку script с помощью bash или powershell cmds
- Запишите задачу MSBuild на С#, чтобы сделать это.
- Запросить, чтобы манифест
aar
был изменен вверх по течению (вряд ли произойдет;-), так как он отлично работает w/gradle
)
FYI: Лично я видел проблему ${applicationId}
, которую вы имеете несколько раз. Я написал скрипты сборки (bash/.ps1
), чтобы выполнить манифест, потому что это всегда будет особый случай в манифесте .arr
, с которым я имею дело.
Ответ 3
Основным файлом манифеста вашего проекта является манифест с более высоким приоритетом, поэтому, если вы добавите элемент поставщика в основной файл манифеста и примените маркер правила слияния для атрибута android:authorities
, инструменты слияния заменяют значение android:authorities
, которое вы объявить в основном манифесте.
Объявить элемент provider
в основном манифесте:
<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>