R文件与switch-case表达式的恩怨

2019-07-25  本文已影响0人  清明捉鬼

前言

很久之前在打包aar时遇到资源文件switch-case语句报错问题,按alt+enter IDE直接给我转if- else,今天写代码时想到有钱人的特权时突然联想到这个问题,于是搜集一番,整理成简短文。

题为——R文件与switch-case表达式的恩怨。

R文件

R文件对子模块与主工程的影响

Tips:
下文的 子模块 即为 Library , 主工程 可以理解为 父模块,key 可以理解为R文件中id的字段名
1.switch-case 中的 case 表达式,必须使用常量或者直接使用具体值
2.R文件生成的最终值必须要求在一个分配体系中,否则容易出现多key一值

以color资源为例进行探究试验

子模块 主工程
作为依赖aar时主工程生成的LibraryR文件id image.png 单独生成aar时生成的R文件id image.png 示例color资源文件 image.png 主工程生成的R文件id image.png 示例color资源文件 image.png

上表实验中我特意设置子模块 单独拥有colorAccents2颜色,主工程单独拥有colorPrimary2颜色
可以从主工程生成的R文件中看出其包含了子模块的colorAccents2的id,但是子模块与主工程冲突的颜色id却只有主工程的,so我初步得出当两个R文件发生冲突时,其以主工程id为准的猜想,为了证明猜想正确,我在Library设置了两个图片

9009142-155ed73479557cb7.png
,这两个图片的resourceId与主工程里的冲突,打包成apk运行后
[图片上传中...(9009142-155ed73479557cb7.png-83f6df-1564056272492-0)]
可以看出其代码没变,变的是指向id,所以结论正确。
所以经工程测试试验对比发现,则其实可以得出结论子模块R文件与父工程R文件在打包时会发生内容merge,当两个id引用名冲突时,默认其值为父模块id值。
上述表中子模块有两组R文件,分别是独立打包时生成的(生成的final修饰),另一个是作为依赖在主工程里打包生成(生成的final修饰)注意区分。
上一篇下一篇

猜你喜欢

热点阅读