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

时间:2017-01-09 15:54:33

标签: android xamarin xamarin.android android-manifest

我正在尝试为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/

3 个答案:

答案 0 :(得分:5)

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

这只是清单处理/合并任务中的限制,因此您最终清单中的gradle结尾,并且必须纠正两者表明自己。

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

  1. 从'.aar`的清单
  2. 中删除文件提供程序条目
  3. 添加应用程序清单的完整文件提供程序条目
  4. 注意:您执行这两个步骤

    取决于dollar_openBracket_applicationId_closeBracket发生变化的频率以及您从.aar文件中获取.aar文件的位置:

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

项目的主清单文件是优先级较高的清单,因此如果将provider元素添加到主清单文件并为android:authorities属性应用合并规则标记,则合并工具将替换{{1}您在主清单中声明的​​值。

在主清单中声明android:authorities元素:

provider