如何在Xamarin中处理"$ {applicationid}"?

Mik*_*nin 13 android android-manifest xamarin.android 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>
Run Code Online (Sandbox Code Playgroud)

当Gradle用作构建工具时,它会将其放在APK文件中,${applicationId}.belvedere.attachmentscom.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>
Run Code Online (Sandbox Code Playgroud)

显然,dollar_openBracket_applicationId_closeBracket不是我需要的.

似乎一切正常,但是不可能安装几个使用这些绑定的Xamarin应用程序,因为所有这些应用程序都会有相同权限的冲突提供程序(并且用户会收到INSTALL_FAILED_CONFLICTING_PROVIDER错误).

是否有办法改变dollar_openBracket_applicationId_closeBracket清单?

编辑:显示问题的小样本:https://gitlab.com/lassana/ZendeskXamarin/

Sus*_*ver 5

当前Xamarin.Android清单合并构建任务(包括版本)在合并清单7.1.0.19中不提供任何bundeID/ApplicationID(${}}替换gradle.

这只是清单处理/合并任务的一个限制,因此dollar_openBracket_applicationId_closeBracket您最终会在最终清单中结束,并且必须自己更正两个清单.

当前唯一的解决方案让我知道要避免清单合并任务,它的局限性是:

  1. 从'.aar`的清单中删除文件提供程序条目
  2. 添加应用程序清单的完整文件提供程序条目

注意:您必须执行这两个步骤

取决于.aar更改的频率以及.aar从中获取文件的位置:

  • 手动解压缩aar,删除条目并重新压缩aar(最快的方式)
  • 使用bash或powershell cmds通过shell脚本在构建步骤中自动执行此操作
  • 编写一个基于MSBuild C#的任务来完成它.
  • 请求aar上游更改清单(不太可能发生;-)因为它工作正常w/gradle)

仅供参考:我个人已经看过${applicationId}你有几次这个问题.我已经编写了构建脚本(bash/.ps1)来执行清单修复,因为它似乎总是在.arr我正在处理的清单中的一些特殊情况.


Mik*_*nin 1

据微软团队称,Xamarin.Build.Download(0.4.12-preview)终于修复了这个bug

因此,您应该按照以下步骤操作:

  1. 将 Nuget 包更新到 0.4.12-preview3
  2. 重新启动IDE
  3. 删除 NuGet 包的所有缓存位置
  4. 删除 bin/obj
  5. 重建