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生效,就需要修改內核中的配置了。
總結
以上是生活随笔為你收集整理的RK3399 Android7.1修改安兔兔等第三方软件读到的内核版本信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AccountManager 数据库存储
- 下一篇: 王半仙儿的日记-0010——“在人生的十