Android 7.1.1内核编译错误(工具链)

时间:2017-08-04 19:21:35

标签: android c linux-kernel android-ndk

构建环境是ubuntu 16.04,最新的gcc 5.4.0和GNU Make 3.82。我的目标是am335x定制板,可以运行android 4.4。我将支持android 7.1.1。

该项目是从谷歌android清单标记android-7.1.1_r46获取的,内核来自msm标记android-7.1.1_r0.63。我使用的交叉编译器来自prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin

这是环境信息。我还没有安装NDK或SDK,因为我看到android 7.1.1的api级别是25,而最新的NDK只支持24,所以我有点困惑该怎么办。

如果我运行命令:m -j8 uboot linux uboot编译得很好,但编译linux内核时会出现很多错误。

/media/yangjiel/disk2/android/kernel/arch/arm/mach-omap2/prm_common.c: In function 'omap_prcm_register_chain_handler':
/media/yangjiel/disk2/android/kernel/arch/arm/mach-omap2/prm_common.c:293:2: warning: passing argument 2 of 'irq_set_chained_handler' from incompatible pointer type [enabled by default]
error, forbidden warning: prm_common.c:293
make[2]: *** [arch/arm/mach-omap2/prm_common.o] Error 1
make[1]: *** [arch/arm/mach-omap2] Error 2
make[1]: *** Waiting for unfinished jobs....
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:141:13: error: 'KERN_BOOT_REASON' undeclared here (not in a function)
  { CTL_INT, KERN_BOOT_REASON,  "boot_reason" },
             ^
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:528:13: error: 'NET_IPV6_ACCEPT_RA_PREFIX_ROUTE' undeclared here (not in a function)
  { CTL_INT, NET_IPV6_ACCEPT_RA_PREFIX_ROUTE, "accept_ra_prefix_route" },
             ^
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:528:2: error: initializer element is not constant
  { CTL_INT, NET_IPV6_ACCEPT_RA_PREFIX_ROUTE, "accept_ra_prefix_route" },
  ^
/media/yangjiel/disk2/android/kernel/kernel/sysctl_binary.c:528:2: error: (near initialization for 'bin_net_ipv6_conf_var_table[24].ctl_name')
make[2]: *** [kernel/sysctl_binary.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [kernel] Error 2
make: *** [sub-make] Error 2
make: Leaving directory `/media/yangjiel/disk2/android/kernel'
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1
make: Leaving directory `/media/yangjiel/disk2/android'

如果我删除导致此错误的文件中的行,则上面的错误已解决,但我会得到另一个

/media/yangjiel/disk2/android/kernel/kernel/cgroup.c: In function 'subsys_cgroup_allow_attach':
/media/yangjiel/disk2/android/kernel/kernel/cgroup.c:2138:37: error: invalid operands to binary != (have 'kuid_t' and 'kuid_t')
   if (current != task && cred->euid != tcred->uid &&
                                     ^
/media/yangjiel/disk2/android/kernel/kernel/cgroup.c:2139:18: error: invalid operands to binary != (have 'kuid_t' and 'kuid_t')
       cred->euid != tcred->suid)
                  ^
make[2]: *** [kernel/cgroup.o] Error 1
make[2]: *** Waiting for unfinished jobs....
  CC      kernel/trace/power-traces.o
  CC      kernel/trace/rpm-traces.o
  CC      kernel/trace/trace_probe.o
  LD      kernel/trace/libftrace.o
  LD      kernel/trace/built-in.o
make[1]: *** [kernel] Error 2
make: *** [sub-make] Error 2
make: Leaving directory `/media/yangjiel/disk2/android/kernel'
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1
make: Leaving directory `/media/yangjiel/disk2/android'

背后还有更多错误。

我搜索过,大多数人都说这是一个工具链问题。但是我没有找到关于如何正确安装工具链的大量指导,特别是对于7.1.1。 android 4.4内核似乎没有工具链。我获取自定义的android 4.4内核,它编译得很好。

1 个答案:

答案 0 :(得分:0)

上面的问题是因为我下载了错误版本的Android内核。我下载的是https://android.googlesource.com/kernel/msm/+/android-7.1.1_r0.63,这是内核v3.10。

显然这不适用于Android 7.1.1(应该使用内核v4.4)。因此,当我尝试使用预构建的“新”交叉编译器编译“旧”内核时,它会生成“旧”编译器不会出现的整串错误。我最终使用https://android.googlesource.com/kernel/common/+/upstream-linux-4.4.y upstream-linux-4.4.y分支中的内核,它与Android 7.0到7.1.2兼容。

我不知道为什么谷歌将其命名为android-7.1.1_r0.63,但绝对不适合Android 7.1.1使用。希望没有人像我一样遇到同样的问题。