在Android设备上使用极光推送id重复的原因分析和解决办法

引言

在使用极光推送时,用于区分推送设备最重要的就是RegistrationID,如果出现相同的ID推送就会出问题

原因分析

RegistrationID是由设备的IMEI 、 serial_number 、deviceID三个参数决定的,出现相同的RegistrationID首先应该检查这三个参数是否为空,或出现值相同的情况。
后台存储 uid 的方式是根据 appkey_dvcid->uid ,appkey_imei_mac->uid, appkey_serial->uid 这三种存储方式,左边的这三种key只要检测到一个匹配,就会把存的 uid 返回给前端
如果 IMEI一样,当取到的serial_number 或 mac 地址又为空,那就有可能很多设备拿到相同 RegistrationID 值

解决办法

方法一: 重烧 IMEI ,刷机或者进行如下步骤:

  • 步骤一:把这个文件清掉:Environment.getExternalStorageDirectory().getPath() + “/data/.push_deviceid”;
  • 步骤二:同步清除掉 setting 里面的,方法如下:Settings.System.putString(context.getContentResolver(), “devcie_id_generated”, “”);
  • 步骤三:还有把缓存也清理下;
  • 然后再重装 App。
    ◦上述操作是系统方法,如果操作未果,则说明你使用的是自己的定制设备,导出你的数据库信息查看一下 device ID 信息,不要将该信息固定为同一个值。

方法二: 源码中修改或设置serial_number 的取值
文件位置:/system/core/init/init.cpp
这里以我遇到的问题为例(极光取到的serial_number 为空导致概率出现RegistrationID相同的情况)
系统会使用ro.serialno的值作为序列号(SN号),若能使每台设备的ro.serialno值唯一可以解决这个问题,由于我们每台设备都会烧录购买的独立mac号,这里举例将mac的值作为ro.serialno的值。

static void export_kernel_boot_props() {
    struct {
        const char *src_prop;
        const char *dst_prop;
        const char *default_value;
    } prop_map[] = {
        { "ro.boot.serialno",   "ro.serialno",   "", },
        { "ro.boot.mode",       "ro.bootmode",   "unknown", },
        { "ro.boot.baseband",   "ro.baseband",   "unknown", },
        { "ro.boot.bootloader", "ro.bootloader", "unknown", },
        { "ro.boot.hardware",   "ro.hardware",   "unknown", },
        { "ro.boot.revision",   "ro.revision",   "0", },
        { "ro.boot.firstboot",  "ro.firstboot",  "0", },
    };
    for (size_t i = 0; i < ARRAY_SIZE(prop_map); i++) {
		//add
		if(i == 0){
			char serialno[20];
			import_kernel_cmdline(false, [&](const std::string& key, const std::string& value, bool in_qemu) {
				if (key == "androidboot.mac") {
					strcpy(serialno,value.c_str());
					NOTICE("ADD serialno mac is %s...\n", value.c_str());
				}
			});
			
			NOTICE("ADD serialno mac 2 is %s...\n", serialno);
            property_set(prop_map[i].dst_prop, serialno);
		}else
		{
			std::string value = property_get(prop_map[i].src_prop);
			property_set(prop_map[i].dst_prop, (!value.empty()) ? value.c_str() : prop_map[i].default_value);
		}
		//add end
		/* disabled
        std::string value = property_get(prop_map[i].src_prop);
        property_set(prop_map[i].dst_prop, (!value.empty()) ? value.c_str() : prop_map[i].default_value);*/
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值