Android InstalldNativeService::getAppSize源码分析

InstalldNativeService::getAppSize 是 Android 系统中用于计算应用程序存储空间的核心方法,其逻辑可分为以下几个关键模块(结合代码和上下文分析):

一、基础校验与初始化

​​1. 权限校验​​

通过 ENFORCE_UID(AID_SYSTEM) 确保仅系统进程可调用,防止越权操作。

​​2. 路径参数校验​​

使用 CHECK_ARGUMENT_* 宏校验 packageNames 和 codePaths 合法性,避免无效路径导致计算异常。

二、存储路径与统计分类

  1. 统计结构体
    stats:记录内部存储(Internal Storage)的 codeSize(代码大小)、dataSize(数据大小)、cacheSize(缓存大小)。
    extStats:记录外部存储(External Storage)的 codeSize、dataSize、cacheSize。
  2. 关键路径定义
    OBB 文件:路径为 /data/media/obb/[package],计入 extStats.codeSize。
    应用数据目录:包括 /data/user/[userId]/[package](CE 路径)和 /data/user_de/[userId]/[package](DE 路径),计入 stats.dataSize。
    外部媒体目录:如 /sdcard/Android/data/[package],计入 extStats.dataSize。

三、计算逻辑分支(Quota 与手动遍历)

​​1. Quota 模式(高效计算)​​

​​启用条件​​:设备支持 Quota 且 appId 有效(FLAG_USE_QUOTA)。

​​操作流程​​:

通过 collectQuotaStats 直接读取文件系统配额信息,避免遍历目录,提升性能。

仅需校验 codePaths 的 GID 归属(如 multiuser_get_shared_gid),确保代码路径权限正确。

  1. ​​手动遍历模式(兼容性计算)​​

​​触发条件​​:设备不支持 Quota 或调试模式。

​​关键操作​​:

​​代码路径​​:遍历 codePaths 计算 stats.codeSize(如 APK 文件)。

​​数据目录​​:通过 collectManualStats 累加 CE/DE 路径大小到 stats.dataSize。

​​Profiles 文件​​:如 /data/misc/profiles/cur/[userId]/[package],计入 stats.dataSize。

​​Dalvik 缓存​​:路径为 /data/dalvik-cache,根据 GID 归属累加到 stats.codeSize。

四、结果汇总与返回

最终将 stats 和 extStats 的六项数据按顺序存入 _aidl_return,供上层(如 StorageStatsManager)解析为应用存储详情。核心统计项包括:

复制代码
ret.push_back(stats.codeSize);        // 内部代码大小
ret.push_back(stats.dataSize);        // 内部数据大小
ret.push_back(stats.cacheSize);       // 内部缓存大小
ret.push_back(extStats.codeSize);     // 外部代码大小(如 OBB)
ret.push_back(extStats.dataSize);     // 外部数据大小(如媒体文件)
ret.push_back(extStats.cacheSize);    // 外部缓存大小

五、性能优化与调试

​​1. ATrace 标记​​

通过 ATRACE_BEGIN/END 分段统计各模块耗时,便于性能分析。

​2. ​MEASURE_DEBUG 模式​​

在调试版本中输出详细日志(如 LOG(DEBUG) << "Final result"),帮助定位计算异常。

附:路径生成函数说明

代码中使用的 create_data_*_path 系列函数(如 create_data_media_package_path)定义于 utils.cpp,用于动态构建符合 Android 存储规范的路径。例如:

  • 外部数据路径:/data/media/[userId]/Android/data/[package]
  • OBB 路径:/data/media/[userId]/obb/[package]
    这些路径的构造直接影响统计结果的准确性,需与系统存储策略严格对齐。
相关推荐
阿巴斯甜17 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker17 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952718 小时前
Andorid Google 登录接入文档
android
黄林晴19 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android