版本对比

O 版本设置界面中内核信息

Q 版本设置界面中内核信息

解决办法

frameworks\base\packages\SettingsLib\src\com\android\settingslib\DeviceInfoUtils.java

@@ -88,11 +88,15 @@ public class DeviceInfoUtils {

return context.getString(R.string.status_unavailable);

}

+ String user = android.os.SystemProperties.get("ro.build.user", "");

+ String host = android.os.SystemProperties.get("ro.build.host", "");

+

// Example output:

// 4.9.29-g958411d

// #1 Wed Jun 7 00:06:03 CST 2017

return new StringBuilder().append(uname.release)

.append("\n")

+ .append(user + "@" + host)

.append(m.group(1))

.append(" ")

.append(m.group(2)).toString();

补充知识

内核版本信息对应 /proc/version 文件内容

可以通过adb shell, cat /proc/version 进行查看,我们在系统设置中看到的信息是经过裁剪后的,完整的如下

10.0 对应内核信息

cat /proc/version

Linux version 4.9.190 (nobody@android-build) (Android (5484270 based on r353983c) clang version 9.0.3 (https://android.googlesource.com/toolchain/clang 745b335211bb9eadfa6aa6301f84715cee4b37c5) (https://android.googlesource.com/toolchain/llvm 60cf23e54e46c807513f7a36d0a7b777920b5881) (based on LLVM 9.0.3svn)) #3 SMP PREEMPT Fri Jul 10 17:13:42 CST 2020

8.0 对应内核信息

cat /proc/version

Linux version 3.18.79 (ntu@ubuntu) (gcc version 6.3.1 20170109 (Linaro GCC 6.3-2017.02) ) #1 SMP PREEMPT Sun Jun 28 10:45:30 CST 2020

可以看到10.0 中不包含linux编译用户名信息,我们来跟踪下源码

Setting 中对应内核信息 Preference 获取值的地方

vendor\mediatek\proprietary\packages\apps\MtkSettings\src\com\android\settings\deviceinfo\firmwareversion\KernelVersionPreferenceController.java

import com.android.settingslib.DeviceInfoUtils;

public class KernelVersionPreferenceController extends BasePreferenceController {

public KernelVersionPreferenceController(Context context, String preferenceKey) {

super(context, preferenceKey);

}

@Override

public int getAvailabilityStatus() {

return AVAILABLE;

}

@Override

public CharSequence getSummary() {

return DeviceInfoUtils.getFormattedKernelVersion(mContext);

}

}

通过 DeviceInfoUtils.getFormattedKernelVersion(mContext) 获取文本

10.0 对应 DeviceInfoUtils

frameworks\base\packages\SettingsLib\src\com\android\settingslib\DeviceInfoUtils.java

public static String getFormattedKernelVersion(Context context) {

return formatKernelVersion(context, Os.uname());

}

@VisibleForTesting

static String formatKernelVersion(Context context, StructUtsname uname) {

if (uname == null) {

return context.getString(R.string.status_unavailable);

}

// Example:

// 4.9.29-g958411d

// #1 SMP PREEMPT Wed Jun 7 00:06:03 CST 2017

final String VERSION_REGEX =

"(#\\d+) " + /* group 1: "#1" */

"(?:.*?)?" + /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */

"((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 2: "Thu Jun 28 11:02:39 PDT 2012" */

Matcher m = Pattern.compile(VERSION_REGEX).matcher(uname.version);

if (!m.matches()) {

Log.e(TAG, "Regex did not match on uname version " + uname.version);

return context.getString(R.string.status_unavailable);

}

String user = android.os.SystemProperties.get("ro.build.user", "");

String host = android.os.SystemProperties.get("ro.build.host", "");

// Example output:

// 4.9.29-g958411d

// #1 Wed Jun 7 00:06:03 CST 2017

return new StringBuilder().append(uname.release)

.append("\n")

.append(user + "@" + host)

.append(m.group(1))

.append(" ")

.append(m.group(2)).toString();

}

8.0 对应 DeviceInfoUtils

frameworks\base\packages\SettingsLib\src\com\android\settingslib\DeviceInfoUtils.java

private static final String FILENAME_PROC_VERSION = "/proc/version";

public static String getFormattedKernelVersion() {

try {

return formatKernelVersion(readLine(FILENAME_PROC_VERSION));

} catch (IOException e) {

Log.e(TAG, "IO Exception when getting kernel version for Device Info screen",

e);

return "Unavailable";

}

}

public static String formatKernelVersion(String rawKernelVersion) {

// Example (see tests for more):

// Linux version 4.9.29-g958411d (android-build@xyz) (Android clang version 3.8.256229 \

// (based on LLVM 3.8.256229)) #1 SMP PREEMPT Wed Jun 7 00:06:03 CST 2017

// Linux version 4.9.29-geb63318482a7 (android-build@xyz) (gcc version 4.9.x 20150123 \

// (prerelease) (GCC) ) #1 SMP PREEMPT Thu Jun 1 03:41:57 UTC 2017

final String PROC_VERSION_REGEX =

"Linux version (\\S+) " + /* group 1: "3.0.31-g6fb96c9" */

"\\((\\S+?)\\) " + /* group 2: "(x@y.com) " */

"\\((.+?)\\) " + /* group 3: kernel toolchain version information */

"(#\\d+) " + /* group 4: "#1" */

"(?:.*?)?" + /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */

"((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 5: "Thu Jun 28 11:02:39 PDT 2012" */

Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(rawKernelVersion);

if (!m.matches()) {

Log.e(TAG, "Regex did not match on /proc/version: " + rawKernelVersion);

return "Unavailable";

} else if (m.groupCount() < 4) {

Log.e(TAG, "Regex match on /proc/version only returned " + m.groupCount()

+ " groups");

return "Unavailable";

}

return m.group(1) + " ("+ m.group(3) + ")\n" + // 3.0.31-g6fb96c9 (toolchain version)

m.group(2) + " " + m.group(4) + "\n" + // x@y.com #1

m.group(5); // Thu Jun 28 11:02:39 PDT 2012

}

那么我们只需要在 formatKernelVersion() 中返回值做点手脚即可,增加编译用户信息,那么问题来了,如何知道是谁编译的系统呢?

答案就在 buil.prop 中,此文件包含了系统全面信息,从cpu 架构到版本号各种信息,当然里面也有我们需要的编译用户姓名。

out\target\product\k62v1_64_bsp\system\build.prop

ro.build.version.release=10

ro.build.version.security_patch=2020-02-05

ro.build.version.base_os=

ro.build.version.min_supported_target_sdk=23

ro.build.date=Sat Jul 11 09:13:46 CST 2020

ro.build.date.utc=1594430026

ro.build.type=user

ro.build.user=ntu

ro.build.host=ubuntu

可以看到 ro.build.user 和 ro.build.host 正是我们所需要的,通过 SystemProperties api 读取即可

那这两个字段是在那里写入的呢?答案就在 buildinfo.sh 中

build\tools\buildinfo.sh

echo "ro.build.type=$TARGET_BUILD_TYPE"

echo "ro.build.user=$BUILD_USERNAME"

echo "ro.build.host=$BUILD_HOSTNAME"

那 BUILD_USERNAME 和 BUILD_HOSTNAME 又是谁赋值的呢?答案如下

./soong/ui/build/kati.go:if _, ok := cmd.Environment.Get("BUILD_USERNAME"); !ok {

./soong/ui/build/kati.go:cmd.Environment.Set("BUILD_USERNAME", u.Username)

./make/tools/buildinfo.sh:echo "ro.build.user=$BUILD_USERNAME"

./make/Changes.md:make variable `BUILD_USERNAME` for now.

./make/core/main.mk: FILE_NAME_TAG := eng.$(BUILD_USERNAME)

./make/core/config.mk:$(KATI_deprecated_var USER,Use BUILD_USERNAME instead. See $(CHANGES_URL)#USER)

./make/core/version_defaults.mk: BUILD_NUMBER := eng.$(shell echo $${BUILD_USERNAME:0:6}).$(shell $(DATE) +%Y%m%d.%H%M%S)

./soong/ui/build/kati.go:if _, ok := cmd.Environment.Get("BUILD_HOSTNAME"); !ok {

./soong/ui/build/kati.go:cmd.Environment.Set("BUILD_HOSTNAME", hostname)

./make/tools/buildinfo.sh:echo "ro.build.host=$BUILD_HOSTNAME"

./make/Changes.md:of `android-build`. The real value is available as `BUILD_HOSTNAME`.

安卓10 linux内核,AndroidQ(10.0) 内核版本增加linux编译用户信息相关推荐

  1. linux1.0内核下载,LINUX1.0 内核是系统的心脏 - 下载 - 搜珍网

    LINUX 1.0 内核c源代码/linux/Makefile LINUX 1.0 内核c源代码/linux/boot/bootsect.S LINUX 1.0 内核c源代码/linux/boot/s ...

  2. ubuntu18.04.1内核升级至5.0.0-25版本

    ubuntu18.04操作系统版本先已支持在线的内核版本升级,到目前为止18.04发布版已经拥有三个小版本了1,2,3. 其中18.04.01和18.04.03版本,安装好之后默认的是4.15内核版本 ...

  3. 小型linux中文版,4MLinux 30.0 发布,小型Linux发行版

    4MLinux是一个小型Linux发行版,专注于四个功能:维护(作为系统救援Live CD),多媒体(用于播放视频DVD和其他多媒体文件),迷你服务器(使用inetd守护程序)和神秘的版本(提供几个小 ...

  4. 【大数据】Linux下Storm(0.9版本以上)的环境配置和小Demo

    一.引言: 在storm发布到0.9.x以后,配置storm将会变得简单很多,也就是只需要配置zookeeper和storm即可,而不再需要配置zeromq和jzmq,由于网上面的storm配置绝大部 ...

  5. linux ftp登录命令_Linux使用pinky命令查询登录用户信息

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 本文主要讲解如何在Linux系统上使用pinky命令查 ...

  6. 微信开发之获取OAuth2.0网页授权认证和获取用户信息进行关联(转:http://playxinz.iteye.com/blog/2249634)

    最近有做了关于微信公众号和自己网站用户进行用户关联授权登录的一个功能,主要是用户关注该公众号,点击会员中心,则会弹出需要关联授权的网页授权:OAuth2.0网页授权,然后用户同意获取用户信息,进行用户 ...

  7. 番茄日志发布1.0.3版本-增加Kafka支持

    番茄日志(TomatoLog)能做什么 可能你是第一次听说TomatoLog,没关系,我可以从头告诉你,通过了解番茄日志,希望能帮助有需要的朋友,番茄日志处理将大大降低你采集.分析.处理日志的过程. ...

  8. iOS微信发布8.0.29版本,苹果14用户快来

    这两天iOS微信发布了8.0.29版本,主要是针对iOS16系统,修复了一些Bug,对iPhone14用户非常靠谱. 新版苹果 14上线后,微信对它的兼容性还是有一些问题的,比如有网友反馈,在使用微信 ...

  9. Android Forums安卓论坛发生数据泄露 论坛称只泄露了2.5%的用户信息 并已经修复了利用漏洞...

    本周,安卓论坛(最受欢迎的在线安卓社区)通知会员称其网站服务器遭到公司,攻击者可访问部分用户信息.维护安卓论坛的Neverstill媒体代表人表示,黑客只能访问2.5%的活跃用户的信息.泄露数据包括邮 ...

最新文章

  1. tf2运行YOLOv4(tflite)
  2. 报名 | 大咖云集,清华方圆系列之大数据分析与可视化报告会
  3. 【桌面虚拟化】之五PCoIP
  4. promehteus 监控超时_07 . Prometheus监控Memcached并配置Grafana
  5. 688:画圈游戏(思维)
  6. wrapper包装java_java Object 类 与 Wrapper包装类
  7. 手机:导致手机发烫的原因有哪些?
  8. jzoj1371-假期【RMQ】
  9. nginx location 斜杠_【一点资讯】斜杠青年双·11买什么本最划算?光影精灵6让你做“多面娇娃” www.yidianzixun.com...
  10. android 上线流程
  11. php 包含截断,php – 表单包含大量输入时截断/缺少表单...
  12. redis安装教程(简明扼要,一看就懂)
  13. HFSS - 圆极化矩形微带天线设计与仿真
  14. 软件工程项目学生管理系统
  15. matlab悬臂梁有限元分析
  16. MySQL插入数据错误Incorrect string value: ‘\xE8\x85\xBE\xE8\xAE\xAF‘ for column ‘custname‘ at row 1
  17. 面试必须学会的八大技巧——让你在面试官面前游刃有余(面试注意事项等)
  18. 正睿csp七连day3
  19. 电路基础——NMOS物理结构
  20. Linux C语言IO多路转接select函数

热门文章

  1. GeForce GTX 480 测试报告
  2. 基于 Qt Quick+websocket 的Web扫描仪驱动开发
  3. 几种滤波器的比较(巴特沃斯、切比雪夫、贝塞尔滤波器)
  4. Linux运维常用工具软件
  5. 批量打包下载阿里OSS文件
  6. 优地、云迹、擎朗、普渡科技的服务机器人场景战争
  7. MATLAB怎么解方程解,怎么用MATLAB求解微分方程组并画出解函数图?
  8. win10 家庭中文版内存占用过高
  9. 山中无富途,“老虎”称大王?
  10. 计算机应用离线作业,计算机应用基础离线作业