3.6 SamplingProfilerService分析

添加SamplingProfilerService服务的代码如下:


ServiceManager.addService("samplingprofiler",//服务名

new SamplingProfilerService(context));


3.6.1 SamplingProfilerService构造函数分析

下面分析SamplingProfilerService的构造函数,其实现代码如下:

[—>SamplingProfilerService.java:SamplingProfilerService]


public SamplingProfilerService(Context context){

//注册一个CotentObserver,用于监测Settings数据库的变化

registerSettingObserver(context);

startWorking(context);//①startWorking函数,见下文的分析

}


先来分析上边的关键点—startWorking函数,其实现代码如下:

[—>SamplingProfilerService.java:startWorking]


private void startWorking(Context context){

final DropBoxManager dropbox=//得到DropBoxManager对象

(DropBoxManager)

context.getSystemService(Context.DROPBOX_SERVICE);

//枚举/data/snapshots目录下的文件

File[]snapshotFiles=new File(SNAPSHOT_DIR).listFiles();

for(int i=0;snapshotFiles!=null&&i<snapshotFiles.length;

i++){

//将这些文件的内容转移到dropbox中,然后删除这个文件

handleSnapshotFile(snapshotFiles[i],dropbox);

}

//创建一个FileObserver对象监控shots目录,如果目录中来了新的文件,那么把它们转移到

dropbox中

snapshotObserver=new FileObserver(SNAPSHOT_DIR, FileObserver.ATTRIB){

@Override

public void onEvent(int event, String path){

handleSnapshotFile(new File(SNAPSHOT_DIR, path),dropbox);

}

};

//启动文件夹监控,采用了Linux平台的inotify机制,感兴趣的读者可以研究一下inotify

snapshotObserver.startWatching();

}


看完上边的代码,不知读者是否感到有些诧异。对此,开始时笔者有两个疑惑:

其一,难道SamplingProfilerService的功能就是将/data/snapshots目录下的文件转移到dropbox中吗?该服务似乎与性能采样及统计没有任何关系。

其二,SamplingProfilerService本身并不提供性能统计的功能,那么性能采样与统计文件由谁生成呢?

对于第二个问题笔者后来找到了答案,答案就是SamplingProfilerIntegration类,这个类封装了一个SamplingProfiler(由dalvik虚拟机提供)对象,并提供了方便利用的函数进行性能统计。(可惜这个类并不是由SDK输出的,要使用该类,就只能利用源码进行编译。)至于就第一个问题,读者如有什么想法,不妨与笔者讨论一下。