1. 学习前言
最近换了台电脑,只能重新装虚拟机重新编译android源码以及内核了。源码按照网上的流程(经典的老罗之旅以及其他)基本上可以编译通过。我再网上下载了一个别人压缩好的包,配置一下javap基本上一次编译就通过。但是android内核编译却遇到了不少问题。
尽管,这些编译过程看似只要动动手就可以了,但是我发现重复几次以后对其中的一些问题还是有了很多新的感性的认识。很突出的一点就是遇到问题的第一个反应不是直接到网上找答案,而是参考一下别人的自己想一想然后自己慢慢的去解决掉。这算是一次次的重复动手的一个小小收货吧。下面把这次编译碰到的一些问题稍微记录一下。
2. 内核编译步骤
(1) 下载内核源码:这个由于google被墙了,但是还可以通过各种途径下载到。我的android是4.4.2的,内核源码下载的是android-goldfish-3.4。下载完成以后,将内核源码加压缩到android源码目录中。模仿网上的路径,在android源码根目录下创建kernel/common,然后解压缩到该目录下.
解压命令:tar –xzvf android-goldfish-3.4.tar.gz XXX/kernel/common(xxx代表android根目录)
(2) 修改内核源码文件权限:由于编译的时候会涉及到不少权限的问题,所以为了偷个懒我就把解压缩的内核文件全部改为777了,
权限修改命令:sudo chmod 777 –Rkernel/common/
(3) 编译配置:编译配置这个地方很重要,配置不好后面会编译不通过。
首先最重要的是配置gcc,配置的命令是:export PATH=$PATH:(gcc所在的目录bin),gcc所在的目录bin在不同的版本中又差别很大,一般的是在XXX/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin目录下,但是我下载的4.4.2的还真不在这里,配置了以后运行make直接报错。待会综合下面的配置讲解这里的错误问题。
然后,修改Makefile文件,将Makefile中的
ARCH ?= (SUBARCH) 改为:ARCH ?= (SUBARCH)
CROSS_COMPILE?= CROSS_COMPILE?=arm-eabi-
(4) 内核编译:进入XXX/kernel/common/执行make goldfish_defconfig运行完以后执行make,不过有人严肃的提出来用4.4.0以上的用make goldfish_defconfig会有很多问题,要用make goldfish_armv7_defconfig 我就直接用了后面这个,即执行make goldfish_armv7_defconfig 然后直接make ,最后可以看到arch/arm/boot/zImageis ready。
(5) 编译问题:编译的过程中会出现很多问题了,最主要的是(3)中的配置问题。
首先:如果4.4.2中的gcc所在的bin目录是XXX/prebuilts/gcc/linux-x86/arm/arm-eabi-4.X/bin。这个路径也不是绝对的,如果这里配置不好会报出arm-eabi-gcc命令找不到。所以最好如果找不到arm-eabi-gcc所在的路径的话,可以在内核源码目录通过find命令查找:
===》find ./XXXandroid根目录 -name arm-eabi-*
当然网上也有说是新的arm-eabi-gcc不适合用于4.4以上的编译,可以自己去下载一个新的gcc环境编译,我没试过,不过我觉得android自带的应该可以搞定的,只要配置正确。然后到查到到的路径下面,前面的路径可能不同,但是后半部分的路径基本上是linux-x86/arm/arm-eabi-4.X,这个地方可能会有很多个目录,可以进到每个目录里看看是不是每个目录下的bin中都有gcc这个文件,如果有就可以通过export选择一个配置的path下。
然后,将上面的路径环境配置好了以后,可能还会报一下莫名其妙的错误,比如某个文件permission denied等等,还有
scripts/kconfig/conf -s arch/arm/Kconfig
*** Error during writing of the kernel configuration.
make[2]: *** [silentoldconfig] Error 1
make[1]: *** [silentoldconfig] Error 2
CHK include/linux/version.h
make: *** No rule to make target `include/config/auto.conf',needed by `include/asm-arm/.arch'. Stop
类似的错误,这个奇怪的错误应该是跟权限有关系的,如果我们用普通用户配置了上面的gccb所在的bin目录,但是修改Makefile的时候却用sudo gedit Makefile的话,就会报这些莫名其妙的错误,通过实验把所有的文件全部设置为777,再用普通用户配置路径,修改Makefile等文件去编译就基本没问题了。
(6)ps 虚拟机打开:编译完成以后迫不及待的配置好环境以后打开模拟器,但是输入emulaotr以后却报出如下的错误:
emulator: ERROR: You did not specify a virtualdevice name, and the system directory could not be found.
If you are an Android SDK user, please use'@' or '-avd '
to start a given virtual device (see-help-avd for details).
Otherwise, follow the instructions in-help-disk-images to start the emulator
上网上查了一下,这个错误解决方法可以通过输入:
. build/envsetup.sh
lunch aosp_arm-eng
最后再输入emulator命令即可解决上述问题,(参考网址忘记记录了)。
模拟器的打开可以采用默认的内核,也可以用自己编译好的内核,整体打开的步骤如下:
==》export PATH=$PATH:~/XXXandroid根目录/out/host/linux-x86/bin
==》exportANDROID_PRODUCT_OUT=~/android目录/out/target/product/generic
==》emulator(用默认的内核,下面的命令是用自己刚刚编译好的内核)
==》emulator -kernel./kernel/common/arch/arm/boot/zImage &
==》报上述提出的错误:
==》. build/envsetup.sh
==》lunch aosp_arm-eng
==》emulaotr的命令
==》模拟器打开成功
(7) ps单独子模块的编译:单独子模块的编译,参照老罗的Android之旅方法是:
==》. build/envsetup.sh
==》mmm /需要编译的子模块
==》make snod
但是这个方法在2.X版本的时候测试的是可以,但是我用4.4.2的版本用这个的时候,最后出了一个大大的错误,编译完成以后提示你system.img没了,需要rebuild,没办法只能重新编译android源码,但是编译子模块是不能再用上述的方法了,查了一下别人的提供的方法,并对email的app的名字在配置文件中做了修改,修改完重新编译email子模块,问题解决,该方法步骤如下:
==》. build/envsetup.sh
==》mmm packages/apps/Email/
==》make showcommandsWITH_DEXPREOPT=false
然后,在运行enulator发下email的名字改成我之前修改的名字了。
参考网站()。
(8) ps需要补充的留白……
3. 总结
内核编译基本这些内容了,学习还要深入一些,最近的东西都学得半截拉快的,JNI和NDK的学习过程一直没间断,但是每次想记录自己写的东西都感觉很吃力,可能自己懂了跟有条理的整理下来中间还需要很多功夫和功力的。所以也非常佩服那些专栏的技术博客大牛,不但自己能懂还能系列化地写出来要别人看懂,真不简单!后面计划把前面学习过的NDK和JNI学习心得blog写完。不管自己写的怎么样,每次记录都是一次旅行,在这个过程中会发现很多细节的问题,也会发现自己对技术整体把握的欠缺。我想就算像蜗牛一样慢,也要一步一步往上爬。
继续努力,Keep moving!!!