`

Android /data空间小

 
阅读更多

在手机安装应用时,系统会自动在/data/data目录下面以应用的主包名创建一个目录,默认还会在最后的那个目录里面创建一个lib目录。下面看一下系统获取存储空间的代码:

 

来自android2.3.3系统源代码/packages/apps/Settings/src/com/android/settings/applications/ManageApplications.java

 

 

531.mDataFileStats = new StatFs("/data"); 

532.mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString()); 

 

<pre name="code" class="java">748.mDataFileStats.restat("/data"); 

            try { 

                totalStorage = (long)mDataFileStats.getBlockCount() * 

                        mDataFileStats.getBlockSize(); 

                freeStorage = (long) mDataFileStats.getAvailableBlocks() * 

                    mDataFileStats.getBlockSize(); 

            } catch (IllegalArgumentException e) { 

            } 

            final int N = mApplicationsAdapter.getCount(); 

            for (int i=0; i<N; i++) { 

                ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i); 

                appStorage += ae.codeSize + ae.dataSize; 

            } 

            freeStorage += mApplicationsState.sumCacheSizes();<pre name="code" class="java"><pre> 

 

734.mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString()); 

try { 

    totalStorage = (long)mSDCardFileStats.getBlockCount() * mSDCardFileStats.getBlockSize(); 

    freeStorage = (long) mSDCardFileStats.getAvailableBlocks() * mSDCardFileStats.getBlockSize(); 

} catch (IllegalArgumentException e) { 

    // use the old value of mFreeMem 

}

 

第531行代码是/data目录下面的空间,第532行是检查SD卡的空间。

 

“存储空间不足”data过小的通知分析DeviceStorageMonitorService类

位置

DeviceStorageMonitorService.java (frameworks\base\services\java\com\android\server\)

一. 三个关键变量:

private static final int DEFAULT_THRESHOLD_PERCENTAGE = 10;
private static final int DEFAULT_FULL_THRESHOLD_BYTES = 1*1024*1024; // 1MB
private static final long DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD = 2 * 1024 * 1024; // 2MB

二. 参数调用的地方
在整个android目录中, 三个常量被调用的地方, 都只是在DeviceStorageMonitorService.java中

DEFAULT_THRESHOLD_PERCENTAGE(10) : private long getMemThreshold();
return 1300234 * 10 = 13,002,340

DEFAULT_FULL_THRESHOLD_BYTES(10M) : private int getMemFullThreshold()
return 10,485,760

DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD(5M=5,242,880) : private final void restatDataDir();
threshold = 5,242,880 delta = mFreeMem = 101,482,696

三. 函数被调用的地方
DeviceStorageMonitorService构造中

private long mMemLowThreshold = getMemThreshold();

四. DeviceStorageMonitorService的调用追踪

private final void checkMemory(boolean checkCache) -> 判断() ->
private final void sendNotification()

在sendNotification()中将剩余内存的值存入intent中, 然后广播出去, 广播类型为ACTION_MANAGE_PACKAGE_STORAGE
此通知的标题为 “存储空间不足(Low on space)”
通知的内容为 “手机内存空间所剩不多了(Phone storage space is getting low)”

五. DEFAULT_FULL_THRESHOLD_BYTES的调用追踪

private final void checkMemory(boolean checkCache) -> 判断() ->
private final void sendFullNotification() ->
sendStickyBroadcast(intent.ACTION_DEVICE_STORAGE_FULL)

若data目录小于DEFAULT_FULL_THRESHOLD_BYTES, 则不在接收短信.

六. DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD 调用追踪

private final void checkMemory(boolean checkCache) ->
EventLog.writeEvent(EventLogTags.FREE_STORAGE_CHANGED, mFreeMem)

经过jwisp烧录到真机上发现, 真正有可能有用的是百分比报警, 那只需要设置下面这个参数即可:
DEFAULT_THRESHOLD_PERCENTAGE

转载自 <a href="http://www.jwisp.com/?p=97" title="“存储空间不足”data过小的通知分析DeviceStorageMonitorService类" rel="bookmark">“存储空间不足”data过小的通知分析DeviceStorageMonitorService类 | 卓派</a>

 

分享到:
评论

相关推荐

    _storage_emulated_0_android_data_com.tencent.mm_MicroMsg_Download_FRM.Support0423_2510(Frame.2023).zip

    首先,我们可以看到路径"_storage_emulated_0_",这通常代表Android设备上的内部存储空间,模拟的SD卡(SD卡被系统映射到内部存储的一个部分)。"android_data"目录是Android应用程序数据存储的地方,而...

    _storage_emulated_0_android_data_com.tencent.mobileqq_Tencent_QQfile_recv_实训四.zip

    - `_storage_emulated_0_`:这部分表示的是Android设备的内部存储空间,通常在Android系统中,`storage/emulated/0` 对应于手机的主用户可访问的外部存储(即SD卡模拟的内部存储)。 2. **应用程序数据**: - `_...

    文件存储数据

    文件存储是一种简单且常用的数据保存方法,尤其适用于需要持久化小量数据或非结构化数据的情况。本文将深入探讨Android中的文件存储数据,包括基本概念、存储路径、文件操作以及最佳实践。 ### 文件存储的基本概念 ...

    获取安装后的app所占空间大小

    在Android系统中,获取安装后的应用(APP)所占的空间大小是开发者或用户可能需要进行的一项常见操作。这包括了APK文件自身的大小、应用程序在运行时生成的缓存文件以及存储的数据。了解这些信息有助于优化应用性能...

    Android数据存储之--SDCard

    在Android系统中,数据存储是应用开发的重要环节,而SDCard(Secure Digital Card)作为外部存储,为应用程序提供了大量存储空间。本节我们将深入探讨Android如何利用SDCard进行数据存储,以及相关的源代码分析。 ...

    arm9 io driver source 2

    用户空间驱动允许应用程序直接与硬件交互,而内核空间驱动则在操作系统内核中运行,提供更高级别的抽象和管理。对于1302这样的RTC设备,一般会实现内核空间驱动,因为它需要与系统时钟管理紧密协作。 1302驱动的源...

    获取SD卡路径及手机存储路径

    Android设备通常有两种类型的存储空间:内部存储(Internal Storage)和外部存储(External Storage),通常所说的SD卡就是外部存储的一部分。在Android 6.0(API级别23)之后,对存储访问有了更严格的权限管理,...

    Android视频缓存

    4. **缓存管理**:为了防止缓存空间过大,需要定期清理无用的缓存文件,这可以通过实现自定义的缓存策略来实现,比如基于文件大小、访问时间等因素。 5. **检测并使用缓存**:在播放视频时,先检查本地是否存在对应...

    sdcard文件读写案例-ES文件浏览器

    在Android系统中,SD卡(通常称为外部存储)是用于扩展设备存储空间的重要部分,而文件的读写操作是应用程序日常功能的一部分。本案例聚焦于使用ES文件浏览器进行SD卡文件的操作,它是一款流行的Android文件管理应用...

    android data storage.docx

    Android为每个应用提供了私有文件存储空间,位于`/data/data/Package Name/files`目录。如果需要在SD卡上存储文件,需要额外的权限检查和路径处理。文件存储不适合跨应用共享数据。 示例代码: ```java ...

    Android程序的缓存大小计算

    了解如何计算Android程序的缓存大小是优化应用性能、管理存储空间和提升用户体验的重要方面。以下将详细解释Android程序缓存的原理、计算方法以及相关知识点。 1. **缓存的基本概念** - 缓存是计算机科学中的一个...

    Android中获取应用程序(包)的大小-----PackageManager的使用(二)

    在Android系统中,开发者往往需要了解自己或者用户安装的应用程序所占用的存储空间,以便进行优化或者提供相关信息。本文将详细讲解如何通过Android的`PackageManager`服务来获取应用程序的大小,以及背后的实现原理...

    Android 文件管理 源码

    - Android/data/&lt;package_name&gt;/:应用私有的外部存储空间,可持久存储用户数据。 - Android/obb/&lt;package_name&gt;/:用于存放大型游戏或应用的扩展文件。 - DCIM/:相机拍摄的照片和视频通常存放于此。 - ...

    android手机内存分配小结

    总结来说,Android手机内存的分配涉及到硬件接口、内核、用户空间等多个层次,理解这些内存区域的划分和使用对于开发和调试Android应用程序、优化系统性能具有重要意义。同时,掌握查看和分析内存使用状态的工具和...

    手机SD存储卡文件浏览 Android 源程序

    主要的外部存储空间分为内部存储和外部存储(即SD卡)。内部存储通常用于存储应用的数据和私有文件,而外部存储则供用户存放多媒体文件、文档等公共数据。 2. **文件浏览器的基本结构** 文件浏览应用的核心在于...

    AndroidWIFI架构和控制流程.pdf

    Android WIFI 架构和控制流程 Android WIFI 架构和控制流程是一个复杂的系统,涉及到多个组件和模块。本文将从 WIFI 的基本架构、WIFI 在 Android 中如何工作、配置 Android 支持 WIFI、使能 wpa_supplicant 调试...

    android Qzone qq空间 分享

    在Android开发中,QQ空间(Qzone)分享是常见的社交功能之一,允许用户将应用程序内的内容,如文本、图片、链接等,分享到他们的QQ空间动态。本教程将深入讲解如何在Android应用中实现QQ空间的分享功能。 首先,...

    Android平台ROM的定制及精简介绍

    通过对Android系统ROM的定制及精简,我们可以有效地提高设备的性能并节省存储空间。这一过程不仅需要对系统文件结构有深入的理解,还需要具备一定的技术背景,才能安全有效地完成。希望本文能够帮助读者更好地掌握这...

    gdal各个版本库,包括win64/win32/linux/android32/android等

    GDAL(Geospatial Data Abstraction Library)是一个开源的地理空间数据处理库,它支持多种地理空间文件格式的读取、写入和转换操作。这个压缩包包含了GDAL的不同版本库,适用于不同的操作系统平台,包括Windows...

Global site tag (gtag.js) - Google Analytics