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]
    这些路径的构造直接影响统计结果的准确性,需与系统存储策略严格对齐。
相关推荐
robotx3 小时前
安卓线程相关
android
消失的旧时光-19433 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon4 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon4 小时前
VSYNC 信号完整流程2
android
dalancon4 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013845 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android6 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才6 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶7 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle
汪海游龙7 小时前
开源项目 Trending AI 招募 Google Play 内测人员(12 名)
android·github