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-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这个命令了,读者一定要掌握它的用法。