• RK3399 Android7.1修改安兔兔等第三方软件读到的内核版本信息


    内核版本信息可以通过adb进入shell查看:

    cat /proc/version

    其定义是在kernel/fs/proc/version.c和kernel/init/version.c两个文件中。

    kernel/init/version.c中如下代码:

    const char linux_proc_banner[] =
        "%s version %s"
        " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
        " (" LINUX_COMPILER ") %s\n";

    以上就是内核版本的组成格式,其中的宏定义可以从内核代码中找到。另外几个格式符(%s)的内容就是在kernel/fs/proc/version.c中的如下代码中合成:

    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;
    }

    3个%s分别对应“utsname()->sysname”,“ utsname()->release”,“utsname()->version)”三个变量信息。

    如果想要修改内核版本信息,可以直接在以上两个代码段中修改为字符串即可。

    如果改动较大,系统设置中的内核版本号可能会显示不出来,这时候需要在“frameworks\base\packages\SettingsLib\src\com\android\settingslib\DeviceInfoUtils.java”中配合修改代码,才能正常显示。如下部分代码:

     public static String formatKernelVersion(String rawKernelVersion) {
            // Example (see tests for more):
            // Linux version 3.0.31-g6fb96c9 (android-build@xxx.xxx.xxx.xxx.com) \
            //     (gcc version 4.6.x-xxx 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT \
            //     Thu Jun 28 11:02:39 PDT 2012

            final String PROC_VERSION_REGEX =
                    "Linux version (\\S+) " + /* group 1: "3.0.31-g6fb96c9" */
                    "\\((\\S+?)\\) " +        /* group 2: "x@y.com" (kernel builder) */
                    "(?:\\(gcc.+? \\)) " +    /* ignore: GCC version information */
                    "(#\\d+) " +              /* group 3: "#1" */
                    "(?:.*?)?" +              /* ignore: optional SMP, PREEMPT, and any CONFIG_FLAGS */
                    "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; /* group 4: "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) + "\n" +                 // 3.0.31-g6fb96c9
                    m.group(2) + " " + m.group(3) + "\n" + // x@y.com #1
                    m.group(4);                            // Thu Jun 28 11:02:39 PDT 2012
        }

            以上代码中的版本号格式“PROC_VERSION_REGEX” 是与内核中的“linux_proc_banner”呼应的,如果对应不上,系统设置中就无法正确识别和显示了。

            如果只修改系统设置中的内核版本号可以只修改这个DeviceInfoUtils.java文件即可(直接在return后面修改即可)。如果修改使所有app生效,就需要修改内核中的配置了。

  • 相关阅读:
    maven聚合工程的创建
    step-by-step 配置 gtest 在 vscode 测试 c/c++(Ubuntu 环境下示范)
    Oracle/PLSQL: Bin_To_Num Function
    编译原理5 自底向上语法分析
    静态模板编译:提高Web性能的利器
    【MATLAB源码-第54期】基于白鲸优化算法(WOA)和遗传算法(GA)的栅格地图路径规划最短路径和适应度曲线对比。
    git设置代理
    从四个“实在”看京东双十一的烟火气
    两种语言“争霸赛”,PHP速度领先C#
    【0225】RELSEG_SIZE、BLCKSZ 等变量值是多少?它们声明于何处?
  • 原文地址:https://blog.csdn.net/u011774634/article/details/127987584