RK3399 Android7.1修改安兔兔等第三方软件读到的内核版本信息
內(nèi)核版本信息可以通過adb進(jìn)入shell查看:
cat /proc/version
其定義是在kernel/fs/proc/version.c和kernel/init/version.c兩個(gè)文件中。
kernel/init/version.c中如下代碼:
const char linux_proc_banner[] =
?? ?"%s version %s"
?? ?" (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
?? ?" (" LINUX_COMPILER ") %s\n";
以上就是內(nèi)核版本的組成格式,其中的宏定義可以從內(nèi)核代碼中找到。另外幾個(gè)格式符(%s)的內(nèi)容就是在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個(gè)%s分別對(duì)應(yīng)“utsname()->sysname”,“?utsname()->release”,“utsname()->version)”三個(gè)變量信息。
如果想要修改內(nèi)核版本信息,可以直接在以上兩個(gè)代碼段中修改為字符串即可。
如果改動(dòng)較大,系統(tǒng)設(shè)置中的內(nèi)核版本號(hào)可能會(huì)顯示不出來,這時(shí)候需要在“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
??? }
????????以上代碼中的版本號(hào)格式“PROC_VERSION_REGEX” 是與內(nèi)核中的“l(fā)inux_proc_banner”呼應(yīng)的,如果對(duì)應(yīng)不上,系統(tǒng)設(shè)置中就無法正確識(shí)別和顯示了。
????????如果只修改系統(tǒng)設(shè)置中的內(nèi)核版本號(hào)可以只修改這個(gè)DeviceInfoUtils.java文件即可(直接在return后面修改即可)。如果修改使所有app生效,就需要修改內(nèi)核中的配置了。
總結(jié)
以上是生活随笔為你收集整理的RK3399 Android7.1修改安兔兔等第三方软件读到的内核版本信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AccountManager 数据库存储
- 下一篇: Android账号同步系统的建立——Ac