Android进阶之路——Flurry的使用

简介

  Flurry是一家专门为移动应用提供数据统计和分析的公司。他们的数据统计分析SDK支持的平台包括iPhone, iPad, Android, Windows Phone, Java ME和BlackBerry。使用Flurry服务的公司包括eBay、Yahoo、Hulu和Skype等超过11万家公司,涉及的应用超过54万个,目前有17万名开发者使用名为“Flurry-Analytics”的分析工具。Flurry每个月监控着全球14亿个设备上的移动应用使用情况。在每一个智能设备上,Flurry平均可以获取七个应用的数据。
  利用Flurry提供的分析平台,我们可以很容易地自动统计出应用的使用情况,例如:
- 每天(每周或每月)登录用户数,应用使用次数
- 每天(每周或每月)新用户数,活跃用户数
- 用户的所在地、年龄、性别的分布情况

  Flurry也可以自动统计出移动设备的分类情况,例如:
- 使用3G,Wifi的会话比例
- 使用Android系统各版本(例如android 4.4, android 5.0等)的比例
- 使用Android各种设备(例如华为, 三星,小米等)的比例

  除了上面介绍的自动统计项目,Flurry SDK也提供了统计用的相关API,便于我们针对自己产品的特点,做针对性的统计。例如统计应用中某个按钮的按下次数,或者网络请求的平均响应时间等。

Flurry的注册

  在使用Flurry之前需要登录到Flurry进行注册。
  Android进阶之路——Flurry的使用_第1张图片
  然后登录到Flurry后台,依次选择 “Applications” -> “Add a New Application” ,增加一个需要统计分析的应用。
  这里写图片描述
  然后,在接下来的界面之后根据你的应用类型,Android或者IOS。在这里我选择的是Android版本。
  Android进阶之路——Flurry的使用_第2张图片
  接着,填入应用的名字和分类(名字仅用作在Flurry后台和自己的其它应用区分,不需要和应用的真实名字相同),之后点击”Create App”,如下所示:
  Android进阶之路——Flurry的使用_第3张图片
  到此,我们就成功在后台创建了一个新的应用系统和分析项目。点击下图中的”Download”,就可以下载需要继承在应用中的SDK。而下图中的提示2中的Key:SQFTCCWCCP6YVSKCQY6W则是我们在集成时用于标识自己应用的ID。
  Android进阶之路——Flurry的使用_第4张图片

集成SDK

  我们将下载后的SDK解压,可以看到文件列表如下。列表中对我们最重要的文件是Flurry目录下的FlurryAnalytics-6.2.0.jar文件。这个文件需要复制到android studio的工程中去。
  FlurryAndroidAnalyticsReadmev6.2.0.pdf这个文件中是官方的英文文档。
  ProjectApiKey.txt文件中记录了我们之前创建的应用ID,在在代码中调用SDK初使化时需要使用。
  Android进阶之路——Flurry的使用_第5张图片
  接着我们打开Android studio工程,将之前下载解压的Flurry目录拖动添加到工程的libs中,同时在工程的build.gradle文件中的dependencies代码块中加上 compile fileTree(dir: ‘libs’, include: ‘*.jar’),除此之外还需要添加谷歌服务,才能使用Flurry,如下图所示:
  Android进阶之路——Flurry的使用_第6张图片
  最后,你需要在AndroidManifest.xml中添加3个权限

    
    <uses-permission android:name="android.permission.INTERNET" />
    
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Flurry代码的使用

  首先,在MyApplication的中调用FlurryAgent.init(Context, String),初始化Flurry。
  

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 是否打印本地的Flurry Log
        FlurryAgent.setLogEnabled(true);
        // 打印Log的级别
        FlurryAgent.setLogLevel(Log.ERROR);
        FlurryAgent.init(this, Global.FLURRY_APP_KEY);
    }
}

  把Flurry的使用封装到一个自定义类中,使用起来方便。
  

public class FlurryUtil {

    public static  void onStartSession(Context context) {
        if (Global.ENABLE) {
            try {
                FlurryAgent.setLogEvents(true);
                FlurryAgent.onStartSession(context);
            } catch (Throwable t) {
            }
        }
    }

    public static  void onEndSession(Context context) {
        if (Global.ENABLE) {
            try {
                FlurryAgent.onEndSession(context);
            } catch (Throwable t) {
            }
        }
    }

    public static  void onEvent(String eventId) {
        if (Global.ENABLE) {
            try {
                Map params = new HashMap();
                FlurryAgent.onEvent(eventId, params);
            } catch (Throwable t) {
            }
        }
    }


    public static  void onEventUseMap(String eventId, Map map) {
        if (Global.ENABLE) {
            try {
                FlurryAgent.onEvent(eventId, map);
            } catch (Throwable t) {
            }
        }
    }


    public static  void onEvent(String eventId, String paramValue) {
        if (Global.ENABLE) {
            try {
                HashMap params = new HashMap();
                params.put(eventId, paramValue);
                FlurryAgent.onEvent(eventId, params);
            } catch (Throwable t) {
            }
        }
    }

    public static  void onEvent(String eventId, String paramKey, String paramValue) {
        if (Global.ENABLE) {
            long currentTime = SystemClock.elapsedRealtime();
            try {
                Map params = new HashMap();
                params.put(paramKey, paramValue);
                FlurryAgent.onEvent(eventId, params);
            } catch (Throwable t) {
            }
        }
    }

}

  特别的,如果需要检测具体事件的响应时间(比如某个按钮事件),需要注意logEvent (String eventId, boolean timed),将timed参数设为true就可以记录这个event的开始执行时间,然后在你的代码中你认为事件完成的地方再调用endTimedEvent (String eventId)。这样会记录事件的整个执行时间。不过需要注意,经过我到目前的研究,不管是通过查看Analytics的分析页面,还是通过API直接获取数据。都得不到单个事件每一次执行的时间。只能得到平均(average),总体(total)。就是你这个事件执行了N次,它算N次的平均执行时间和N次相加的全部执行时间。

查看统计结果

  完成上面的自定义统计的代码并运行程序后,我们就可以从后台的Events栏中看到相应的统计结果了。
  Android进阶之路——Flurry的使用_第7张图片

Flurry的优点和缺点

和著名的统计工具Google Analytics相比,Flurry的优点是:

  • Flurry专门针对移动端做了许多优化。
  • Flurry没有被墙的问题。

Flurry缺点是:

  • Google Analytics的统计功能相对更强大一些。
  • Google Analytics可以和网页版的统计数据做整合。

和国内的分析平台友盟相比,Flurry的优点是:

  • 使用Flurry的应用相对更多。根据Flurry和友盟的官方数据,有超过54万应用使用Flurry ,有超过18万应用使用友盟。
  • Flurry是国外的公司,保持独立和专注,数据安全性更高;友盟现在已经被阿里收购,当用户的应用涉及领域和阿里有类似或重合的时候,那么该统计数据有潜在的安全性问题。

Flurry的缺点是:

  • 友盟因为是中国公司,所以对国内开发者非常友善,相关的文档或界面都是中文的。而Flurry并不提供中文的后台管理界面或相关文档。
  • Flurry的服务器在国外,在响应速度上应该相对比友盟慢一些。但在测试中,Flurry服务器都保证了500ms左右的响应时间,还是比较好的。

Demo下载

你可能感兴趣的:(Android)