APP安装列表
APP安装列表用于查询和统计设备上已安装的应用信息。该模块分为包名统计和设备统计两个维度。
其中,按设备统计基于设备端通过事件上报接口 /task/recoedDeviceEvent 上报的 APP_INSTALL 事件(事件码=5),数据按配置间隔定时入库;包名统计则是通过定时离线任务,对设备上报的原始数据进行维度转换和聚合统计后生成。每月上报的数据单独存储,支持跨月对比。
1. 包名统计
APP安装列表的包名统计:在APP安装列表模块的包名统计功能中,从应用包名的角度出发,统计各APP在设备上的安装情况。数据来源为离线聚合表 app_install_count_package,由 XXL-JOB 定时任务从设备上报的原始数据中提取并统计生成。
- 直接访问:点击跳转到包名统计
1.1 包名统计概览(一级页面)
包名统计的一级页面:在APP安装列表的包名统计一级页面中,展示各APP的安装汇总数据。数据源为 app_install_count_package 表,由定时任务 appinstallCountByPackageName 每日/月度汇总生成,非实时数据。

操作说明:
- 支持通过 APP名称、包名、版本号、版本名称 进行搜索。
- 可选择 记录时间(月) 和 是否按版本号分组 来筛选数据。
字段说明:
- 包名:APP的包名。
- 版本号:APP的版本号(仅当查询条件中“是否按版本号分组”选择“是”时显示)。
- APP名称:APP名称。
- 版本名称:APP版本名称。
- 启动类名:APP的启动类名。
- 设备数量:截止统计任务执行时,对应月份 下的安装设备总数(非实时数据)。
- 统计月份:当前统计数据的月份。
- 创建时间:统计任务执行的时间(服务器时间)。
特色查询功能:
- 按包名汇总:不按版本号分组,只按包名统计。
-451586455570dd56d6d1948669d3c056.png)
数据导出:
- 同步导出:点击导出后,系统立即处理并返回导出结果。
1.2 包名详情(二级页面)
包名统计的二级页面:在APP安装列表的包名统计二级页面中,点击某一包名,可查看安装了该APP的具体设备列表。数据源为 app_install_package 表,由定时任务 appInstallDeviceToPackage 将设备维度数据拆解转换而来。
操作说明:
- 支持通过 MAC、CPU、APP名称、APP版本名称 进行搜索。
- 可选择 记录时间(月)(默认由一级页面带入,可修改)来筛选数据。

列表字段说明:
- MAC:设备MAC。
- CPU:设备CPU。
- 包名:APP的包名(一级页面选中带入)。
- 版本号:APP的版本号。
- 启动类名:APP的启动类名。
- 是否系统APP:是否系统APP。
- 创建时间:本月第一次收到该设备上报的时间(服务器时间)。
- 采集时间:设备本月最近一次上报时间(设备本地时间)。
- 更新时间:设备本月最近一次上报时间(服务器时间)。
数据导出:
- 同步导出:点击导出后,系统立即处理并返回导出结果。
- 异步导出:当数据量较大时,系统采用异步导出方式。您可以在 导出任务管理模块 中查看进度并下载文件。
2. 设备统计
在APP安装列表模块的设备统计功能中,从设备的角度出发,查看每台设备安装了哪些APP。 数据来源于设备端定时上报(通过 Kafka 消费入库),采集和上报间隔由设备心跳配置控制。每台设备每月保留一份最新的全量快照,可用于精准还原特定时间点的设备应用环境。
- 直接访问:点击跳转到设备统计
2.1 设备统计列表
设备统计的一级页面:在APP安装列表的设备统计一级页面中,展示每台设备的APP安装数量概况。数据来源于 app_install_device 表,反映了设备最近一次上报时的状态(数据时效性取决于设备采集和上报间隔配置)。

操作说明:
- 支持通过 MAC、CPU 进行搜索。
- 可选择 记录时间(月) 来筛选数据。
列表字段说明:
- MAC:设备MAC。
- CPU:设备CPU。
- APP数量:本月设备最近一次上报(更新时间)时的APP总数。
- 创建时间:本月第一次收到该设备上报的时间(服务器时间)。
- 采集时间:本月设备最近一次上报时间(设备本地时间)。
- 更新时间:本月设备最近一次上报时间(服务器时间)。
数据导出:
- 异步导出:当数据量较大时,系统采用异步导出方式。您可以在 导出任务管理模块 中查看进度并下载文件。
2.2 设备安装详情(二级页面)
设备统计的二级页面:在APP安装列表的设备统计二级页面中,点击某一设备,可查看该设备上安装的所有APP明细。

操作说明:
- 支持通过 APP名称、包名、APP版本名称 进行搜索。
- 可选择 记录时间(月)(默认由一级页面带入,可修改)来筛选数据。
字段说明:
- 包名:APP的包名。
- 版本号:APP的版本号(仅当查询条件中“是否按版本号分组”选择“是”时显示)。
- APP名称:APP名称。
- 版本名称:APP版本名称。
- 启动类名:APP的启动类名。
- 是否系统APP:是否系统APP。
- 采集时间:设备本月最近一次上报时间(设备本地时间)。
数据导出:
- 同步导出:点击导出后,系统立即处理并返回导出结果。
当导出数据量较大时,系统会采用异步导出方式。您可以在 导出任务管理 中查看导出进度并下载文件。
3. 数据处理与同步机制
APP安装列表模块采用 定时入库 + 定时离线分析 的架构,确保海量设备上报数据的高效写入与多维度统计。
3.1 数据上报入口
采集间隔配置 通过在设备心跳配置模块进行配置,之后设备端会按间隔时间采集并写入设备上报事件表,等待事件上报间隔时间到后上报
事件上报流程:
- 设备端按心跳配置的采集间隔,扫描本机安装的非系统APP列表
- 将APP列表写入设备上报事件表,等待事件上报间隔时间到后上报
- 通过调用
/task/recoedDeviceEvent接口上报,事件码为5(APP_INSTALL) - 后端接收后转发至 Kafka 消息队列,由消费者统一处理入库
3.2 核心数据流向图
下图展示了从设备上报到最终生成统计数据的完整流程:
3.3 数据模型关系图
各层级数据表之间的逻辑关系如下:
3.4 MySQL同步到ES
设备统计页面需要快速查询大量设备数据,因此系统将MySQL中的设备维度数据同步到Elasticsearch(ES)中,以提升查询性能。
同步机制:
- Canal监听:系统通过Canal组件监听MySQL设备维度表(
app_install_device_YYYYMM)的数据变更 - 变更推送:当表中有新增、更新、删除操作时,Canal将变更数据发送到Kafka Topic
- 消费同步:
AppInstallDeviceMysqlToEsConsumer消费变更消息,将数据同步写入ES
同步类型:
- INSERT:新增设备数据时,同步写入ES
- UPDATE:设备数据更新时,同步更新ES中对应文档
- DELETE:设备数据删除时,同步删除ES中对应文档
查询说明:
- 设备统计页面(一级页面)从ES查询数据,支持快速分页和排序
- 设备安装详情(二级页面)从MySQL查询APP明细列表
3.5 详细处理逻辑
3.5.1 消息消费入库 (AppInstallListConsumer)
- 数据源入口:设备端通过
/task/recoedDeviceEvent接口上报APP_INSTALL事件(事件码=5),由DeviceEventService接收并转发至app-install-listTopic。 - 入口:监听 Kafka Topic
${kafka.topic.app-install-list}。 - 逻辑:
- 配置检查:检查
AppInstallWriteDatabase配置开关,决定是否入库。 - 分表策略:根据当前月份(
YYYYMM)检查并自动创建设备维度表app_install_device_{MM}。 - 数据持久化:将消息体中的
AppInstallReqs列表序列化为 JSON 字符串,以 MAC + CPU 为唯一键存储或更新设备维度数据。
- 配置检查:检查
- 作用:作为原始数据仓库,保留设备上报的完整快照。
3.5.2 维度转换任务 (appInstallDeviceToPackage)
- 任务描述:将 设备维度 数据转换为 包名维度 数据,实现从 "查设备装了啥" 到 "查谁装了这个包" 的视角转换。
- 执行逻辑:
- 数据清理:任务开始前清空当月目标表
app_install_package_{MM},保证数据一致性。 - 分区并行处理:
- 按照 MAC/CPU 哈希分区(默认 100 个分区)遍历数据。
- 使用
ThreadPoolExecutor线程池并发读取设备维度表。
- JSON 展开:将
app_install_device中的 JSON 数组解析,为每个 APP 生成一条独立的app_install_package记录。 - 批量写入:每积攒一定数量(如 5000 条)或分区处理结束时,批量插入目标表。
- 数据清理:任务开始前清空当月目标表
- 关键技术:多线程并行、分区扫描、批量 JDBC 操作。
3.5.3 包名统计任务 (appinstallCountByPackageName)
- 任务描述:基于包名维度数据,统计每个 APP 的安装设备总量。
- 执行逻辑:
- 数据清理:清空当月统计结果表
app_install_count_package_{MM}。 - 聚合计算:
- 遍历所有分区。
- 对
app_install_package_{MM}表按package_name进行COUNT(DISTINCT device)聚合。
- 结果存储:将统计结果(包名、应用名、设备数)写入结果表,供前端 "包名统计" 页面快速查询。
- 数据清理:清空当月统计结果表
3.5.4 MySQL同步ES任务 (mysqlToEsAppInstallDevice)
- 任务描述:将MySQL中的设备维度数据批量同步到Elasticsearch,用于设备统计页面的快速查询。
- 执行逻辑:
- 分区遍历:按照分区索引遍历设备维度表。
- 批量读取:从MySQL读取每个分区的设备数据。
- 批量写入ES:将数据批量写入Elasticsearch对应的索引。
- 适用场景:当ES数据与MySQL不一致时,可手动触发此任务进行全量同步。
3.6 定时任务汇总
APP安装列表模块涉及以下定时任务,均通过XXL-JOB调度平台配置执行:
| 任务名称 | 任务说明 | 执行频率 | 数据来源 | 数据目标 |
|---|---|---|---|---|
| appInstallDeviceToPackage | 维度转换:将"设备装了哪些APP"转换为"哪些设备装了这个APP" | 按需配置 | app_install_device | app_install_package |
| appinstallCountByPackageName | 包名统计:统计每个APP被多少设备安装 | 按需配置 | app_install_package | app_install_count_package |
| mysqlToEsAppInstallDevice | ES同步:将MySQL设备数据同步到ES | 手动触发 | app_install_device | Elasticsearch |
任务执行顺序建议:
- 先执行
appInstallDeviceToPackage完成维度转换 - 再执行
appinstallCountByPackageName完成统计聚合 - 如需同步ES,执行
mysqlToEsAppInstallDevice