• 编译Android系统源码和内核源码


     

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:  ]
     
     

    把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看重的不是结果,主要是过程,在这个过程中,我感觉最大的收获就是学习的耐心和毅力,因为在这个过程中那个问题就像是雨点似的天天打在你的脸上,虽然现在网上有很多文章介绍怎么去操作,但是我说句真心话,那些只能提供参考,因为你的工作环境毕竟和他不一样,所以等你按照他的步骤去操作的时候还是会遇到很多问题,当然我写这篇文章也不是说我的方法就是一定可以的,我只能说我是成功了,所以我只是想记录一下,以后可以进行翻阅查看,主要的还是要看自己的毅力和解决问题的能力了,好了不多说了,说正事吧~~

    首先我们来看一下编译Android系统源码

    第一:我们知道Android系统是基于Linux开发的,所以我们想编译Android系统源码的话,就必须有一个Linux系统,这里我使用了Ubuntu 64位的系统,这个镜像文件的下载地址是: 链接: http://pan.baidu.com/s/1dEq7SiP 密码: fach

    安装Ubuntu系统不用说了吧,看这里 http://www.linuxidc.com/Linux/2014-04/100369.htm


    问题一:至于我为什么要使用64位系统,因为在后面我会遇到一个问题,就是我第一次安装的是32位的系统,结果在编译的过程中遇到一个问题就是:

    ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-ar only run on 64-bit linux

    编译不通过的,下面的这篇文章就是说怎么解决上的问题,主要就是修改一些指定的文件 http://www.linuxidc.com/Linux/2016-01/127286.htm

    但是很悲剧的是:我按照这个方法操作,并没有成功,那怎么办呢?我最后选择了重装了一个64位的系统,但是这次就没有用虚拟机了,直接安装到电脑中的。

    问题二:安装的时候我先后卸载在安装系统有好几次,主要原因是第一次编译没经验,开始的时候就分配了20G的空间,结果编译的时候傻了,完全不够,所以我直截了当将电脑的200G的空间都分配出去了


    那么安装系统完之后,还有一个问题,当我再去使用同一个方式去下载Android源码的时候,发现总是连接不上了,感觉Google退出中国了,源码也很难下到了,中间只有大约一个月的时间,就不可以下载了,好假,尝试过各种方法,我还买VPN,结果还是不行,那么怎么办呢?之前是有源码的,但是在虚拟机中,这时候就需要将虚拟机中的源码拷贝出来了,那么怎么从虚拟机中拷贝文件呢?这个很简单的,我用的VM的,他能够设置共享文件夹(具体方法可以搜索一下),但是又有一个问题来了,当时在虚拟机中下载的是Android4.4源码,大约有18G,我就尝试拷贝了,结果发现电脑最好拷贝死机了,主要是因为小文件太多了,大约有60万个,电脑配置也不好,所以尝试了几次都是死机了,那拷贝不出来怎么办呢?问题都是得解决的,突然想到了压缩一下在拷贝:http://www.linuxidc.com/Linux/2016-01/127288.htm

    通过上面的一篇文章中,压缩拷贝,结果发现效果很不错,而且压缩也是很快的,这下拷贝就顺利了

    至此我们解决了系统问题和源码问题

    注意:这里所说的源码问题不是指下载源码的问题,我会在最后面说一下现在如何能够得到相应的Android源码,反正从google上去下载我是不相信了。所以我提供了我已经下载好并且打成压缩包的连接, android-4.0.3_r1-20121115.tar.bz2 下载见 http://www.linuxidc.com/Linux/2016-01/127285.htm

    只需要进行解压即可,关于解压缩Linux文件的话,可以查看 http://www.linuxidc.com/Linux/2016-01/127288.htm

    上面的前奏都做好了,下面就来进行编译操作

    第一步:在此之前还需要安装一些辅助工具,防止在安装的时候提示错误,当然我们可以现在不安装,等到安装的时候会提示相应的错误,到时候我只需要针对性的去安装,但是那样在编译的过程中会很不爽的,所以我还是先把这些工作做了

    首先需要安装JDK,请看 http://www.linuxidc.com/Linux/2014-09/107291.htm

    当JDK安装完毕之后,下面就需要来安装一下编译库了:

    sudo apt-get install gnupg flex bison gperf libsdl1.2-dev libesd0-dev 
    sudo apt-get install libwxgtk2.6-dev squashfs-tools build-essential  
    sudo apt-get install zlib1g-dev pngcrush schedtool ia32-libs libncurses5-dev

    当然这些是必须要安装的,但是不是一定在编译的时候就没有问题,所以我们在编译的时候遇到什么问题的时候我们再去进行解决


    今天在Ubuntu 11.04(64位)编译Android2.3源码时,遇到各种各样的问题。不是缺这个,就是少那个。现把这些问题和解决方法罗列出来,供大家参考

    普遍错误:
    1.错误:
    /usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
    make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] 错误 1
    解决:
    sudo apt-get install libc6-dev-i386

    2.错误:
    make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp] error 1
    解决:
    sudo apt-get install g++-multilib

    3.错误:
    external/clearsilver/cgi/cgi.c:22: fatal error: zlib.h: No such file or directory
    compilation terminated.
    make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libneo_cgi_intermediates/cgi.o] Error 1
    解决:
    sudo apt-get install zlib1g-dev

    4.错误:
    /usr/bin/ld: cannot find -lz
    collect2: ld returned 1 exit status
    make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1
    解决:
    sudo apt-get install lib32z1-dev

    5.错误:
    bison -d  -o out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp frameworks/base/tools/aidl/aidl_language_y.y
    /bin/bash: bison: command not found
    make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp] Error 127
    解决:
    sudo apt-get install bison

    6.错误:
    Lex: aidl <= frameworks/base/tools/aidl/aidl_language_l.l
    /bin/bash: flex: command not found
    make: *** [out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_l.cpp] Error 127
    解决:
    sudo apt-get install flex

    7.错误:
    /usr/bin/ld: cannot find -lncurses
    collect2: ld returned 1 exit status
    make: *** [out/host/linux-x86/obj/EXECUTABLES/adb_intermediates/adb] Error 1
    解决:
    sudo apt-get install lib32ncurses5-dev

    8.错误:
    prebuilt/linux-x86/sdl/include/SDL/SDL_syswm.h:55: fatal error: X11/Xlib.h: No such file or directory
    compilation terminated.
    make: *** [out/host/linux-x86/obj/EXECUTABLES/emulator_intermediates/android/main-common.o] Error 1
    解决:
    sudo apt-get install libx11-dev

    9.错误:
    sh: gperf: not found
    calling gperf failed: 32512 at ./makeprop.pl line 96.
    make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h] Error 25
    make: *** Deleting file out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/WebCore/css/CSSPropertyNames.h'
    解决:
    sudo apt-get install gperf

    致命错误: bits/predefs.h:没有那个文件或目录 编译中断

    解决方法:
    sudo apt-get install gcc-multilib

    还有一个原因:

    Ubuntu 11.10以上的gcc版本是4.6.1,版本太高,编译android时出错,要把gcc版本改为4.4.3

    sudo apt-get install gcc-4.4
    sudo apt-get install g++-4.4

    总结错误

    1.错误

    host Executable: aapt (out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt)
    /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.so when searching for -lz
    /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../libz.a when searching for -lz
    /usr/bin/ld: skipping incompatible //usr/lib/libz.so when searching for -lz
    /usr/bin/ld: skipping incompatible //usr/lib/libz.a when searching for -lz
    /usr/bin/ld: cannot find -lz
    collect2: ld returned 1 exit status
    make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/aapt] Error 1

    解决办法:

    缺少lib32z1-dev,安装即可:apt-get install lib32z1-dev

    2.错误
    编译时出现 /usr/include/gnu/stubs.h:7: fatal error: gnu/stubs-32.h: No such file or directory 错误信息
    /usr/include/gnu/stubs.h:7: fatal error: gnu/stubs-32.h: No such file or directory
    compilation terminated.
    make: *** [out/host/linux-x86/obj/EXECUTABLES/acp_intermediates/acp.o] Error 1
    解决办法:

    缺少libc开发包,安装即可: apt-get install libc6-dev-i386

    3.错误
    Android编译遇到错误/usr/bin/ld: cannot find -lstdc++的解决
    解决办法:

    缺少g++-multilib库,安装即可: apt-get install g++-multilib 

    最后发现的一个错误:

    make android 时的 libwebcore.so error

    解决办法:增加文件swap

    参考:http://www.linuxidc.com/Linux/2016-01/127289.htm 

    好吧在这上面的工作都做完了,错误也都解决了,编译也完成了,我是在晚上进行编译的,第二天好了,当看到结果的时候真的很开心:

    Target system fs image:    out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img
    Install system fs image: out/target/product/generic/system.img
    Target ram disk: out/target/product/generic/ramdisk.img
    Target userdata fs image: out/target/product/generic/userdata.img
    Installed file list: out/target/product/generic/installed-files.txt

    那么下面就运行一下编译的结果吧:

    1. 设置环境变量:
    USER-NAME@MACHINE-NAME:~/Android$ export PATH=$PATH:~/Android/out/host/linux-x86/bin  
    USER-NAME@MACHINE-NAME:~/Android$ export ANDROID_PRODUCT_OUT=~/Android/out/target/product/generic
    其中,~/Android/out/host/linux-x86/bin有我们要执行的emulator命令,而~/Android/out/target/product/generic是Android镜像存放目录,下面执行emulator命令时会用到。
    2. 运行模拟器。
    USER-NAME@MACHINE-NAME:~/Android$ emulator
    模拟器运行需要四个文件,分别是Linux Kernel镜像zImage和Android镜像文件system.img、userdata.img和ramdisk.img。执行emulator命令时,如果不带任何参数,则Linux Kernel镜像默认使用~/Android/prebuilt/android-arm/kernel目录下的kernel-qemu文件,而Android镜像文件则默认使用ANDROID_PRODUCT_OUT目录下的system.img、userdata.img和ramdisk.img,也就是我们刚刚编译出来的镜像问题。
    当然,我们也可以以指定的镜像文件来运行模拟器,即运行emulator时,即:
    USER-NAME@MACHINE-NAME:~/Android$ emulator -kernel ./prebuilt/android-arm/kernel/kernel-qemu -sysdir ./out/target/product/generic -system system.img -data userdata.img -ramdisk ramdisk.img

    但是又来了一个错误:

    emulator: ERROR: You did not specify a virtual device name, and the system
    directory could not be found.
    If you are an Android SDK user, please use '@<name>' or '-avd <name>'
    to start a given virtual device (see -help-avd for details).
    Otherwise, follow the instructions in -help-disk-images to start the emulator

    解决方法:

    进入到Android源码目录中执行:

    source build/envsetup.sh

    lunch sdk-eng

    然后再执行:

    emulator

    可以启动模拟器

    参考:http://www.linuxidc.com/Linux/2016-01/127290.htm 

    再次运行,好吧有结果了:

    编译完Android源码之后,写还得再来看看如何编译Android内核源码,为什么要编译Android内核源码呢?这个是为了后续的工作做准备,后面会说到的,其实我们上面编译的Android源码他的内核源码Google已经编译好了,存放在:源目录/prebuilt/android-arm/kernel/kernel-qemu;

    下面我们就来看看如何编译内核源码吧,同样如此,想编译内核源码的话,我们需要内核源码,又是一件痛疼的事,网上有很多资源都是说使用goldfish版本的,然后就去:git clone http://android.googlesource.com/kernel/goldfish.git
    反正我是下载失败,原因和下载源码是一样的,google服务器连接失败,那怎么办呢?
    当时我是没有办法了,就去各种搜索,结果有人说goldfish是连接不上了,有人将内核源码放到github上了,地址如下:
    https://github.com/android/kernel_common

    如果下载失败的话,我已经下载好了,可以去以下的连接去下载: 链接: http://pan.baidu.com/s/1dEq7SiP 密码: fach

    我就去下载了,大约几百M吧,下载下来之后,就进行编译吧,在编译之前我们需要修改点东西:

    修改文件夹中的Makefile文件中的编译环境

    ARCH ?= (SUBARCH)
    CROSS_COMPILE ?=

    修改成
    ARCH ?= arm
    CROSS_COMPILE ?= arm-eabi-

    如图:

    采用的是arm体系结构,交叉编译使用的是arm-eabi-XXX工具,这个值只是个前缀

    下面我们就来编译吧,进入到文件夹中进行编译结果发现,说找不到指定的arm-eabi-gcc工具(这个错误发生在我编译Android4.4版本的时候,因为这个版本的源码中找不到指定的prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin目录,但是最后编译Android2.3.7版本的话就有了,所以针对于4.4版本没有的话,我们怎么办呢?

    下载地址

    ------------------------------------------分割线------------------------------------------

    FTP地址:ftp://ftp1.linuxidc.com

    用户名:ftp1.linuxidc.com

    密码:www.linuxidc.com

    在 2016年LinuxIDC.com1月编译Android系统源码和内核源码

    下载方法见 http://www.linuxidc.com/Linux/2013-10/91140.htm

    ------------------------------------------分割线------------------------------------------

    下载下来之后一般是存放到/usr/lib目录中,然后修改一下环境变量,这个可以参考前面配置JDK环境变量的方法

    首先需要:make goldfish_defconfig

    但是找不到指定文件,发现这个文件只在goldfish版本中,而我们下载的是kernel_common,这时候我们可以:

    make menuconfig

    然后选择对应的配置,但是问题又来了,哪些选项是必选的,哪些是不需要选的,反正最后编译总是失败,搞伤的了,所以还是得去找goldfish版本的(我上面之所以介绍了kernel_common版本的,就是记录一下我操作的过程,虽然最后失败了),不过运气挺好的,最后还真的被我找到了,具体的地址我记得不太清楚了,但是我放到网盘了,里面有相应的说明,goldfish下载地址:

    链接: http://pan.baidu.com/s/1dEq7SiP 密码: fach

    下载下来之后,可以编译了,

    make goldfish_defconfig

    然后

    make

    这个编译的过程很快,不到一个小时吧

    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready

    这样就编译成功了,那么我就是用这个内核镜像来启动模拟器吧:

    1. 在启动模拟器之前,先设置模拟器的目录到环境变量$PATH中去:
    USER-NAME@MACHINE-NAME:~/Android$ export PATH=$PATH:~/Android/out/host/linux-x86/bin
    2. 设置ANDROID_PRODUCT_OUT环境变量:
    USER-NAME@MACHINE-NAME:~/Android$ export ANDROID_PRODUCT_OUT=~/Android/out/target/product/generic
    3. 在后台中指定内核文件启动模拟器:
    USER-NAME@MACHINE-NAME:~/Android$  emulator -kernel ./kernel/common/arch/arm/boot/zImage &

    不幸的是模拟器是可以启动但是总是黑屏,而且是用adb shell也连接不上设备,这可怎么办,都快成功了,然后就去网上再次找答案,找到了:原因是我的源码是4.4版本的,2.3版本以后的体系架构是用的是armv7了,所以不是:

    make goldfish_defconfig

    而是

    make goldfish_armv7_defconfig

    再次编译,成功再次是用镜像文件启动模拟器,草,傻眼了,结果还是失败太蛋疼了,然后各种搜索,原因上面的解答,但是我已经修改了,还是不行(这个问题纠结了两个礼拜,我差点就放弃了),最后想是不是源码的问题,也只能这么想了,所以又去晚上找2.3.7的源码,别说着了一天,真是不负有心人呀,还真的被我找到了,而且找到很多个版本,都是压缩包的形式,在这里我真心的要感谢这个人,懂得资源分享,

    Android2.3.7源码下载地址: http://www.linuxidc.com/Linux/2016-01/127285.htm  文件名为:Android_2.3.7.tar.gz

    然后我就很兴奋的重新编译了Android2.3.7版本的源码(其实我当时有点担心,因为我现在的系统是64位的,不知道这个源码是多少位的,但是最后编译成功了,这个版本是64位的,也就不需要重新换系统了),因为有了之前的编译过程,好多问题都提前解决了,编译过程中是很顺利的,也是在晚上编译的结果也是成功了,这次我们在通过上面的方式来编译内核,然后启动模拟器,擦,结果可以了:

    成功了,这次是真的成功了,好感动,好激动呀,两次挫折两次激动~~

    总结:其实我们可以回顾一下上面的过程,个人感觉没有任何技术可言,我遇到的最大的问题就是资源获取不到的问题,所以我将使用到的资源都给出了下载链接,同时感觉遇到问题不可以胆怯,要勇敢面对~~

    PS:上面的过程是我成功之后的感想和操作,如果亲们按照我这种方式不成功的话,请留言~~我会帮助看看~~

    注:这篇文章其实没什么内容,但是里面有很多相关资源的下载连接,这个真的很有价值的~~

    更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11

    本文永久更新链接地址http://www.linuxidc.com/Linux/2016-01/127291.htm

    linux
    https://www.linuxidc.com/Linux/2016-01/127291.htm
  • 相关阅读:
    html的URL参数传值问题
    html背景图片拉伸至全屏
    Laravel 用户验证Auth::attempt fail的问题
    HTML中meta的应用
    ubuntu升级php版本
    Laravel 目录结构分析
    css颜色渐变在不同浏览器的设置
    谷歌浏览器(Chrome)离线包的下载方法!
    RAD Studio 10 up1欢迎页证书不可用
    MySQL
  • 原文地址:https://www.cnblogs.com/pengmn/p/11456962.html
Copyright © 2020-2023  润新知