Android进阶之路,


仅代表当前个人使用友盟统计成功后的笔记归纳,具体集成方式与解决方法,请根据Umeng文档逐步校验 !

注:此文起始写于2018年,但于2019春节后进行88个埋点之后,发现部分地方存在可改进之处,故此再次进行优化

目录

  • Umeng友情帮助链接
  • 基础配置
  • 多渠道区分 - 统计
  • 埋点统计(后台设置、移动端代码注册)
  • 集成测试(测试设备(查看 、添加)、实时日志、历史日志)
  • 错误锦集

Umeng官方渠道 :

2018年
//Umeng Android Sdk 
地址 :http://mobile.umeng.com/custom_sdk

//Umeng Android Sdk 7.4.1集成过程 外部配置
地址 :http://dev.umeng.com/sdk_integate/android_sdk/android_common_guide

//Umeng Android Sdk 7.4.1集成过程 APP统计内部配置
地址 :http://dev.umeng.com/sdk_integate/android_sdk/analytics_doc

2019年
//Umeng Sdk 下载
https://developer.umeng.com/sdk?spm=a311a.9588098.0.0

//Umeng  U-App>基础分析>功能使用
https://developer.umeng.com/docs/67953/detail/68131#h1-u81EAu5B9Au4E49u4E8Bu4EF62

//FAQ  Umeng官方提供的集成中可能遇到的错误问题(包含解答)
https://developer.umeng.com/docs/66632/cate/66650

//集成测试 - 测试设备
https://mobile.umeng.com/platform/integration/device

基础配置

1.build (app)

  /**
	*友盟统计 版本号根据友盟官网当时给出版本进行设置
	*/
    compile 'com.umeng.sdk:common:1.4.1'
    compile 'com.umeng.sdk:analytics:7.4.1'

2.Android Manifest (加入配置)

  • 加入权限
<!-- 必须的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<!-- 推荐的权限 -->
<!-- 添加如下权限,以便使用更多的第三方SDK和更精准的统计数据 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 清单文件下的application内部添加配置参数
//这里可以在清单文件配置,也可以动态的在我们自己的application代码中进行初始化
 <meta-data android:value="YOUR_APP_KEY" android:name="自己Umeng平台的appkey"/>
 //这个官方说是兼容老版本,同时渠道统计会用到这个,不要修改内部值
 <meta-data android:name="UMENG_CHANNEL" android:value="Channel ID"/>

我自己项目中的配置(下面有多渠道区分 - 统计)

步骤1:Android Manifests

<application
        android:name=".base.GarageApp"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
      
 //主要是这里的代码  - 用于渠道统计
 <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}"/>
</application>

步骤2:build.gradle (app)

android {
   productFlavors {
        baidu {}
        huawei {}
        xiaomi {}
        vivo {}
        oppo {}
        sanxing {}
        yingyongbao {}
    }

    //分别进行打包
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

3.Application(OnCreate 生命周期内加入Umeng初始化方法)

	/**这里要注意:如果在清单文件已经配置了初始化信息,
	 *这里可以少去初始化的代码,如果俩边都配置了
	 *那么会优先代码中的配置!!!所以这里大家务必注意!*/
	
        //初始化 
        UMConfigure.init(garageApp,"自己Umeng平台的appkey","Umeng",UMConfigure.DEVICE_TYPE_PHONE,"");
        //开启Log
        UMConfigure.setLogEnabled(true);
        //打开调试模式
        MobclickAgent.setDebugMode( true );
        
        /**
        *普通统计场景类型:EScenarioType.E_UM_NORMAL 
		*游戏场景类型:EScenarioType.E_UM_GAME 
		*/设置统计场景类型  
        MobclickAgent.setScenarioType(garageApp, MobclickAgent.EScenarioType.E_UM_NORMAL);
        
        //true打开 ,false为关闭 
        //禁止默认的页面统计方式  (一般不用设置,因为默认是进行统计的)
		//MobclickAgent.openActivityDurationTrack(true);
		//错误收集(默认已经配置,而且已经打开)
		//MobclickAgent.setCatchUncaughtExceptions(true);
		

多渠道区分 - 统计(如用户下载的市场是华为、小米、oppo之类的(渠道包与渠道统计相对应))

  • AndroidMainfest(清单文件)中的application内添加
 //这里是方便Umeng的渠道统计,进行配置 UMENG_CHANNEL 不可改变不然无法识别
  <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />
  • build(app)中,android内添加渠道名,这里要注意的是 如果是数字开头是不行的!需要添加下划线!这是俩种方式,可以使用uc的方式添加渠道,也可以使用现在的不直接声明的模式。个人介意第一种样式!

第一种方式:

productFlavors{
        uc {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
        }
        _360 {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
        }
        baidu{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
    }

第二种方式:

 productFlavors{
        default_channel{}
        wandoujia{}
        yingyongbao{}
        xiaomi{}
        huawei{}
        jifeng{}
    }

  productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
    }

埋点统计

后台设置
  • 已有的自定义事件查看

  • 自定义事件添加流程

Step 1:
">

Step 2:
">

Step 3:
">

移动端代码注册

App内事件埋点 (对应的事件下进行设置)

  //eventId为已在后台注册自定义事件id
  MobclickAgent.onEvent(MainActivity.this,"eventId");

对应的Activity、Fragment内添加对应需求代码

时常统计(Session时长 - 集成埋点的同时会自动统计时长)

    public void onResume() {
        super.onResume();
        MobclickAgent.onResume(this);
    }
    
    public void onPause() {
        super.onPause();
        MobclickAgent.onPause(this);
    }

统计跳转页面

    public void onResume() {
        super.onResume();
        MobclickAgent.onPageStart("newOrderBtn");
    }
    
    public void onPause() {
        super.onPause();
        MobclickAgent.onPageEnd("newOrderBtn");
    }

集成测试 (使用环境 - 自我测试,绑定自己手机查看埋点效果)

测试设备
  • 测试设备 - 查看
  • 测试设备 - 添加测试设备
  • 设备识别信息获取的方法

老版本(sdk 7.4.1)

 /**
     * 测试
     * */
    public static String getDeviceInfo(Context context) {
        try {
            org.json.JSONObject json = new org.json.JSONObject();
            android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context
                    .getSystemService(Context.TELEPHONY_SERVICE);
            String device_id = null;
            if (checkPermission(context, Manifest.permission.READ_PHONE_STATE)) {
                device_id = tm.getDeviceId();
            }
            String mac = null;
            FileReader fstream = null;
            try {
                fstream = new FileReader("/sys/class/net/wlan0/address");
            } catch (FileNotFoundException e) {
                fstream = new FileReader("/sys/class/net/eth0/address");
            }
            BufferedReader in = null;
            if (fstream != null) {
                try {
                    in = new BufferedReader(fstream, 1024);
                    mac = in.readLine();
                } catch (IOException e) {
                } finally {
                    if (fstream != null) {
                        try {
                            fstream.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (in != null) {
                        try {
                            in.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            json.put("mac", mac);
            if (TextUtils.isEmpty(device_id)) {
                device_id = mac;
            }
            if (TextUtils.isEmpty(device_id)) {
                device_id = android.provider.Settings.Secure.getString(context.getContentResolver(),
                        android.provider.Settings.Secure.ANDROID_ID);
            }
            json.put("device_id", device_id);
            return json.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

新版本(2019年的组件化获取方式 统计sdk 7.0.0以上)

/**
  *此方法我在2019/2/21使用时, 数据返回格式与数据错误;
  *可通过断点获取deviceInfo[0]与deviceInfo[1] 的值进行拼接,组成设备识别信息
  * 样例 :{"device_id":"KVVVA17B24202090","mac":"1c:15:1f:74:0c:7c"}
  */
  
public static String[] getTestDeviceInfo(Context context){
    String[] deviceInfo = new String[2];
    try {
        if(context != null){
            deviceInfo[0] = DeviceConfig.getDeviceIdForGeneral(context);
            deviceInfo[1] = DeviceConfig.getMac(context);
        }
    } catch (Exception e){
    }
    return deviceInfo;
}
实时日志、历史日志

必须非常注意!!!

  • 只有测试设备绑定成功,才能收到日志信息
  • 数据收集策略有俩种,一种是时间间隔控制 ;一种是app关闭重新启动; 这也意味着只有满足其中一种情况后Umeng才能收到我们统计的数据
  • 测试设备的统计数据不算入自定义事件(防止污染数据)
  • 当我们操作完app关闭之后,重启app,然后在Umeng后台查看实时数据内的自定义事件,如下图 (此刻Android是支持的,IOS还没有支持)

大功告成(老夫退了)


错误锦集

埋点未生效

  • 检查后台是否注册此事件
  • 检查代码中是否注册此事件
  • 检查俩端自定义事件Id是否相同
  • Activity、Fragment是否重写onResume()、onPause()内的方法,如下 (友情建议下文代码封装到BaseActivity、BaseFragment)

activity 版本 - -~

    @Override
    public void onResume() {
        super.onResume();
            MobclickAgent.onResume(this);
    }

    @Override
    public void onPause() {
        super.onPause();
            MobclickAgent.onPause(this);
    }

fragment 版本 - -~

    @Override
    public void onResume() {
        super.onResume();
            MobclickAgent.onResume(getActivity());
    }

    @Override
    public void onPause() {
        super.onPause();
            MobclickAgent.onPause(getActivity());
    }

实时日志、历史日志(重复提出,烦请注意)

  • 只有测试设备绑定成功,才能收到日志信息
  • 数据收集策略有俩种,一种是时间间隔控制 ;一种是app关闭重新启动; 这也意味着只有满足其中一种情况后Umeng才能收到我们统计的数据
  • 测试设备的统计数据不算入自定义事件(防止污染数据)
  • 当我们操作完app关闭之后,重启app,然后在Umeng后台查看实时数据内的自定义事件,如下图 (此刻Android是支持的,IOS还没有支持)

埋点可能错误原因(由友盟客服和技术提出)

  • 自定义事件默认退出动发送,请按照这个顺序测试 :启动应用-触发自定义事件-应用退到后台-打印log日志,观察log是否有event字段,如果自定义事件集成正确是可以看到这个字段的
  • 发送策略问题,自定义事件数据默认退出发送
  • 确认自定义事件参数传入合法。可参阅 事件参数FAQ
  • 触发自定义事件后关闭应用超过30s后再重新启动应用,查看调试log中是否有ekv字段及相关事件ID。
  • 是否在后台定义了事件ID。
  • 自定义事件报表中“独立用户数”第二天展示前一天数据。
  • 是否使用了集成测试,集成测试数据要在集成测试日志中查看。
  • 网络延迟。
  • 不要在service中使用自定义事件,这会造成活跃用户异常
  • 打开debug模式则必须打包后才能有事件 亲 您可以按照这个顺序测试一下 :启动应用-触发自定义事件-关闭应用-40s后重新启动应用-打印log日志,观察log是否有ekv字段和相关事件ID,如果自定义事件集成无误是可以看到这个字段的。

借鉴文章 5分钟实现Android友盟统计的集成与使用

相关内容

    暂无相关文章