关于R.java和ButterKinfe独特的R2.java的那些事
关于R.java和ButterKinfe独特的R2.java的那些事
一、Android的R.java文件
Android项目中,当Android应用程序被编译,会自动生成一个R类,包含了所有res/目录下资源的ID,如布局文件、资源文件、图片的ID等。
即在Android项目中会通过自动生成一个R.java文件的方式来保存项目中所有资源文件的标识。在主项目中生成的R.java中的资源声明是一个静态常量,而在Module中却是一个静态变量。
二、Android主项目和Module中R类的区别**
- Android主项目中的R类
在主项目中创建一个资源文件或者控件ID等(例如activity_main.xml的布局文件),则R.java中会自动添加一行静态常量。
当通过R.layout.activity_main的方式使用资源,编译代码之后,静态常量会被直接替换成值。代码运行过程中,直接通过值来寻找对应的资源。
- 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的那些事相关推荐
- python和java哪个好找工作-Python和java哪个就业前景好些?
之前写过一篇文章,Python和Java哪个更适合做自动化测试? 这个和Python和JAVA哪个更有发展前景?有着异曲同工之妙. Python和Java的争锋由来已久,作为测试菜鸟入门测试行业,都会 ...
- java fields是_一个快速生成R2.java中fields的插件
一个快速生成R2.java中fields的插件 项目地址:github.com/JeasonWong/- 介绍 在子 module 中使用 ButterKnife 时,如果想使用 ButterKnif ...
- java矩阵传递给r_从JAVA调用R得到卡方统计和p值
我在JAVA中有两个4 * 4矩阵,其中一个矩阵包含观察计数和其他预期计数. 我需要一种自动的方法来计算这两个矩阵之间的卡方统计量的p值; 但是,就我所知,JAVA没有这样的功能. 我可以通过将两个矩 ...
- Android R系统aidl文件怎么对应的java文件找不到了?
Android R系统aidl文件怎么对应的java文件找不到了? 引言 Android系列博客沉寂很久了,很久了!不是我已经离开了江湖,而是最近忙着给OpenHarmony鸿蒙小系统,标 ...
- java运行不了html,由于Java出现问题,无法在R中安装htmlunit
我想搜刮一些运行AJAX的网站,我发现了htmlunit.但是安装这个软件包是不可能的.当我运行此命令时: install.packages("htmlunit", repos = ...
- java线程卡住排查_基于 Java 线程栈 排查问题
除日志外,还有没有别的方式跟踪线上服务问题呢?或者,跟踪并排除日志里无法发现的问题? 方法当然是有的,就是通过现场快照定位并发现问题.我们所说的现场,主要指这两方面: Java 线程栈.线程栈是Jav ...
- java视频马_【B0718】[java视频教程]某马2019年Java进阶课日志框架视频教程 it教程...
Java视频教程名称:某马2019年Java进阶课日志框架视频教程 java自学网[javazx.com] 日志框架视频教程 it教程 Java自学网收集整理 java论坛' k&am ...
- Java基础教程带你走进java的世界
Java教程 Java简介 什么是Java? Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称. Java分为三个体系: Java ...
- 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 ...
最新文章
- hibernate正向生成数据库表以及配置——Student.java
- Linux安装jdk学习
- 用TLS实现安全TCP传输及配置和访问https的web服务(转)
- c语言数组求逆序对,LeetCode 面试题51. 数组中的逆序对
- 傅里叶变换音频可视化_HTML5如何实现音频可视化频谱跳动
- NOIP2021:游记
- Twitter Storm 序列化
- POJ 3694 Network
- jcmd jmap应用:一个String经典笔试题的验证
- android界面设计所用中文什么字体,「界面」手机界面设计字体大小知多少
- GEO数据库数据下载
- 如何做字幕?用语音识别生成字幕?
- wps软件打不开共享超链接_ppt超链接文件打不开,wps的ppt超链接打不开
- 特别实用的正则在线工具regexr
- php免费利用飞信发送验证码,PHP 使用飞信 API 来发送免费短信
- 布朗的计算机排名,布朗计算机工程硕士排名,千万好好考查
- Linux VIM常用命令总结
- Geant4不完全学习指南2(根据exampleB1.cc 简单分析G4RunManager源代码)
- React18升级和React18新特性
- Revit教程免费下载——Revit建筑施工图高级视频课程