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]
    这些路径的构造直接影响统计结果的准确性,需与系统存储策略严格对齐。
相关推荐
小天源2 小时前
银河麒麟 V10(x86_64)离线安装 MySQL 8.0
android·mysql·adb·麒麟v10
2501_915921432 小时前
傻瓜式 HTTPS 抓包,简单抓取iOS设备数据
android·网络协议·ios·小程序·https·uni-app·iphone
csj503 小时前
安卓基础之《(20)—高级控件(2)列表类视图》
android
JMchen1233 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
恋猫de小郭5 小时前
Flutter 在 Android 出现随机字体裁剪?其实是图层合并时的边界计算问题
android·flutter·ios
2501_915918415 小时前
把 iOS 性能监控融入日常开发与测试流程的做法
android·ios·小程序·https·uni-app·iphone·webview
benjiangliu6 小时前
LINUX系统-09-程序地址空间
android·java·linux
独自破碎E7 小时前
字符串相乘
android·java·jvm
DokiDoki之父7 小时前
边写软件边学kotlin(一):Kotlin语法初认识:
android·开发语言·kotlin
REDcker7 小时前
Telegram Android 源码解析完整文档
android