关于R.java和ButterKinfe独特的R2.java的那些事

一、Android的R.java文件

  Android项目中,当Android应用程序被编译,会自动生成一个R类,包含了所有res/目录下资源的ID,如布局文件、资源文件、图片的ID等。
  即在Android项目中会通过自动生成一个R.java文件的方式来保存项目中所有资源文件的标识。在主项目中生成的R.java中的资源声明是一个静态常量,而在Module中却是一个静态变量

二、Android主项目和Module中R类的区别**

  1. Android主项目中的R类

  在主项目中创建一个资源文件或者控件ID等(例如activity_main.xml的布局文件),则R.java中会自动添加一行静态常量
  当通过R.layout.activity_main的方式使用资源,编译代码之后,静态常量会被直接替换成值。代码运行过程中,直接通过值来寻找对应的资源。

  1. Module中的R类

  在Module中添加资源后,R.java文件中自动添加的为静态变量而非静态常量。而这样也就导致了使用switch-case、注解以及凡是语法规定必须要用常量的地方都无法直接使用R.drawable。
  Android这样做的原因:如果在Module中添加了一个资源,假设R.java文件添加的是静态常量。那么就会导致如下三种问题。
  ① 该Module编译后的代码中该资源会被替换成值
  ② 该Module被添加到主项目中后,如果主项目中有一个同样名称的资源,那么Module中的该资源就会被替换
  ③ 主项目中会重新针对该资源生成一个ID,最终导致Module中的那个资源ID找不到;

三、ButterKnife独有的R2.java文件

  由于ButterKnife是一个依赖注入的框架,最为核心的使用方式就是使用注解进行依赖注入,而注解需要的属性是final的,因此为了解决这个问题,ButterKnife提供了一个解决方案:利用gradle拷贝一份R.java命名成R2.java,R2.java中的资源声明都是final,从而解决了Module中使用ButterKnife的问题。

  那么另一个问题来了:既然ButterKnife使用了R2.java中的资源声明是final,那么java complie的时候主项目中会重新对Module资源生成一个ID替换,那么为何实际运行中没有发生资源无法找到的问题?
  首先,每个Module各自打成aar的时候APPT会单独生成R.java,但是实际上Module在打成aar的时候是没有把R.java打进来的,相反却把R2.java打进aar了。
  其次,ButterKnife的APT生成的ViewBinding中取得的最终还是app生成的R.java中资源的ID。
  因此,总的来说就是,ButterKnife已经帮你搞定了这个问题,具体可以参照:R.java、R2.java是时候懂了中的ViewBind源码理解。

参考资料:Android主项目和Module中R类的区别
R.java、R2.java是时候懂了

关于R.java和ButterKinfe独特的R2.java的那些事相关推荐

  1. python和java哪个好找工作-Python和java哪个就业前景好些?

    之前写过一篇文章,Python和Java哪个更适合做自动化测试? 这个和Python和JAVA哪个更有发展前景?有着异曲同工之妙. Python和Java的争锋由来已久,作为测试菜鸟入门测试行业,都会 ...

  2. java fields是_一个快速生成R2.java中fields的插件

    一个快速生成R2.java中fields的插件 项目地址:github.com/JeasonWong/- 介绍 在子 module 中使用 ButterKnife 时,如果想使用 ButterKnif ...

  3. java矩阵传递给r_从JAVA调用R得到卡方统计和p值

    我在JAVA中有两个4 * 4矩阵,其中一个矩阵包含观察计数和其他预期计数. 我需要一种自动的方法来计算这两个矩阵之间的卡方统计量的p值; 但是,就我所知,JAVA没有这样的功能. 我可以通过将两个矩 ...

  4. Android R系统aidl文件怎么对应的java文件找不到了?

        Android R系统aidl文件怎么对应的java文件找不到了? 引言   Android系列博客沉寂很久了,很久了!不是我已经离开了江湖,而是最近忙着给OpenHarmony鸿蒙小系统,标 ...

  5. java运行不了html,由于Java出现问题,无法在R中安装htmlunit

    我想搜刮一些运行AJAX的网站,我发现了htmlunit.但是安装这个软件包是不可能的.当我运行此命令时: install.packages("htmlunit", repos = ...

  6. java线程卡住排查_基于 Java 线程栈 排查问题

    除日志外,还有没有别的方式跟踪线上服务问题呢?或者,跟踪并排除日志里无法发现的问题? 方法当然是有的,就是通过现场快照定位并发现问题.我们所说的现场,主要指这两方面: Java 线程栈.线程栈是Jav ...

  7. java视频马_【B0718】[java视频教程]某马2019年Java进阶课日志框架视频教程 it教程...

    Java视频教程名称:某马2019年Java进阶课日志框架视频教程      java自学网[javazx.com]  日志框架视频教程   it教程 Java自学网收集整理 java论坛' k&am ...

  8. Java基础教程带你走进java的世界

    Java教程 Java简介 什么是Java? Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称. Java分为三个体系: Java ...

  9. Java相关课程系列笔记之一Java学习笔记

    目 录 一. Java技术基础 1 1.1编程语言 1 1.2 Java的特点 1 1.3 Java开发环境 1 1.4 Java开发环境配置 2 1.5 Linux命令与相关知识 2 1.6 Ecl ...

最新文章

  1. hibernate正向生成数据库表以及配置——Student.java
  2. Linux安装jdk学习
  3. 用TLS实现安全TCP传输及配置和访问https的web服务(转)
  4. c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对
  5. 傅里叶变换音频可视化_HTML5如何实现音频可视化频谱跳动
  6. NOIP2021:游记
  7. Twitter Storm 序列化
  8. POJ 3694 Network
  9. jcmd jmap应用:一个String经典笔试题的验证
  10. android界面设计所用中文什么字体,「界面」手机界面设计字体大小知多少
  11. GEO数据库数据下载
  12. 如何做字幕?用语音识别生成字幕?
  13. wps软件打不开共享超链接_ppt超链接文件打不开,wps的ppt超链接打不开
  14. 特别实用的正则在线工具regexr
  15. php免费利用飞信发送验证码,PHP 使用飞信 API 来发送免费短信
  16. 布朗的计算机排名,布朗计算机工程硕士排名,千万好好考查
  17. Linux VIM常用命令总结
  18. Geant4不完全学习指南2(根据exampleB1.cc 简单分析G4RunManager源代码)
  19. React18升级和React18新特性
  20. Revit教程免费下载——Revit建筑施工图高级视频课程

热门文章

  1. JavaScript验证工具JSLint
  2. 腾然教育MCN覃小龙公子:覃宣量2022年2岁10个月亲子照
  3. 辽源天气预报软件测试,辽源市天气预报,辽源天气预报7天 - 今日天气 - 天气预报15天...
  4. 一小时入门vue组件(建议收藏)
  5. kettle任务在Linux服务器上定时调度
  6. 各类优化算法入门优秀论文总结目录
  7. Vue的生命周期的详解
  8. 马卡龙色创意美馔 戳中你的小心脏
  9. URL 的编码和解码
  10. 按键精灵手机助手插件 命令库同步