第四篇,

目录

唯一识别码的前世

在开发中, 总有人会提出各种设备”唯一标识符”的概念,以便于定位用户的唯一性, 或对于用户行为进行分析

很遗憾, 通过多年的探索, 目前没有任何一种特别准确, 一定能保证唯一的方案

包括但不仅限于以下方案

设备序列号 IMEI imsi mac 地址(wifi 模块)

如以下代码:

package top.kikit.uniqueidprivacy

import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.os.Bundle
import android.telephony.TelephonyManager
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.tbruyelle.rxpermissions2.RxPermissions

class MainActivity : AppCompatActivity() {
    private val TAG = "MainActivity";

    private val rxPermissions = RxPermissions(this)

    @SuppressLint("CheckResult")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        val mTelephonyMgr = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

        rxPermissions.request(Manifest.permission.READ_PHONE_STATE)
            .subscribe {
                if (it) {
                    val subscriberId = mTelephonyMgr.subscriberId // imsi
                    val imei = mTelephonyMgr.imei // imei

                    Log.i(TAG, "subscriberId : $subscriberId")
                    Log.i(TAG, "imei : $imei")
                }
            }
    }
}

唯一识别码的今生(androidQ 的更新)

唯一识别符

mac 地址

随机 mac 地址

现在默认传输随机 mac 地址

使用getRandomizedMacAddress()方法获取, 而这个方法位于WifiConfiguration类中, 而这个类被标记为过时

20190524143107.png 大概意思是: 以后会被 XXX 替代, 而且以后这个类只有系统可以访问

所以这个被封死了

获取真实 wifi 地址

使用getWifiMacAddress()来获取

这个类位于 DevicePolicyManager 类中, 这是一个设备管理员专用的类

20190524143610.png

所以这个也暂时别想了

IMEI/序列号

20190524143707.png 官方原文: androidQ 以后只有拥有READ_PRIVILEGED_PHONE_STATE权限的应用才能访问唯一识别码

如果 targetVersion 在 Q 以下, 可以使用, 但是会返回 null, targetVersion 为 Q 以上的, 直接抛出SecurityException异常

广告识别码

官方给提供的广告识别码在一定程度上可以用于广告, 但是广告识别码是可以由用户自己重置的

以下是介绍: create an Android Advertising ID

best practices for unique identifiers

这这两段都是中文, 某些朋友如果无法科学上网, 默哀下

不过这个广告 ID 似乎需要 google service 支持, 只能说再见

官方建议

官方还有一个建议,就是自己创建, 这个也是我一直以来在使用的方案, 就是自己创建一个 UUID

UUID.randomUUID().toString()

然后创建一个文件,把这东西写入, 以前是保存在 sdcard 中, 现在的话, 不能简单的保存在 sdcard 中了,可能需要保存到 Media 中,否则卸载后文件就木有了

当然这个防止不了三清手机

更新 2019 年 9 月 16 日

查看 2019 年 中国的开发者大会, 关于这部分有一个截图

20190916143434.png

只要你是同一个签名, 获取的总是相同, 只有恢复出厂设置才会视为不同设备

剪切板数据

现在,除非你是输入法, 或者具有焦点应用, 否则无法再读取剪切板数据了

不会以后在淘宝复制一个口令,然后支付宝/淘宝全家桶都出来告诉你, 可能是我的口令了, 请点一下之类的东西了

也不会有复制了一个 url, 然后 UC 浏览器说, 这个网页不错,我能打开, 点我点我

另外也不用担心某个 app 后台运行着, 然后把你的剪切板数据都监听一下, 只要改了我就上报

后记

androidQ 基本隔绝了唯一识别码的读取方式, 唯一的一个方案是你注册成为”设备管理器”, 然后读取 mac 地址

以上