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

How to deal with "${applicationid}" in 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 用作构建工具时,它会将此 aar 放入 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/

您的项目的主清单文件是优先级较高的清单,因此如果您将 provider 元素添加到主清单文件并为 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>

当前 Xamarin.Android 清单合并构建任务,直至并包括 7.1.0.19 版本不提供任何 bundeID/ApplicationID(${}} 合并清单中的替换,就像 gradle 那样。

这只是清单 processing/merge 任务中的一个 限制 ,因此您最终清单中的结果是 dollar_openBracket_applicationId_closeBracket 并且必须更正两者都 显化自己。

我目前唯一知道的避免清单合并任务的解决方案是:

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

注意:您必须完成这两个步骤

取决于 .aar 更改的频率以及您从何处获取 .aar 文件:

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

仅供参考:就我个人而言,我已经多次看到您遇到的 ${applicationId} 问题。我已经编写了构建脚本 (bash/.ps1) 来执行清单 fix-up,因为它似乎总是我正在处理的 .arr 清单中的一些特殊情况。

根据 Microsoft 团队的说法,Xamarin.Build.Download(0.4.12 预览版)最终 fixes this bug

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

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