跳到主要内容

APP安装列表

核心概念:数据分析 | APP安装列表 | 概览

APP安装列表用于查询和统计设备上已安装的应用信息。该模块分为包名统计设备统计两个维度。

其中,按设备统计基于设备定时采集并上报的非系统APK列表(也可通过事件上报接口 /task/recoedDeviceEventAPP_INSTALL 事件上报),数据实时入库;包名统计则是通过定时离线任务,对设备上报的原始数据进行维度转换和聚合统计后生成。每月上报的数据单独存储,支持跨月对比。


核心概念:数据分析 | APP安装列表 | 1. 包名统计

1. 包名统计

APP安装列表的包名统计:在APP安装列表模块的包名统计功能中,从应用包名的角度出发,统计各APP在设备上的安装情况。数据来源为离线聚合表 app_install_count_package,由 XXL-JOB 定时任务从设备上报的原始数据中提取并统计生成。


核心概念:数据分析 | APP安装列表 | 1.1 包名统计概览(一级页面)

1.1 包名统计概览(一级页面)

包名统计的一级页面:在APP安装列表的包名统计一级页面中,展示各APP的安装汇总数据。数据源为 app_install_count_package 表,由定时任务 appinstallCountByPackageName 每日/月度汇总生成,非实时数据。

一级页面列表查询

操作说明

  • 支持通过 APP名称包名版本号版本名称 进行搜索。
  • 可选择 记录时间(月)是否按版本号分组 来筛选数据。

字段说明

  • 包名:APP的包名。
  • 版本号:APP的版本号(仅当查询条件中“是否按版本号分组”选择“是”时显示)。
  • APP名称:APP名称。
  • 版本名称:APP版本名称。
  • 启动类名:APP的启动类名。
  • 设备数量:截止统计任务执行时,对应月份下的安装设备总数(非实时数据)。
  • 统计月份:当前统计数据的月份。
  • 创建时间:统计任务执行的时间(服务器时间)。

特色查询功能

  • 按包名汇总:不按版本号分组,只按包名统计。 一级页面列表查询(不按版本号分组)

数据导出

  • 同步导出:点击导出后,系统立即处理并返回导出结果。

核心概念:数据分析 | APP安装列表 | 1.2 包名详情(二级页面)

1.2 包名详情(二级页面)

包名统计的二级页面:在APP安装列表的包名统计二级页面中,点击某一包名,可查看安装了该APP的具体设备列表。数据源为 app_install_package 表,由定时任务 appInstallDeviceToPackage 将设备维度数据拆解转换而来。

操作说明

  • 支持通过 MACCPUAPP名称APP版本名称 进行搜索。
  • 可选择 记录时间(月)(默认由一级页面带入,可修改)来筛选数据。

二级页面列表查询

列表字段说明

  • MAC:设备MAC。
  • CPU:设备CPU。
  • 包名:APP的包名(一级页面选中带入)。
  • 版本号:APP的版本号。
  • 启动类名:APP的启动类名。
  • 是否系统APP:是否系统APP。
  • 创建时间:本月第一次收到该设备上报的时间(服务器时间)。
  • 采集时间:设备本月最近一次上报时间(设备本地时间)。
  • 更新时间:设备本月最近一次上报时间(服务器时间)。

数据导出

  • 同步导出:点击导出后,系统立即处理并返回导出结果。
  • 异步导出:当数据量较大时,系统采用异步导出方式。您可以在 导出任务管理模块 中查看进度并下载文件。

核心概念:数据分析 | APP安装列表 | 2. 设备统计

2. 设备统计

在APP安装列表模块的设备统计功能中,从设备的角度出发,查看每台设备安装了哪些APP。 数据来源于设备端实时上报(通过 Kafka 消费入库),存储在 app_install_device 表中。每台设备每月保留一份最新的全量快照,可用于精准还原特定时间点的设备应用环境。


核心概念:数据分析 | APP安装列表 | 2.1 设备统计列表

2.1 设备统计列表

设备统计的一级页面:在APP安装列表的设备统计一级页面中,展示每台设备的APP安装数量概况。数据来源于 app_install_device 表,反映了设备最近一次上报时的状态(实时性取决于设备上报频率)。

列表查询

操作说明

  • 支持通过 MACCPU 进行搜索。
  • 可选择 记录时间(月) 来筛选数据。

列表字段说明

  • MAC:设备MAC。
  • CPU:设备CPU。
  • APP数量:本月设备最近一次上报(更新时间)时的APP总数。
  • 创建时间:本月第一次收到该设备上报的时间(服务器时间)。
  • 采集时间:本月设备最近一次上报时间(设备本地时间)。
  • 更新时间:本月设备最近一次上报时间(服务器时间)。

数据导出

  • 异步导出:当数据量较大时,系统采用异步导出方式。您可以在 导出任务管理模块 中查看进度并下载文件。

核心概念:数据分析 | APP安装列表 | 2.2 设备安装详情(二级页面)

2.2 设备安装详情(二级页面)

设备统计的二级页面:在APP安装列表的设备统计二级页面中,点击某一设备,可查看该设备上安装的所有APP明细。

二级页面列表查询

操作说明

  • 支持通过 APP名称包名APP版本名称 进行搜索。
  • 可选择 记录时间(月)(默认由一级页面带入,可修改)来筛选数据。

字段说明

  • 包名:APP的包名。
  • 版本号:APP的版本号(仅当查询条件中“是否按版本号分组”选择“是”时显示)。
  • APP名称:APP名称。
  • 版本名称:APP版本名称。
  • 启动类名:APP的启动类名。
  • 是否系统APP:是否系统APP。
  • 采集时间:设备本月最近一次上报时间(设备本地时间)。

数据导出

  • 同步导出:点击导出后,系统立即处理并返回导出结果。

异步导出

当导出数据量较大时,系统会采用异步导出方式。您可以在 导出任务管理 中查看导出进度并下载文件。

关联模块

核心概念:数据分析 | APP安装列表 | 3. 数据处理与同步机制

3. 数据处理与同步机制

APP安装列表模块采用 实时入库 + 定时离线分析 的架构,确保海量设备上报数据的高效写入与多维度统计。

3.1 核心数据流向图

下图展示了从设备上报到最终生成统计数据的完整流程。数据可以通过设备定时采集上报,也可以通过事件接口(APP_INSTALL)实时上报:

Mermaid Diagram Code:

flowchart TD
    %% 数据源
    Device[设备终端] -->|采集非系统APP列表/事件上报| MQ[Kafka 消息队列]
    
    %% 实时消费层
    subgraph RealTime [实时消费层]
        MQ -->|AppInstallEventDTO| Consumer[AppInstallListConsumer]
        Consumer -->|1. 检查/创建当月表| CheckTable{表是否存在?}
        CheckTable -->|是| SaveDevice[入库: 设备维度表]
        SaveDevice --> DeviceDB[(app_install_device_MM)]
    end
    
    %% 离线计算层
    subgraph OfflineJob [离线计算层 - XXL-JOB]
        %% 任务1: 维度转换
        Job1[任务: appInstallDeviceToPackage] -->|2. 读取-按分区| DeviceDB
        Job1 -->|3. JSON解析 & 维度展开| Job1Process[并行转换处理]
        Job1Process -->|4. 批量写入| PackageDB[(app_install_package_MM)]
        
        %% 任务2: 统计聚合
        Job2[任务: appinstallCountByPackageName] -->|5. 读取 & 聚合| PackageDB
        Job2 -->|6. 写入统计结果| CountDB[(app_install_count_package_MM)]
    end

    %% 关联说明
    style RealTime fill:#e1f5fe,stroke:#01579b
    style OfflineJob fill:#fff3e0,stroke:#e65100
    style DeviceDB fill:#f1f8e9,stroke:#33691e
    style PackageDB fill:#f1f8e9,stroke:#33691e
    style CountDB fill:#f1f8e9,stroke:#33691e

3.2 数据模型关系图

各层级数据表之间的逻辑关系如下:

Mermaid Diagram Code:

erDiagram
    %% 设备维度表
    APP_INSTALL_DEVICE {
        string mac "设备MAC"
        string cpu_id "设备CPU"
        json apps "APP列表JSON字符串"
        datetime create_time "上报时间"
        string month "分表月份"
    }

    %% 包名维度表 (中间表)
    APP_INSTALL_PACKAGE {
        string mac "设备MAC"
        string cpu_id "设备CPU"
        string package_name "包名"
        string app_name "应用名称"
        string version_code "版本号"
        datetime create_time "上报时间"
    }

    %% 包名统计表 (结果表)
    APP_INSTALL_COUNT_PACKAGE {
        string package_name "包名"
        string app_name "应用名称"
        int device_count "安装设备数"
        string month "统计月份"
    }

    %% 关系描述
    APP_INSTALL_DEVICE ||--|{ APP_INSTALL_PACKAGE : "1. 离线任务拆解 - JSON to 多行"
    APP_INSTALL_PACKAGE }|--|| APP_INSTALL_COUNT_PACKAGE : "2. 离线任务聚合 - Count"

3.3 详细处理逻辑

3.3.1 实时入库 (AppInstallListConsumer)

  • 数据源入口
    1. 设备定时采集:设备端直接上报非系统APP列表。
    2. 事件上报:设备端通过 /task/recoedDeviceEvent 接口上报 APP_INSTALL 事件,由 DeviceEventService 接收并转发至 app-install-list Topic。
  • 入口:监听 Kafka Topic ${kafka.topic.app-install-list}
  • 逻辑
    1. 配置检查:检查 AppInstallWriteDatabase 配置开关,决定是否入库。
    2. 分表策略:根据当前月份(YYYYMM)检查并自动创建设备维度表 app_install_device_{MM}
    3. 数据持久化:将消息体中的 AppInstallReqs 列表序列化为 JSON 字符串,以 MAC + CPU 为唯一键存储或更新设备维度数据。
  • 作用:作为原始数据仓库,保留设备上报的完整快照。

3.3.2 维度转换任务 (appInstallDeviceToPackage)

  • 任务描述:将 设备维度 数据转换为 包名维度 数据,实现从 "查设备装了啥" 到 "查谁装了这个包" 的视角转换。
  • 执行逻辑
    1. 数据清理:任务开始前清空当月目标表 app_install_package_{MM},保证数据一致性。
    2. 分区并行处理
      • 按照 MAC/CPU 哈希分区(默认 100 个分区)遍历数据。
      • 使用 ThreadPoolExecutor 线程池并发读取设备维度表。
    3. JSON 展开:将 app_install_device 中的 JSON 数组解析,为每个 APP 生成一条独立的 app_install_package 记录。
    4. 批量写入:每积攒一定数量(如 5000 条)或分区处理结束时,批量插入目标表。
  • 关键技术:多线程并行、分区扫描、批量 JDBC 操作。

3.3.3 包名统计任务 (appinstallCountByPackageName)

  • 任务描述:基于包名维度数据,统计每个 APP 的安装设备总量。
  • 执行逻辑
    1. 数据清理:清空当月统计结果表 app_install_count_package_{MM}
    2. 聚合计算
      • 遍历所有分区。
      • app_install_package_{MM} 表按 package_name 进行 COUNT(DISTINCT device) 聚合。
    3. 结果存储:将统计结果(包名、应用名、设备数)写入结果表,供前端 "包名统计" 页面快速查询。
AI 问答