关于ApplicationInfo flags快速了解
在Application中我们可以常常通过添加flags来标志一些属性和能力,比如android:protectionLevel="system"或android:protectionLevel="signatureOrSystem"就表示添加了FLAG_SYSTEM这个标志,表示属于系统级应用,当然,这个FLAG_SYSTEM依赖于签名检查或权限。
flag的判断和使用
首先在Application中flages的默认值是0,而这些标志则用移位运算符号(<<) 表示。
以flag:FLAG_TEST_ONLY为例子
- 对于int值 1 来说,他的二进制为00000000 00000000 00000000 00000001(32位),FLAG_TEST_ONLY= 1<<8; 相对于 将1向左移动8位即00000000 00000000 00000001 00000000 == 2的8次方 即256
- 如果此时我们的flags只添加了FLAG_DEBUGGABLE,那么此时flags这个标识的值为2 (二进制表示为00000000 00000000 00000000 00000010),当我们需要再去添加FLAG_TEST_ONLY标识时,其实是做了或位运算**,flags=flags|FLAG_TEST_ONLY**
- 或位运算运算过程即二进制下同一位上如果有1则赋1,如下
| 计算对象 | 第32位 | … | 第10位 | 第9位 | 第8位 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| flags | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| FLAG_TEST_ONLY | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 计算后flags | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
所以flags的最后结果就是00000000 00000000 00000001 00000010 即 258,这时可能会有同学好奇为什么不直接加起来,这样结果不是一样的吗?这时其实就要考虑一种情况,我的flags如果在代码中添加的这个flag(比如FLAG_TEST_ONLY)之前已经添加过了,就会重复计算,那么这时我们的结果就会出现问题,所以或位是目前较为好的选择。
简单来说,你可以把每一位想成一个flag,如果你添加了此flag那么这个二进制位上的值肯定是1,如果没有就是0,其中首位是符号位,这样的好处就是不用通过设置大量的bool变量来标识是否开启。
/**
* Value for {@link #flags}: set to true if this application would like to
* allow debugging of its
* code, even when installed on a non-development system. Comes
* from {@link android.R.styleable#AndroidManifestApplication_debuggable
* android:debuggable} of the <application> tag.
*/
public static final int

6278

被折叠的 条评论
为什么被折叠?



