关于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 | 1 | |||||||||||
FLAG_TEST_ONLY | 1 | |||||||||||
计算后flags | 1 | 1 |
所以flags的最后结果就是00000000 00000000 00000001 00000010 即 258,这时可能会有同学好奇为什么不直接加起来,这样结果不是一样的吗?这时其实就要考虑一种情况,我的flags如果在代码中添加的这个flag(比如FLAG_TEST_ONLY)之前已经添加过了,就会重复计算,那么这时我们的结果就会出现问题,所以或位是目前较为好的选择。
简单来说,你可以把每一位想成一个flag,如果你添加了此flag那么这个二进制位上的值肯定是1,如果没有就是0,所以flag作为int类型最多也只能有32种标志位,这样的好处就是不用通过设置大量的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 FLAG_DEBUGGABLE = 1<<1;
/**
* Value for {@link #flags}: this is set if the application has specified
* {@link android.R.styleable#AndroidManifestApplication_testOnly
* android:testOnly} to be true.
*/
public static final int FLAG_TEST_ONLY = 1<<8;
public int flags = 0;
flag判断
和或位运算相似,我们通过与位运算即可判断该flags是否已添加了这个标志符,具体原理和或位相似,这里不做赘述,使用样例如下:
if ((getApplicationInfo().flags&ApplicationInfo.FLAG_TEST_ONLY)!=0){
//包含了此flag
.......
}else {
//未包含
.......
}
flag添加
对于flag我们的使用方式有两种
一种为直接在 applicatio 标签下添加需要的flag标识
<application
.....
android:allowBackup="true" //对应FLAG_ALLOW_BACKUP
android:protectionLevel="system" //对应FLAG_SYSTEM
android:testOnly="true"> //对应FLAG_TEST_ONLY
........
</application>
另一种可以通过获取到ApplicationInfo中的flags在代码里通过或为运算添加
ApplicationInfo中的flag 解析大全
flage名字 | 内容描述 | 值 |
---|---|---|
FLAG_SYSTEM | 如果设置,则此应用程序安装在设备的系统映像中 | 1<<0 |
FLAG_DEBUGGABLE | 如果此应用程序希望允许调试其代码,则设置为 true,即使安装在非开发系统上也是如此。 application 标签android:debuggable | 1<<1 |
FLAG_HAS_CODE | 如果此应用程序具有与其关联的代码,则设置为 true。 application 标签android:hasCode | 1<<2 |
FLAG_PERSISTENT | 如果此应用程序是持久的,则设置为 true。 application 标签android:persistent | 1<<3 |
FLAG_FACTORY_TEST | 如果此应用程序拥有android.Manifest.permission.FACTORY_TEST权限并且设备在工厂测试模式下运行,则设置为 true。 | 1<<4 |
FLAG_ALLOW_TASK_REPARENTING | 默认添加,android:allowTaskReparenting,一般和TaskAffinity属性配对使用 | 1<<5 |
FLAG_ALLOW_CLEAR_USER_DATA | 默认添加,android:allowClearUserData,用户是否能选择自行清除数据,默认为true,程序管理器包含一个选择允许用户清除数据。当为true时,用户可自己清理用户数据,反之亦然 | 1<<6 |
FLAG_UPDATED_SYSTEM_APP | 如果此应用程序已安装为内置系统应用程序的更新,则设置此值。 | 1<<7 |
FLAG_TEST_ONLY | application 标签 android:testOnly ,标识应用仅用于测试 | 1<<8 |
FLAG_SUPPORTS_SMALL_SCREENS | 当应用程序的窗口可以缩小以适应较小的屏幕时为真。 对应于android:smallScreens | 1<<9 |
FLAG_SUPPORTS_NORMAL_SCREENS | 当应用程序的窗口可以在普通屏幕上显示时为真。 对应于android:normalScreens | 1<<10 |
FLAG_SUPPORTS_LARGE_SCREENS | 当应用程序的窗口可以为更大的屏幕增加大小时为真。 对应于android:largeScreens | 1<<11 |
FLAG_RESIZEABLE_FOR_SCREENS | 当应用程序知道如何针对不同的屏幕尺寸调整其 UI 时为 true。 对应于android:resizeable | 1<<12 |
FLAG_SUPPORTS_SCREEN_DENSITIES | 当应用程序知道如何适应不同的屏幕密度时为真。 对应于android:anyDensity 。已弃用:以 API 4 或更高版本为目标时默认设置,应用程序不应将此设置为 false | 1<<13 |
FLAG_VM_SAFE_MODE | 如果此应用程序想要请求 VM 在安全模式下运行,则设置为 true。 application标签 android:vmSafeMode | 1<<14 |
FLAG_ALLOW_BACKUP | 如果应用程序不希望允许对其数据进行任何操作系统驱动的备份,则设置为false ; 否则为true 。application 标签android:allowBackup属性。 | 1<<15 |
FLAG_KILL_AFTER_RESTORE | 如果应用程序必须在全系统还原操作后保留在内存中,则设置为false ; 否则为true 。 通常,在完整的系统还原操作期间,每个应用程序都会在执行其代理的 onRestore() 方法后关闭。 将此属性设置为false可防止出现这种情况。 大多数应用程序不需要设置此属性。如果android:allowBackup设置为false或未指定android:backupAgent ,则该标志将被忽略。application 标签android:killAfterRestore属性。 | 1<<16 |
FLAG_RESTORE_ANY_VERSION | 如果应用程序的备份代理声称能够处理甚至“来自未来”的恢复数据,即来自版本代码大于设备上当前安装的版本代码的应用程序版本,则设置为true 。 谨慎使用! 默认情况下,此属性为false ,备份管理器将确保在还原操作期间永远不会提供来自应用程序“未来”版本的数据。如果android:allowBackup设置为false或未指定android:backupAgent ,则该标志将被忽略。application 标签android:restoreAnyVersion属性。 | 1<<17 |
FLAG_EXTERNAL_STORAGE | 如果应用程序当前安装在外部/可移动/不受保护的存储上,则设置为 true。 如果当前未安装此类应用程序的存储,则此类应用程序可能不可用。 当它所在的存储不可用时,它看起来像是应用程序已被卸载(其 .apk 不再可用),但其持久数据并未删除 | 1<<18 |
FLAG_SUPPORTS_XLARGE_SCREENS | 当应用程序的窗口可以为超大屏幕增加大小时为真。 对应于android:xlargeScreens | 1<<19 |
FLAG_LARGE_HEAP | 当应用程序为其进程请求大堆时为真。 对应于android:largeHeap | 1<<20 |
FLAG_STOPPED | 如果此应用程序的包处于停止状态,则为 true。 | 1<<21 |
FLAG_SUPPORTS_RTL | 当应用程序愿意支持 RTL(从右到左)时为 true。 所有活动都会继承这个值。 从活动清单中的android.R.attr.supportsRtl属性设置。 默认值为 false(不支持 RTL) | 1<<22 |
FLAG_INSTALLED | 如果当前为调用用户安装了应用程序,则为 true。 | 1<<23 |
FLAG_IS_DATA_ONLY | 如果应用程序只安装了它的数据,则为 true; 应用程序包本身当前不存在于设备上 | 1<<24 |
FLAG_IS_GAME | flags值:如果应用程序被声明为游戏,则为 true,如果它是非游戏应用程序,则为 false。已弃用:请改用CATEGORY_GAME 。 | 1<<25 |
FLAG_FULL_BACKUP_ONLY | true如果应用程序要求,只有全数据流的数据进行备份,即使它定义了一个进行BackupAgent ,这通常表示该应用程序将通过增量键/值更新管理其备份数据。 | 1<<26 |
FLAG_USES_CLEARTEXT_TRAFFIC | 如果应用程序可能使用明文网络流量(例如,HTTP 而不是 HTTPS;WebSockets 而不是 WebSockets Secure;XMPP、IMAP、STMP 没有 STARTTLS 或 TLS),则为true 。 如果为false ,则应用声明它不打算使用明文网络流量,在这种情况下,平台组件(例如,HTTP 堆栈、 DownloadManager 、 MediaPlayer )将拒绝应用使用明文流量的请求。 鼓励第三方图书馆也尊重这个标志。**注意: WebView为面向 API 级别 26 及更高级别的应用程序提供此标志。**如果存在 Android 网络安全配置,则在 Android N 及更高版本上会忽略此标志。application 标签 android:usesCleartextTraffic | 1<<27 |
FLAG_EXTRACT_NATIVE_LIBS | 设置安装程序从 .apk 文件中提取本机库时为true | 1<<28 |
FLAG_HARDWARE_ACCELERATED | 当应用程序的渲染应该是硬件加速时为true | 1<<29 |
FLAG_SUSPENDED | 如果此应用程序的包处于挂起状态,则为 true | 1<<30 |
FLAG_MULTIARCH | 如果来自此应用程序的代码需要加载到其他应用程序的进程中,则为 true。 在支持多个指令集的设备上,这意味着代码可能会加载到使用任何设备支持的指令集的进程中。系统可能会特别对待此类应用程序,例如,通过为所有支持的指令集提取应用程序的本地库或通过为所有支持的指令集编译应用程序的 dex 代码 | 1<<31 |
最后
资料整理不易,如果可以,请同学们多多点赞,收藏,鼓励!!!
