如何在 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
并且必须更正两者都 显化自己。
我目前唯一知道的避免清单合并任务的解决方案是:
- 从“.aar”的清单中删除 文件提供程序条目
- 添加 应用程序清单的完整文件提供程序条目
注意:您必须完成这两个步骤
取决于 .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。
因此,您应该按照以下步骤操作:
- 将 Nuget 包更新到 0.4.12-preview3
- 重新启动IDE
- 删除 NuGet 包的所有缓存位置
- 删除bin/obj
- 重建
我正在尝试为 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
并且必须更正两者都 显化自己。
我目前唯一知道的避免清单合并任务的解决方案是:
- 从“.aar”的清单中删除 文件提供程序条目
- 添加 应用程序清单的完整文件提供程序条目
注意:您必须完成这两个步骤
取决于 .aar
更改的频率以及您从何处获取 .aar
文件:
- 手动解压缩
aar
,删除条目和 re-zipaar
(最快的方法) - 使用 bash 或 powershell cmds 通过 shell 脚本在构建步骤中自动执行此操作
- 编写一个基于 MSBuild C# 的任务来完成它。
- 请求上游更改
aar
清单(不太可能发生 ;-) 因为它在gradle
) 下工作正常
仅供参考:就我个人而言,我已经多次看到您遇到的 ${applicationId}
问题。我已经编写了构建脚本 (bash/.ps1
) 来执行清单 fix-up,因为它似乎总是我正在处理的 .arr
清单中的一些特殊情况。
根据 Microsoft 团队的说法,Xamarin.Build.Download(0.4.12 预览版)最终 fixes this bug。
因此,您应该按照以下步骤操作:
- 将 Nuget 包更新到 0.4.12-preview3
- 重新启动IDE
- 删除 NuGet 包的所有缓存位置
- 删除bin/obj
- 重建