多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
DiskStatsService代码非常简单,不过也有一个很有意思的地方,例如: DiskStatsService.java ~~~ public class DiskStatsService extends Binder ~~~ DiskStatsService从Binder派生,却没有实现任何接口,也就是说,DiskStatsService没有任何业务函数可供调用。为什么系统会存在这样的服务呢? 为了解释这个问题,有必要先把系统中一个很重要的命令dumpsys请出来。正如其名,这个命令用于打印系统中指定服务的信息,代码如下: **dumpsys.cpp** ~~~ 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])); } } constsize_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); ...... } return0; } ~~~ 从上面代码可知,dumpsys通过Binder调用某个Service的dump函数。那么 “dumpsys diskstats”的输出会是什么呢?马上来试试,结果如图3-3所示。 :-: ![](http://img.blog.csdn.net/20150803104544553?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图3-3 dumpsys diskstats的结果图示 图3-3说明了执行“dumpsysdiskstats”打印了系统中内部存储设备的使用情况。dumpsys是工作中常用的命令,建议读者掌握它的用法。 再来看DiskStatsService的dump函数,代码如下: **DiskStatsService.java** ~~~ protected void dump(FileDescriptor fd, PrintWriterpw, String[] args) { byte[] junk = new byte[512]; for(int i = 0; i < junk.length; i++) junk[i] = (byte) i; //输出/data/system/perftest.tmp文件信息,输出后即删除该文件 //目前还不清楚这个文件由谁生成。从名字上看应该和性能测试有关 Filetmp = new File(Environment.getDataDirectory(), "system/perftest.tmp"); FileOutputStream fos = null; IOException error = null; longbefore = SystemClock.uptimeMillis(); try{ fos = new FileOutputStream(tmp); fos.write(junk); } ...... longafter = 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的功能完全可以被整合到后面即将介绍的DeviceStorageManagerService类中。总之,本节最重要的就是dumpsys这个命令了,建议读者一定要掌握它的用法。