当前位置: 首页 > news >正文

android 获取serialno_[Android]关于Android 唯一设备号(ro.serialno)

1.ro.serialno不存在于任何属性文件,比如build.prop, default.prop等,而是在/system/core/init/init.c里由ro.boot.serialno 转换而来,见export_kernel_boot_props()。

2.而ro.boot.serialno的来源是/proc/cmdline,也就是linux kernel启动时被传入的cmdline, 由bootloader传入。

bootloader传进来的是androidboot.serialno, 而不是ro.boot.serialno,因为还要解析过cmdline

3.ro.serialno的用处是来保存唯一设备号,在settings->about->status里会显示,也会用在USB device name里。

about->status 里获取serialno的流程:

Build.SERIAL

->getString("ro.serialno")

->SystemProperties.get()

->SystemProperties.native_get()

->SystemProperties_getSS() in android_os_SystemProperties.cpp

->property_get() in Properties.c

->__system_property_get() in System_properties.c in bionic

获取到的前提是之前已经有设置好,也就是有调用property_set() in init.c

4.其他类似ro属性还有:

ro.boot.mode

ro.boot.baseband

ro.boot.bootloader

ro.boot.hardware

static void export_kernel_boot_props(void)

{

char tmp[PROP_VALUE_MAX];

int ret;

unsigned i;

struct {

const char *src_prop;

const char *dest_prop;

const char *def_val;

} 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", },

};

for (i = 0; i < ARRAY_SIZE(prop_map); i++) {

ret = property_get(prop_map[i].src_prop, tmp);

if (ret > 0)

property_set(prop_map[i].dest_prop, tmp);

else

property_set(prop_map[i].dest_prop, prop_map[i].def_val);

}

ret = property_get("ro.boot.console", tmp);

if (ret)

strlcpy(console, tmp, sizeof(console));

/* save a copy for init's usage during boot */

property_get("ro.bootmode", tmp);

strlcpy(bootmode, tmp, sizeof(bootmode));

/* if this was given on kernel command line, override what we read

* before (e.g. from /proc/cpuinfo), if anything */

ret = property_get("ro.boot.hardware", tmp);

if (ret)

strlcpy(hardware, tmp, sizeof(hardware));

property_set("ro.hardware", hardware);

snprintf(tmp, PROP_VALUE_MAX, "%d", revision);

property_set("ro.revision", tmp);

摘自Android Kitkat 4.4


http://www.taodudu.cc/news/show-647667.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • byte数组转file不写入磁盘_Linux 环境写文件如何稳定跑满磁盘 I/O 带宽?
  • android微信小程序自动填表_微信小程序自动回复用户消息
  • db2分页查询语句优化_数据量很大,分页查询很慢,该怎么优化?
  • arcgis 统一投影下范围不同_关于Arcgis这62个常用技巧,你造吗
  • 漏洞挖掘 符号执行_简述符号执行
  • 小度智能音箱维修点_会投屏电视的智能音箱——小度智能音箱PLAY青春版轻体验...
  • pq 中m函数判断嵌套_Python中numpy的布尔判断、切片、维度变化、合并、通用函数...
  • 对象 普通po转_谈谈C++对象的构造
  • 内存条ar开头的如何看大小_软网推荐:明明白白看内存
  • if else 简写_15+ JS简写骚操作,让你的代码“秀”起来??
  • iextensionunit类_Java ICompilationUnit.reconcile方法代码示例
  • 报错 插入更新_自增主键,三类插入测验答案,在这里。
  • 事务连接中断_HTTP长连接和短连接
  • 亚马逊评价抓取插件_亚马逊运营必备插件
  • controller需要捕获异常吗_Spring之Controller异常处理
  • mysql8中文排序_mysql中utf8编码的中文字段按拼音排序
  • html 分级切换菜单_FL studio系列教程(十六):FL Studio查看菜单讲解
  • mysql还原数据库后日期显示3000_mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法...
  • java 函数名调用_粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数...
  • docker mysql sock_docker mysql安装
  • mysql最大述_mysql最大字段数量及 varchar类型总结
  • php协程实现mysql异步_swoole与php协程实现异步非阻塞IO开发
  • mysql中xml类型_使用 SQLXML 数据类型
  • mysql语法6_全面接触SQL语法(6)_mysql
  • sqlerver mysql_转 MYSQL学习(一)
  • tcpdump 识别成dns_dns tcpdump
  • java linkedhashmap_java学习-hashMap和linkedHashMap
  • 简单java题_java
  • java actionsupport_struts2中的Action接口和Actionsupport接口各有什么作用
  • java jar log4j_使用Log4j