Android设备的序列号与ro.serialno

Android设备的序列号通过Property"ro.serialno"获取,通常由内核启动参数中的"ro.boot.serialno"提供。在rk3368上,该值可能源于uboot读取的idblock或由"sys.serialno"更改触发。init进程解析cmdline设置"ro.boot.serialno",进一步映射到"ro.serialno"。此外,drmservice会更新"sys.serialno",导致"ro.serialno"变化,序列号也可能源自idblock或基于WiFi MAC地址的算法生成。

Android设备的序列号是通过获取Property“ro.serialno”的值取得的。“ro.serialno”的值一般来源于内核启动参数中的"ro.boot.serialno"。


在rk3368 Android6.0中,uboot读取idblock的IDBLOCK_SN偏移地址获取序列号----->保存到env变量“fbt_sn#”----->保存到env变量“androidboot.serialno”----->设置到内核CMDLINE----->android init程序解析/proc/cmdline----->保存到Property“ro.boot.serialno”----->映射保存到Property“ro.serialno“

rk3368的序列号(Property“ro.serialno“)来源主要有以下几种:
1. init解析/proc/cmdline获取

init 读取内核cmdline(/proc/cmdline),解析“androidboot.serialno”并赋值给“ro.boot.serialno”,然后通过映射赋值给“ro.serialno“。 但在rk3368系统中只有TARGET_BOARD_PLATFORM为sofia3gr的设备才会走这个流程。

2. 改变property“sys.serialno”的值触发修改ro.serialno

当property “sys.serialno”的值改变时,设置Property“ro.serialno”的值为“sys.serialno”的值。

init.rk30board.rc

# set ro.serialno
on property:sys.serialno=*
    setprop ro.serialno ${sys.serialno}
......
service drmservice /system/bin/drmservice
        class main
        oneshot

drmservice会改变sys.serialno的值

drmservice启动时会获取序列号保存到/data/misc/wifi/serialno,并且会设置“sys.serialno”的值,从而触发init.rk30board.rc中ro.serialno值的更新。

drmservice获取序列号的来源可能是来自idblock(读取/dev/rknand_sys_storage)、算法自动生成(根据wifi mac地址),主要看宏定义SERIALNO_FROM_IDB是否打开。

system/core/drmservice/drmservice.c
#define SERIALNO_FROM_IDB 0

烧录序列号工具: RKTools/windows/UpgradeDllTool_v1.35


Android 应用中获取系统属性 `ro.serialno` 的值,可以通过反射调用 `SystemProperties` 类中的 `get` 方法来实现。此方法允许访问设备的只读系统属性,并返回对应的字符串值。 以下是一个完整的示例代码片段,用于获取 `ro.serialno` 的值: ```java import java.lang.reflect.Method; public class DeviceUtils { public static String getSerialNumber() { String serialNumber = null; try { Class<?> systemPropertiesClass = Class.forName("android.os.SystemProperties"); Method methodGet = systemPropertiesClass.getMethod("get", String.class, String.class); serialNumber = (String) methodGet.invoke(systemPropertiesClass, "ro.serialno", "unknown"); } catch (Exception e) { // Handle exceptions or fallback to default value serialNumber = "unknown"; } return serialNumber; } } ``` 通过调用 `DeviceUtils.getSerialNumber()`,应用可以获取到设备序列号[^1]。需要注意的是,由于 `SystemProperties` 类并非公开 API,因此必须使用 Java 反射机制来访问其方法。此外,这种技术可能受到设备制造商或 Android 版本差异的影响,在某些设备上可能会返回 `"unknown"` 或空值[^3]。 如果需要兼容更高版本的 Android 系统(如 Android 9 及以上),建议额外处理权限和系统限制,因为从 Android 9 开始,非系统应用对底层系统属性的访问受到更严格的限制。 ### 获取设备序列号的实际用途 该序列号通常可用于设备识别、日志记录或绑定用户账户等场景。然而,出于隐私保护的目的,不建议将此信息用于跨应用的用户追踪,除非已获得用户的明确授权[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值