Android O 系统中原生的设备序列号获取方式

5

在Android O版本中,如果不调用Java的Build.getSerial()方法,正确获取本机序列号的方法是什么?

在Android < 26版本中,我们可以使用以下代码获取设备序列号:

string serial = read_property("ro.boot.serialno");

...

string read_property(const string& property_name) {
  char propertyValue[PROP_VALUE_MAX];
  int propertyLen = __system_property_get(property_name.c_str(), propertyValue);
  ...
}

在Android O上,这会抛出一个错误:
Access denied finding property "ro.boot.serialno"

尽管已经授权READ_PHONE_STATE权限,但似乎与Android 26中废弃的Build.SERIAL有关。我成功地使用adb获取了该属性,因此该值未被删除且存在:
adb shell getprop ro.boot.serialno

1
“Access denied” 一句话道尽了问题,Android O 上的构建序列号已不再对应用程序开放(adb shell 不是应用程序)。即使以某种方式可以访问它,您也不应该使用它,因为拒绝访问是为了保护 Android 用户的隐私。如果您找到漏洞,Google 很可能会在后期关闭它,所以最好找到其他替代方法来完成您想要做的事情。 - M66B
1个回答

0

您可以使用Build.getSerial()获得序列号。

如果用户已经授予了READ_PHONE_STATE权限,则没有问题,但是如果用户撤销了权限或从未授予过它 - 您应该考虑到在尝试检索它时会在运行时收到SecurityException。

总的来说 - 看起来Google在过去几年中慢慢推动防止应用程序使用个人可识别信息(如设备序列号),因此您应该寻找替代方案,例如installationId。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接