Android 11+下通过NDK(C++)获取硬件信息的技术求助
Android 11+ 借助NDK获取硬件信息(处理器ID/设备序列号)
核心逻辑
Android 11及以上在Java层限制了硬件标识的直接访问,但部分底层系统文件仍保留相关信息,可通过NDK的C/C++代码读取对应节点来获取目标数据。
具体实现方案
1. 获取处理器ID(以ARM架构为例)
ARM架构设备的处理器ID通常存放在/proc/cpuinfo文件中,对应Processor或Serial字段(不同厂商可能有差异)。
C++代码示例:
#include <stdio.h> #include <string.h> #include <stdlib.h> char* get_cpu_id() { FILE* fp = fopen("/proc/cpuinfo", "r"); if (!fp) return NULL; char* line = NULL; size_t len = 0; ssize_t read; static char cpu_id[256] = {0}; while ((read = getline(&line, &len, fp)) != -1) { if (strstr(line, "Processor") != NULL) { char* ptr = strchr(line, ':'); if (ptr) { ptr += 2; // 跳过冒号与空格 strncpy(cpu_id, ptr, strlen(ptr)-1); // 移除换行符 break; } } } fclose(fp); if (line) free(line); return strlen(cpu_id) > 0 ? cpu_id : NULL; }
2. 获取设备序列号
设备序列号可尝试从/proc/cmdline(部分设备启动参数会携带)读取,格式通常为androidboot.serialno=xxxxxx;也可读取/sys/class/net/eth0/address获取MAC地址作为替代标识(需注意部分设备路径可能不同)。
读取/proc/cmdline的C++示例:
char* get_serial_number() { FILE* fp = fopen("/proc/cmdline", "r"); if (!fp) return NULL; char cmdline[1024] = {0}; fread(cmdline, 1, sizeof(cmdline)-1, fp); fclose(fp); char* serial_ptr = strstr(cmdline, "androidboot.serialno="); if (serial_ptr) { serial_ptr += strlen("androidboot.serialno="); char* end_ptr = strchr(serial_ptr, ' '); if (end_ptr) *end_ptr = '\0'; static char serial[64] = {0}; strncpy(serial, serial_ptr, sizeof(serial)-1); return serial; } return NULL; }
关键注意事项
- 权限与SELinux限制:多数
/proc、/sys下的系统文件无需额外权限,但部分设备可能因SELinux规则限制读取,需实际测试适配。 - 设备兼容性:不同芯片厂商(高通、联发科等)的硬件信息存储路径存在差异,需针对不同架构和厂商做适配。
- 合规风险:Google隐私政策限制硬件标识的收集与使用,需确保符合应用商店审核规则,避免应用被拒。
内容的提问来源于stack exchange,提问作者Denys Korniienko
相关产品推荐
相关产品推荐

