库解决方案中的 Xamarin 9-Patch 并通过 TeamCity NuGet 引用
Xamarin 9-Patch in Library Solution & Referenced via TeamCity NuGet
配置
库解决方案中有一个 Android 库项目(我们称之为 Core.Droid),它有一个 9 补丁图像,如此屏幕所示项目截图
此解决方案是使用 TeamCity 构建的,因此该项目是一个 NuGet 包。
另一个解决方案包含一个 Android 项目(我们称之为 DroidApp)并引用 NuGet 包 Core.Droid
问题
构建DroidApp时(VS2013)出现以下编译错误:
9-patch image C:\[path to project]\obj\Debug\__library_projects__\Core.Droid\library_project_imports\res\drawable-hdpi\textfield_activated_halo_light.9.png malformed
为了证明问题出在NuGet打包过程中的某处...如果直接引用Core.Droid 通过右键单击 DroidApp 中的 References 项目,单击 Add Reference... ,然后在 Reference Manager - DroidApp window 中,在 Browse 选项卡上,单击 Browse... 并在 Core.Droid 的 bin\debug 位置选择 Core.Droid.dll项目然后 DroidApp 将编译并且 运行 没有任何编译或 运行 时间错误。
问题
当 Core.Droid Android 库项目包含 9 补丁图像?
注意:普通图像工作正常,只有 9-patch 图像会导致此问题。
当前解决方法
如果我们将 9 补丁图像放在 DroidApp 中,那么一切都是 hunky-dory. However this makes it impossible to share images across multiple apps from a common library project, consequently we have the same images in multiple projects. This is bad。
附加信息
我在诊断构建日志中看到了这个:
2>AAPT : error : 9-patch image C:\Workspace\DroidApp\obj\Debug\__library_projects__\Core.Droid\library_project_imports\res\drawable-mdpi\textfield_activated_holo_light.9.png malformed.
2> No marked region found along edge. (TaskId:145)
2> Found along top edge. (TaskId:145)
但是我认为这是问题的症状,不一定是原因,因为项目中包含的图像没有格式错误……事实上,如果我直接引用项目 (Core.Droid) 而不是使用 NuGet 包……它有效。但是,如果我浏览到错误中的路径,则图像确实格式错误(删除了 9-patch 边框)。所以问题是……这是怎么发生的?为什么当它是一个 NuGet 项目时它会去掉边界?我确实知道,如果我从 .apk 中获取图像,那么 9 补丁边框实际上会被删除……因此,在构建 NuGet 包时,可能会在构建过程中的某处发生这种情况……而当项目作为直接引用包含在内时步骤没有发生……有没有办法防止在 NuGet 构建中发生该步骤?
附加信息二
如果我在本地计算机上构建 NuGet 包并使用该 NuGet 包,那么它就可以工作。只有在 TeamCity 的 NuGet 包中,9patch 才不起作用。
澄清一下,解决方案是更新过去的 Xamarin.Android 4.18,因为 4.18.1 似乎对此有修复:
配置
库解决方案中有一个 Android 库项目(我们称之为 Core.Droid),它有一个 9 补丁图像,如此屏幕所示项目截图
此解决方案是使用 TeamCity 构建的,因此该项目是一个 NuGet 包。
另一个解决方案包含一个 Android 项目(我们称之为 DroidApp)并引用 NuGet 包 Core.Droid
问题
构建DroidApp时(VS2013)出现以下编译错误:
9-patch image C:\[path to project]\obj\Debug\__library_projects__\Core.Droid\library_project_imports\res\drawable-hdpi\textfield_activated_halo_light.9.png malformed
为了证明问题出在NuGet打包过程中的某处...如果直接引用Core.Droid 通过右键单击 DroidApp 中的 References 项目,单击 Add Reference... ,然后在 Reference Manager - DroidApp window 中,在 Browse 选项卡上,单击 Browse... 并在 Core.Droid 的 bin\debug 位置选择 Core.Droid.dll项目然后 DroidApp 将编译并且 运行 没有任何编译或 运行 时间错误。
问题
当 Core.Droid Android 库项目包含 9 补丁图像?
注意:普通图像工作正常,只有 9-patch 图像会导致此问题。
当前解决方法
如果我们将 9 补丁图像放在 DroidApp 中,那么一切都是 hunky-dory. However this makes it impossible to share images across multiple apps from a common library project, consequently we have the same images in multiple projects. This is bad。
附加信息
我在诊断构建日志中看到了这个:
2>AAPT : error : 9-patch image C:\Workspace\DroidApp\obj\Debug\__library_projects__\Core.Droid\library_project_imports\res\drawable-mdpi\textfield_activated_holo_light.9.png malformed.
2> No marked region found along edge. (TaskId:145)
2> Found along top edge. (TaskId:145)
但是我认为这是问题的症状,不一定是原因,因为项目中包含的图像没有格式错误……事实上,如果我直接引用项目 (Core.Droid) 而不是使用 NuGet 包……它有效。但是,如果我浏览到错误中的路径,则图像确实格式错误(删除了 9-patch 边框)。所以问题是……这是怎么发生的?为什么当它是一个 NuGet 项目时它会去掉边界?我确实知道,如果我从 .apk 中获取图像,那么 9 补丁边框实际上会被删除……因此,在构建 NuGet 包时,可能会在构建过程中的某处发生这种情况……而当项目作为直接引用包含在内时步骤没有发生……有没有办法防止在 NuGet 构建中发生该步骤?
附加信息二
如果我在本地计算机上构建 NuGet 包并使用该 NuGet 包,那么它就可以工作。只有在 TeamCity 的 NuGet 包中,9patch 才不起作用。
澄清一下,解决方案是更新过去的 Xamarin.Android 4.18,因为 4.18.1 似乎对此有修复: