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



构建环境是 ubuntu 16.04,带有最新的 gcc 5.4.0 和 GNU Make 3.82。我的目标是可以运行安卓 335 的 am4.4x 定制板。我将在安卓 7.1.1 上支持它。

该项目是从谷歌安卓清单标签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 linuxuboot 编译得很好,但是编译 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内核,它编译良好。

上面的问题是因为我下载了错误版本的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.yupstream-linux-4.4.y分支中的内核,它与 Android 7.0 到 7.1.2 兼容。

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

最新更新