`

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>

 

分享到:
评论

相关推荐

    获取Android应用专属缓存存储目录的实例

    如果你想摆脱缓存目录使用的尴尬:找不到目录?忘记申请读写权限?害怕污染用户存储空间?……请往下看 SD卡缓存目录 当应用需要将图片或者文件缓存到SD...// /storage/emulated/0/Android/data/app_package_name/cach

    用于填充android分区的shell脚本

    用于填充android空间的脚本,效率很高,可以达到存储写入的理论值,emmc填充速度都可以达到240MB/S,确认是大M。 用法: adb push fillbigfile.sh /data/local/tmp adb shell sh /data/local/tmp/fillbigfile.sh /...

    Android实现文件的保存与读取功能示例

    方法可以获得当前的手机自带的存储空间中的当前包文件的路径 getFileDir() —– /data/data/cn.xxx.xxx(当前包)/files getCacheDir() —– /data/data/cn.xxx.xxx(当前包)/cache 1. 编写文件读取与写入功能实现类...

    基于 Android Data Binding 完成的 MVVM 模式的 Android 应用示例.zip

    可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板...

    Android创建和使用数据库详细指南.doc

    在Android中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data//databases文件夹中,在这篇文章中,你将会学习到如何在Android中创建和使用数据库。...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android获取应用程序大小的方法

    后来想直接计算/data/app和/system/app里面的apk大小,可是有时候会碰到权限问题,需要root才可以获取大小。 再后来,我想起系统的设置里面有一个应用程序管理,它里面列出了所有程序的占用空间大小、数据大小和...

    Gentoo for Unrooted and Rooted Android:Gentoo for All Android ARM,基于 EPREFIX-开源

    也适用于有根的 Android 手机。 它处于测试阶段,因此仅当 (1) 您了解将存在错误 (2) 您准备报告完整错误报告时才使用(理想情况下,使用 bin/script 或 GooglePlay 的“终端 IDE”捕获完整的 shell 会话) , 文本...

    android 开发 文件读写应用案例分析

    一、基本概念 在Android应用中保存文件,保存的位置有两处 ①手机自带的存储空间,较小(如200M),适合保存一些小文件,Android中保存位置在data/data/应用包名/files目录 ②外存储设备如SD卡,较大,适合保存大文件...

    SmartQV3超精简rom开机剩余直逼100M

    SmartQV3超精简rom开机剩余直逼100...这下可以放心删除ndda里面的data(官方程序问题,没链接data/data),同时/app.bak的要么删除要么移动到/ndda/data吧 另外一个d~~~.bak文件夹删掉。 温馨提示,本rom不提供蓝牙服务

    Android 8.0 读取内部和外部存储以及外置SDcard的方法

    一般的Android App能读取的存储空间主要有三种: app自己的私有目录,也就是/data/data/《app 目录》。 读写这个目录不需要单独的权限。每个app只能读写自己的目录,而不能读写其他app的目录。 Android通过Seandroid...

    data2whatever-把你的ANDROID软件安装到SD卡上

    假如你用ANDROID手机,软件一般是安装在手机上,随着你安装软件增多,手机空间越来越少,怎么办?DATA2SD,最新技术出现了。

    Android-存储路径与管理应用文件存储方法汇总

     Android手机存储分为两个部分:内部存储和外部存储,内部存储一般是手机自带的存储空间,外部存储指外插SD卡提供的存储空间;随着手机发展,这两个存储的定义又有了一些些变化,新的手机不再有外插SD卡的概念,...

    初学android用的一些源码

    主要是一些android基础代码,第一次学android,由于其他原因需要暂时放一下android,所以...主要是用于访问android中的文件空间使用情况和所有应用程序占用的空间大小(code、data、cache),listview的简单绑定使用。

    安卓手机内存扩展

    一款能让 android 1.6系统的用户将应用程序移动到的SD卡上,需要 root 权限支持,其实就是 Link2SD 挂载的 ext2 为/ data/sdext2 你的SD卡分区,使系统在开机时挂载它,实现移动程序功能! 功能特点: ■创建和删除...

    程序移动到SD卡3.7.2

    Link2SD是一款能让android 1.6系统以上的用户将应用程序移动到的SD卡上,需要root权限支持,其实就是Link2SD挂载的ext2为/data/sdext2你的SD卡分区,使android系统在开机时挂载它,实现移动程序功能!是款不错的小...

    无线手机内存 --》Link2SD

    Link2SD是一款能让android 1.6系统的用户将应用程序移动到的SD卡上,需要root权限支持,其实就是Link2SD挂载的ext2为/ data/sdext2你的SD卡分区,使android系统在开机时挂载它,实现移动程序功能!最新版本,分享给G...

Global site tag (gtag.js) - Google Analytics