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输出的,要使用该类,就只能利用源码进行编译。)至于就第一个问题,读者如有什么想法,不妨与笔者讨论一下。