构建环境是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内核,它编译得很好。
答案 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使用。希望没有人像我一样遇到同样的问题。