有人能真正解释Resource.Designer.cs的工作原理吗?

时间:2016-11-06 16:35:45

标签: android xamarin xamarin.android aapt

我在生成Resource.Designer但不再编译的项目构建期间经常遇到问题。我的搜索引擎显示我并不是唯一一个遇到此问题的人,但我也没有找到任何可靠的解决方案"当它发生时。

例如,现在我有一个工作正常的项目,但是如果我添加对NuGet库(我创建的)的引用,那么应用程序将不再编译,因为Resource.Designer.cs中存在大量错误

在另一个项目中,我只是升级了Xamarin Forms,现在我再也无法编译了,因为Resource.Designer.cs中出现了大量错误。

当然,最直接的问题是"如何修复这些项目中的错误"但实际上我想了解这里的根本原因。是什么导致Resource.Designer生成和重新生成?使用什么算法来决定将哪些项目放入该文件?为什么我们经常最终得到一个生成的文件然后无法实际编译?为什么没有得到这些项目所需的参考文献?

我真的很想从根本上理解这一点,这样一旦我越过当前的事情让我头疼,我可以在将来再次出现时避免它(我肯定会提出来的)再次)。

1 个答案:

答案 0 :(得分:5)

Resource.Designer.cs与Android中的R.java同义。当然,应用程序的资源由生成的常量Resource ID引用。

这些项目通常在Xamarin.Android的{​​{1}}通过:

中定义

.csproj(这可能已过时)

<AndroidResgenClass>Resource</AndroidResgenClass>(当前)

这是<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>流程的一部分,其中Android Build工具将为项目中定义的每个资源生成相应的常量资源ID(aapt - Android,res/ - Xamarin.Android)。然后将它们处理成二进制形式并嵌入Resources/。因此,.apk是在成功Resource.designer.cs之后生成的。

然后更进一步定义特定aapt

中的Resource

http://code.google.com/android/reference/android/R.html

  • 动画
  • 动画
  • 阵列
  • ATTR
  • BOOL
  • 颜色
  • 绘制
  • 分数
  • ID
  • 整数
  • 内插
  • 布局
  • 菜单
  • mip映射
  • 复数
  • 原始
  • 字符串
  • 设置样式
  • 过渡
  • XML
  

由于在Android Build工具中调用Resource Type:,强烈建议不要手动调用它,除非您了解完整的Android构建过程。

https://developer.android.com/studio/command-line/index.html

就“算法”而言,除了简单地将aapt映射到如上定义的资源之外,我认为它不是那么复杂。在项目中Resource ID意义上存在一些复杂性。 例如图书馆项目 - &gt;您的应用项目:

  

构建工具将库模块中的资源与依赖应用程序模块的资源合并。如果在两个模块中都定义了给定的资源ID,则使用应用程序中的资源。|

     

如果多个AAR库之间发生冲突,则使用依赖项列表中首先列出的库中的资源(位于依赖项块的顶部)。

     

为避免公共资源ID的资源冲突,请考虑使用模块特有的前缀或其他一致命名方案(或在所有项目模块中是唯一的)。

https://developer.android.com/studio/projects/android-library.html#Considerations

鉴于大多数人对Merging Resources的问题,他们通常来自了解实际的第三方Resource.designer.cs来自何处以及如何获得支持的观点。以下是我个人使用的一些提示:

  1. 确保您的Application项目是根据最新的API版本编译的。通常,这将是Resources MSBuild属性。我的一位同事有一篇令人惊叹的博客文章经历了时间的考验:
  2. http://redth.codes/such-android-api-levels-much-confuse-wow/

    1. 找到<TargetFrameworkVersion>的来源。它来自官方的NuGet包吗?资源是什么时候引入Android框架的? (主要用于材料设计项目)。
    2. 例如,如果我收到有关Resource的错误消息,我可能会检查它所引入的API:

        

      在API级别21中添加

      https://developer.android.com/reference/android/R.attr.html#colorPrimary

      因此,我们现在知道我们至少需要API 21+才能使用此项目。

      1. 深入了解您要加载到项目中的依赖项。您可以使用dotPeek之类的反编译器来查看程序集,并查看它试图为您的项目提供的colorPrimary。此外,您可以查看相应Resources的{​​{1}}并查看其cache文件夹。这对于.aar / res/之类的大型绑定非常有用。对于较小的项目,请在反编译的Android Support
      2. 中查找Google Play Services字符串

        例如,让我们看看/res

        首先我们需要在我们的机器上找到缓存:

        .dll(如果你在OSX上遇到困难,我在这里写了一篇关于在这里找到这些路径的指南 - https://developer.xamarin.com/guides/android/troubleshooting/resolving-library-installation-errors/

        因此,我们现在可以查看此库试图提供给我们的所有相应com.android.support:appcompat-v7:24.2.1

        1. 最后一项是人们倾向于从他们的项目中删除AppData\Local\Xamarin\Xamarin.Android.Support.v7.AppCompat\24.2.1\embedded\res文件。 Resources进程完成后,它将生成一个新进程,否则将在Resource.designer.cs上失败。由您决定是否通过该步骤(即检查主项目aapt文件夹以查找新生成的aapt文件,以便将其重新包含在项目中。