当前位置: 首页 > news >正文

应用标签思路参考

目的:

基于pid维度建立1.应用使用资源标签例如sensor,gps,bluetooth,audio,NFC,camera,  麦克风等,2.应用状态标签例如是否可见,前台,后台,上传下载等,3.应用和系统关联的标签例如widget,画中画,悬浮窗,知通栏等,为应用冻结,关联启动,CPU锁托管,查杀应用,限制应用的IO等快稳省策略提供标签支撑。

原理:

1.建立native、systemserver和app的插桩机制,涉及AMS\WMS\AUDIO\CAMERA\GPS\SENSOR\BT\NOTIFICATION\VIDEO等插桩

2.基于位掩码操作例如|= 添加状态,&= ~ 清除状态,^ 检测变化管理20多个标签值,&的方式确定标签状态的值,可高效低内存获取应用的单个或多个标签状态

3.Python定期爬虫8万多应用类型数据库,并提供同进程和跨进程的单/批量查询与应用类型变化监听给桌面分类、游戏模式和统一资源调度

4.基于状态机建立IDLE-RUNNING-HIBERNATION的三态机制,分层过渡冻结前释放非关键资源减少误冻结概率

构建了uid~package~pid的关系,并建立pid维度的标签链

0

事件类型

触发场景

AUDIO_OUT

应用使用/停止音频输出(播放音乐等)

VIDEO

应用使用/停止视频播放

VISIBLE

应用切换到前台/后台

NOTIFICATION

应用添加/移除状态栏通知

FLOATVIEW

应用显示/关闭悬浮窗

AUDIO_IN

应用启用/停用麦克风

BLUETOOTH

应用连接/断开蓝牙设备

GPS

应用请求/停止定位

APPWIDGET

应用绑定/解绑桌面小部件

SENSOR

应用使用传感器(加速度、陀螺仪等)

CAMERA

应用打开/关闭摄像头

FOREGROUND_SERVICE

应用启动/停止前台服务

APP_STARTED

应用进程启动或死亡

DOWNLOAD

应用下载任务开始/完成/失败

VPN_STATE

VPN连接建立/断开

TTS_STATE

应用连接/断开文本转语音引擎

RUNNING

应用进程正在运行(非缓存)

APPIDLE

应用进入/退出省电空闲模式

HIBERNATION

应用被冻结/解冻(Android 12+)

标签的掩码使用

通过位掩码(Bitmask)管理多状态​​​​​​​​​​​​​​

(state  & SOURCE_GPS) != 0, 说明这个应用在使用GPS,否则没有在使用GPS(state  & SOURCE_GROUP ) != 0 说明这个应用在使用资源 的某个或多个标签protected void setState(int flag, int state) {    ....    // 根据 enable 参数修改全局状态 mState(位掩码操作)    if (enable) {        mState |= flag; // 将对应flag的位设为1,即添加flag状态    } else {        mState &= ~flag; // 将对应flag的位设为0,即清除flag状态    }    ...}public void notifyPidExit(int pid, String reason) {    if (AppRecordUtils.DEBUG) {        BlackviewTool.logD(TAG, "notifyPidExit:pid=" + pid + ",reason=" +reason);    }    mLastState = mState;    // 清除 STATE_PID 相关位    mState &= ~STATE_PID;    for (int idx = mPids.size() - 1; idx >= 0; idx--) {        ProcessRecord procState = mPids.valueAt(idx);        // 若 mNotification 为 true,则将 STATE_NOTIFICATION 标志位设为 1;否则保持 mState 不变        mState |= procState.mNotification ? STATE_NOTIFICATION : 0;        ...    }    if (mState != mLastState) {        // ^ 检测变化        notifyStateChanged(pid, mLastState ^ mState, false);    }}

http://www.dtcms.com/a/267567.html

相关文章:

  • wsl查看磁盘文件并清理空间
  • Django跨域
  • 什么是单点登录SSO?有哪些常用的实现方式?
  • Android PNG/JPG图ARGB_8888/RGB_565‌解码形成Bitmap在物理内存占用大小的简单计算
  • SpringBoot系列—入门
  • ffplay6 播放器关键技术点分析 1/2
  • NumPy-核心函数np.matmul()深入解析
  • UI前端与数字孪生融合:为智能制造提供可视化生产调度方案
  • 分享一些服务端请求伪造SSRF的笔记
  • RAL-2025 | 触觉助力无人机空中探索!基于柔顺机器人手指的无人机触觉导航
  • 快讯|美团即时零售日订单已突破1.2亿,餐饮订单占比过亿
  • 【第五章】 工程测量学
  • ASP.NET代码审计 MVC架构 SQL注入漏洞n
  • 《设计模式之禅》笔记摘录 - 4.抽象工厂模式
  • Puppeteer page.$$(selector)
  • Swift 数学计算:用 Accelerate 框架让性能“加速吃鸡”
  • go基本用法
  • CentOS虚拟机ifconfig命令不显示IP地址解决方法
  • 【无标题】JavaScript入门
  • LESS/SCSS 高效主题换肤方案
  • P1424 小鱼的航程(改进版)
  • WPF学习笔记(24)命令与ICommand
  • LeetCode 第91题:解码方法
  • 二叉树题解——二叉搜索树中第 K 小的元素【LeetCode】使用外部变量ans记录答案
  • C++ 网络编程(15) 利用asio协程搭建异步服务器
  • 【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的关系是什么?
  • [学习] 深入理解 POSIX
  • 面试150 最长连续序列
  • Node.js worker_threads深入讲解教程
  • 【LeetCode102.二叉树的层序遍历】vs.【LeetCode103.二叉树的锯齿形层序遍历】