3.5 DiskStatsService和DeviceStorageMonitorService分析

DiskStatsService、DeviceStroageMonitorService与系统内部存储管理、监控有关。

3.5.1 DiskStatsService分析

DiskStatsService代码非常简单,不过也有一个很有意思的地方,例如:

[—>DiskStatsService.java]


public class DiskStatsService extends Binder


DiskStatsService从Binder派生,却没有实现任何接口,也就是说,DiskStatsService没有任何业务函数可供调用。为什么系统会存在这样的服务呢?

为了解释这个问题,有必要先介绍系统中一个很重要的命令—dumpsys。正如其名,这个命令用于打印系统中指定服务的信息,其实现代码如下:


[—>dumpsys.cpp:main]

int main(int argc, char*const argv[])

{

//先获取与ServiceManager进程通信的BpServiceManager对象

sp<IServiceManager>sm=defaultServiceManager();

fflush(stdout);

Vector<String16>services;

Vector<String16>args;

if(argc==1){//如果输入参数个数为1,则先查询在SM中注册的所有Service

services=sm->listServices();

//将Service排序

services.sort(sort_func);

args.add(String16("-a"));

}else{

//指定查询某个Service

services.add(String16(argv[1]));

//保存剩余参数,以后可以传给Service的dump函数

for(int i=2;i<argc;i++){

args.add(String16(argv[i]));

}

}

const size_t N=services.size();

……

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

sp<IBinder>service=sm->checkService(services[i]);

……

//通过Binder调用该Service的dump函数,将args也传给dump函数

int err=service->dump(STDOUT_FILENO, args);

……

}

return 0;

}


从上面代码可知,dumpsys通过Binder调用某个Service的dump函数。那么“dumpsys diskstats”的输出会是什么呢?马上来试试,结果如图3-3所示。

3.5 DiskStatsService和DeviceStorageMonitorService分析 - 图1

图 3-3 dumpsys diskstats的结果图示

图3-3说明了执行“dumpsys diskstats”打印了系统中内部存储设备的使用情况。dumpsys是工作中常用的命令,建议读者掌握它的用法。

再来看DiskStatsService的dump函数,其实现代码如下:


[—>DiskStatsService.java:dump]

protected void dump(FileDescriptor fd, PrintWriter pw, String[]args){

byte[]junk=new byte[512];

for(int i=0;i<junk.length;i++)junk[i]=(byte)i;

//输出/data/system/perftest.tmp文件信息,输出后即删除该文件

//目前还不清楚这个文件由谁生成。从名字上看应该和性能测试有关

File tmp=new File(Environment.getDataDirectory(),

"system/perftest.tmp");

FileOutputStream fos=null;

IOException error=null;

long before=SystemClock.uptimeMillis();

try{

fos=new FileOutputStream(tmp);

fos.write(junk);

}……

long after=SystemClock.uptimeMillis();

if(tmp.exists())tmp.delete();

if(error!=null){

……

}else{

pw.print("Latency:");

pw.print(after-before);

pw.println("ms[512B Data Write]");

}

//打印内部存储设备各个分区的信息

reportFreeSpace(Environment.getDataDirectory(),"Data",pw);

reportFreeSpace(Environment.getDownloadCacheDirectory(),"Cache",pw);

reportFreeSpace(new File("/system"),"System",pw);

//有些厂商还会将/proc/yaffs信息打印出来

}


从前述代码中可发现,DiskStatsService没有实现任何业务接口,似乎只是为了调试而存在。所以笔者认为,DiskStatsService的功能完全可以被整合到后面即将介绍的Device-StorageManagerService类中。总之,本节最重要的就是dumpsys这个命令了,读者一定要掌握它的用法。