APP安装列表
APP安装列表用于查询和统计设备上已安装的应用信息。该模块分为包名统计和设备统计两个维度。
其中,按设备统计基于设备定时采集并上报的非系统APK列表(也可通过事件上报接口 /task/recoedDeviceEvent 的 APP_INSTALL 事件上报),数据实时入库;包名统计则是通过定时离线任务,对设备上报的原始数据进行维度转换和聚合统计后生成。每月上报的数据单独存储,支持跨月对比。
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 消费入库),存储在 app_install_device 表中。每台设备每月保留一份最新的全量快照,可用于精准还原特定时间点的设备应用环境。
- 直接访问:点击跳转到设备统计
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_INSTALL)实时上报:
3.2 数据模型关系图
各层级数据表之间的逻辑关系如下:
3.3 详细处理逻辑
3.3.1 实时入库 (AppInstallListConsumer)
- 数据源入口:
- 设备定时采集:设备端直接上报非系统APP列表。
- 事件上报:设备端通过
/task/recoedDeviceEvent接口上报APP_INSTALL事件,由DeviceEventService接收并转发至app-install-listTopic。
- 入口:监听 Kafka Topic
${kafka.topic.app-install-list}。 - 逻辑:
- 配置检查:检查
AppInstallWriteDatabase配置开关,决定是否入库。 - 分表策略:根据当前月份(
YYYYMM)检查并自动创建设备维度表app_install_device_{MM}。 - 数据持久化:将消息体中的
AppInstallReqs列表序列化为 JSON 字符串,以 MAC + CPU 为唯一键存储或更新设备维度数据。
- 配置检查:检查
- 作用:作为原始数据仓库,保留设备上报的完整快照。
3.3.2 维度转换任务 (appInstallDeviceToPackage)
- 任务描述:将 设备维度 数据转换为 包名维度 数据,实现从 "查设备装了啥" 到 "查谁装了这个包" 的视角转换。
- 执行逻辑:
- 数据清理:任务开始前清空当月目标表
app_install_package_{MM},保证数据一致性。 - 分区并行处理:
- 按照 MAC/CPU 哈希分区(默认 100 个分区)遍历数据。
- 使用
ThreadPoolExecutor线程池并发读取设备维度表。
- JSON 展开:将
app_install_device中的 JSON 数组解析,为每个 APP 生成一条独立的app_install_package记录。 - 批量写入:每积攒一定数量(如 5000 条)或分区处理结束时,批量插入目标表。
- 数据清理:任务开始前清空当月目标表
- 关键技术:多线程并行、分区扫描、批量 JDBC 操作。
3.3.3 包名统计任务 (appinstallCountByPackageName)
- 任务描述:基于包名维度数据,统计每个 APP 的安装设备总量。
- 执行逻辑:
- 数据清理:清空当月统计结果表
app_install_count_package_{MM}。 - 聚合计算:
- 遍历所有分区。
- 对
app_install_package_{MM}表按package_name进行COUNT(DISTINCT device)聚合。
- 结果存储:将统计结果(包名、应用名、设备数)写入结果表,供前端 "包名统计" 页面快速查询。
- 数据清理:清空当月统计结果表