【问题标题】:final field in R2.java in ButterKnifeButterKnife 中 R2.java 中的 final 字段
【发布时间】:2018-02-02 06:44:33
【问题描述】:

这是Android: Why do we need to use R2 instead of R with butterknife?Reference in R.java not final 的扩展

我了解库项目中 R.java 的字段没有 final 修饰符来保护库项目之间的值冲突。但是 ButterKnife 在 R2 中恢复了最终修饰符并使用它。

我认为这涉及到碰撞问题,值可以碰撞,但没有问题。它是如何工作的?

===

我添加示例。 有一个主项目和一个库项目。主项目有 com.main.R,库项目有 com.library.R。

  1. 发生碰撞时:
    • com.main.R: public static final int example = 0x1234
    • com.library.R:公共静态整数示例 = 0x1234

如果构建工具不重新编译库项目,我们如何避免这些值之间的冲突?

  1. 当 ButterKnife 创建 R2
    • com.main.R: public static final int example = 0x1234
    • com.library.R:公共静态整数示例 = 0x1234
    • com.library.R2:公共静态最终 int 示例 = 0x1234

com.library.R2 有一个冲突,甚至它有一个 final 修饰符。它不会产生问题吗?为什么?

谢谢

【问题讨论】:

  • 请注意,final 在 main R.java 中不再使用。参考这个tools.android.com/tips/non-constant-fields
  • @Debdeep 非常感谢您的帮助,但我很难理解您。 “final不再用于主R.java”这是什么意思? That document 说 final 仅在库项目的情况下被删除。
  • 其实是的,库项目中的final在映射到主R.java时不再被接受。

标签: android butterknife


【解决方案1】:

虽然 final 关键字已从 R.java 生成的类中删除,因为它对构建性能造成负面影响,但 Butterknife 仅使用 final 为自己,这就是为什么每次只需要重新编译 Butterknife 代码将添加新的 ID。好处是 Butterknife 使用注解来确保我们返回的类型总是正确的。

来自文档:

换句话说,常量在库项目中不是最终的。原因很简单:当组合多个库项目时,字段的实际值(必须是唯一的)可能会发生冲突。在 ADT 14 之前,所有字段都是最终的,因此,所有库在使用时都必须将其所有资源和相关 Java 代码与主项目一起重新编译。 这对性能不利,因为它使构建速度非常慢。它还阻止了不包含源代码的库项目的分发,限制了库项目的使用范围。

这些字段不再是 final 的原因是它意味着库 jar 可以编译一次并直接在其他项目中重用。除了允许分发库项目的二进制版本(在 r15 中提供)之外,这还可以加快构建速度。

想象一下,如果 R.java 仍然应该包含 final 关键字,那么对于您在 android 项目中包含的每个库模块,都需要重新编译,从那时起,R.java 将被 Android 源代码使用和图书馆。因此,final 关键字现在已被删除。但是,Butterknife 仍然使用 final,因为它不关心冲突,但 BindView 注释在内部使用那些类型注释,如 @IdRes@StringRes@DrawableRes 等,以确保类型安全声明为一致的变量。

【讨论】:

  • 你能解释一下“Butterknife 只使用 final 本身,这就是为什么每次需要生成新的 id 时只需要重新编译 Butterknife 代码。”再来一次?
  • 我添加了例子
【解决方案2】:

我进一步调查。总之,

  • 在构建主项目时重新分配库项目中的资源值
  • 需要删除“Final”才能使用重新分配的值
  • R2 中的值未重新分配,因此可能会发生冲突,但它只是注释的标记。查找视图时使用的实际值来自R

详情在这里: https://battleshippark.wordpress.com/2018/02/12/butterknife-library-project-r2-final/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多