今天很好奇下面这张图片显示的字段内容从何而来,这些也常常作为Android手机或者平板中的设置项中”关于平板电脑“或者“关于设备”等信息相关。
调研学习确认后,初步定为到是通过如下文件来获取的。
1./proc/version/的内容如下
Linux version 3.3.0 (liuyongming@wits) (gcc version 4.6.3 20120201 (prerelease) (crosstool-NG linaro-1.13.1-2012.02-20120222 - Linaro GCC 2012.02) ) #13 SMP PREEMPT Thu Nov 7 20:35:22 CST 2013
这部分内容是自动通过编译器在编译的时候确定的,内核启动后会通过version_proc_show()等函数来创建好vesion并写入相关的内容
static int version_proc_show(struct seq_file *m, void *v) { seq_printf(m, linux_proc_banner, utsname()->sysname, utsname()->release, utsname()->version); return 0; }
核心的字段就是在linux_proc_banner这个宏变量中:
#include <generated/compile.h> /* FIXED STRINGS! Don't touch! */ const char linux_banner[] = "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n"; const char linux_proc_banner[] = "%s version %s" " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")" " (" LINUX_COMPILER ") %s\n";
很明显最终version的内容是通过上述的几个宏来整合确定 ,那么这些宏在哪里呢?
这些宏是在编译时,结合你的编译环境和编译器的版本最终自动确定的,确定的脚本由kernel目录/scripts/mkcompile.h来生成的,最终生成的文件保存在内核目录include/generated/compile.h中,而这个头文件也整合在编译时被加入到了Linux_banner[]所在的文件中。
2.上面是Linux内核专属的一些信息字段,作为android自己的东西,主要维护在内核的属性参数之中
/system/build.prop是由Android编译时由编译脚本build/core/Makefile和Shell脚本build/tools/buildinfo.sh来生成的,综合了整个编译配置环境下的平台相关变量,而这些变量往往在Android系统的关于设备信息中都能查看的到。
3 ro.build.id=JDQ39 4 ro.build.display.id=fiber_3g-eng 4.2.2 JDQ39 20140110 test-keys 5 ro.build.version.incremental=20140110 6 ro.build.version.sdk=17 7 ro.build.version.codename=REL 8 ro.build.version.release=4.2.2 9 ro.build.date=2014年 01月 10日 星期五 16:03:07 CST 10 ro.build.date.utc=1389340987 11 ro.build.type=eng 12 ro.build.user=root 13 ro.build.host=linux 14 ro.build.tags=test-keys 15 ro.product.model=Softwinner 16 ro.product.brand=Softwinner 17 ro.product.name=fiber_3g 18 ro.product.device=fiber-3g 19 ro.product.board=exdroid 20 ro.product.cpu.abi=armeabi-v7a 21 ro.product.cpu.abi2=armeabi 22 ro.product.manufacturer=unknown 23 ro.product.locale.language=en 24 ro.product.locale.region=US 25 ro.wifi.channels= 26 ro.board.platform=fiber ....
就这样,应用程序头通过读取这些文件的信息就可以把需要的字段display给大家查看,而开发者也可以修改这些字段,当然因为是编译时由脚本自动产生,所以也没必要修改太多。