Как бороться с "$ {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) наконец исправляет эту ошибку.

Итак, вы должны выполнить следующие шаги:

  1. Обновите пакет Nuget до версии 0.4.12-preview3
  2. Перезапустите IDE
  3. Удалить все кэшированные местоположения пакетов NuGet
  4. Удалить bin/obj
  5. перестраивать

Ответ 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>