多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
下面给来分析SamplingProfilerService的构造函数,其代码如下: **SamplingProfilerService.java** ~~~ public SamplingProfilerService(Context context) { //注册一个CotentObserver,用于监测Settings数据库的变化 registerSettingObserver(context); startWorking(context);//① startWorking函数,见下文的分析 } ~~~ 先来分析上边的关键点startWorking函数,代码如下: **SamplingProfilerService.java** ~~~ private void startWorking(Context context) { finalDropBoxManager 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输出的,要使用该类,就只能利用源码进行编译。)