Android 关于ApplicationInfo flags快速了解
关于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 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_BACKUPandroid:protectionLevel="system" //对应FLAG_SYSTEMandroid:testOnly="true"> //对应FLAG_TEST_ONLY........
</application>
另一种可以通过获取到ApplicationInfo中的flags在代码里通过或为运算添加
getApplicationInfo().flags=getApplicationInfo().flags| ApplicationInfo.FLAG_TEST_ONLY;
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 |
最后
资料整理不易,如果可以,请同学们多多点赞,收藏,鼓励!!!
Android 关于ApplicationInfo flags快速了解相关推荐
- android设备局域网中快速搜索之cling方式
cling方式就像pc端windows局域网工作组刷新显示一样,原来用过扫描ip地址的方式,可以使用就是有点慢,还有一种自己加入组广播,通过发送组广播的方式. android设备局域网中快速搜索之cl ...
- Android自定义控件之实现快速检索
前言:关于这个快速检索我们平常见到的app应用的很多,比如手机通讯录联系人.微信朋友,以及其他的商品列表等,实现的功能就是通过右侧或者左侧的字母进行快速检测,OK!今天我就带领大家来实现这个功能! - ...
- Android APP如何简单快速实现控制硬件设备并实现APP签名
Android APP如何简单快速实现控制硬件设备 driver(C)层 硬件控制 节点的创建 APP(java)层 native(C/C++)层 接下来上干货,重点说说实现流程 Android st ...
- Android友盟+U-APM快速集成与极致体验
文章目录 一.前言 二.快速集成 2.1 账号注册 2.2 创建应用 2.3 Demo下载 2.4 Demo导入 2.5 Demo试跑 三.极致体验 3.1 第一个App崩溃 3.2 查看后台崩溃信息 ...
- Android仿微信实现快速索引选择联系人
Android仿微信实现快速索引选择联系人 原创 2016年03月05日 13:19:20 1640 3 1 一.概述 先看效果图,然后在给大家慢慢介绍 二.实现 先给大家说说这些城市的数据是怎么来 ...
- Android系统启动阶段多种快速重启系统方法试验记录
Android系统启动阶段多种快速重启系统方法试验记录 笔者的系统是android4.2 A20平台,平台使用的是ext4文件系统.按我以前的经验对于nand来说yaffs对系统突然断电重启会好很多. ...
- android 文件加密解决方法,一种Android平台的文件快速加密以及解密方法与流程
本发明属于数据安全领域,具体涉及一种Android平台的文件快速加密以及解密方法. 背景技术: 目前移动办公系统极大地提升了企.事业单位的工作效率,而带装有办公应用的智能设备中会存储一些较高机密性的文 ...
- android 让应用悬浮,快速回复+app下载
快速回复+应用多窗口,在玩游戏或者看视频的时候可以开启悬浮窗口回复消息,不用特意切换后台回复消息非常方便.可以自由调节软件的窗口大小以及位置,无需root就能使用.内存占用小不用担心会对其他应用造型卡 ...
- Android——使用Toolbar + DrawerLayout快速实现高大上菜单侧滑(转)
今天就来使用官方支持库来快速实现这类效果,需要使用到Toolbar和DrawerLayout,详细步骤如下:(如果你还不知道这两个Widget,先自己Google吧~) 1.首先需要添加appcomp ...
- Android 使用Toolbar+DrawerLayout快速实现仿“知乎APP”侧滑导航效果
在以前,做策划导航的时候,最常用的组件便是SlidingMenu了,当初第一次用它的时候觉得那个惊艳啊,体验可以说是非常棒. 后来,Android自己推出了一个可以实现策划导航的组件DrawerLay ...
最新文章
- 深入探秘 Netty、Kafka 中的零拷贝技术!
- telegraf input的配置
- LightOj 1078 Basic Math
- 杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...
- 数据结构与算法--代码完整性案例分析
- 多队列 部分队列没有包_记一次TCP全队列溢出问题排查过程
- 链表每k个反转 java_K 个一组翻转链表
- 自己常用的C/C++小技巧
- python 数据结构与算法
- 那个代工 iPhone 的富士康投了 21 亿要做 AI 研发
- python画正态分布_python 画正态曲线
- 二级C语言office公共基础知识点
- 思科模拟器(学生版)、汉化包的下载及其安装步骤
- 两张图片怎样合成一张左右拼图?
- 【笔记】nginx - 上:安装、配置(基础、rewrite 重写、proxy_pass 代理、ssl)
- flex布局,子元素设置flex: 1和nowrap,内容长度超出盒子
- 什么是Timestamp——时间戳?
- Go语言开发k8s-04-Service操作
- 概率与期望——P4316 绿豆蛙的归宿
- Python游戏开发,pygame模块,Python实现超级玛丽100%真实版