zoukankan      html  css  js  c++  java
  • 编译Android系统源码和内核源码

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


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

    第一:我们知道Android系统是基于Linux开发的,所以我们想编译Android系统源码的话,就必须有一个Linux系统,这里我使用了Ubuntu 64位的系统,这个镜像文件的下载地址是:

    http://pan.baidu.com/s/1c0eUSYc

    安装Ubuntu系统不用说了吧,这种问题网上的资料多得很,因为篇幅可能很长,所以如果真的需要的话,请留言~~


    问题一:至于我为什么要使用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://blog.sina.com.cn/s/blog_76dbbd7e01018cm5.html

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


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


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

    http://blog.csdn.net/jiangwei0910410003/article/details/37997899

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

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


    注意:这里所说的源码问题不是指下载源码的问题,我会在最后面说一下现在如何能够得到相应的Android源码,反正从google上去下载我是不相信了。所以我提供了我已经下载好并且打成压缩包的连接,

    http://pan.baidu.com/s/1mgoNVGs


    只需要进行解压即可,关于解压缩Linux文件的话,可以查看另外一篇blog:

    http://blog.csdn.net/jiangwei0910410003/article/details/37997899


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

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

    首先需要安装JDK,请转战另外的一篇Blog:

    http://blog.csdn.net/jiangwei0910410003/article/details/37996723


    当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

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


    今天在Ubuntu11.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
    From:http://blog.csdn.net/offbye/article/details/6834285

    以上的错误总结参考:
    http://www.360doc.com/content/12/0602/16/6828497_215429231.shtml


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

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

    参考:
    http://blog.sina.com.cn/s/blog_6340cd9c0101e42h.html

    还有一个原因:

    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

    参考:http://blog.163.com/zhaolin53636848@126/blog/static/4908666820121993234837/


    总结错误:

    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  

    参考:http://www.mobiletrain.org/lecture/doc/android/2011-04/389.html


    最后发现的一个错误:

    make android 时的 libwebcore.so error

    解决办法:增加文件swap

    参考:
    http://blog.csdn.net/zhoukejun/article/details/4211108

    http://blog.163.com/tod_zhang/blog/static/1025522142013225112338311/


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

    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://blog.csdn.net/yf210yf/article/details/9206269


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



    编译完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/1pQzPs


    我就去下载了,大约几百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版本没有的话,我们怎么办呢,那还得去网上搜索这个工具,下载地址:
    http://download.csdn.net/download/storeage/4036993),下载下来之后一般是存放到/usr/lib目录中,然后修改一下环境变量,这个可以参考前面配置JDK环境变量的方法


    首先需要:make goldfish_defconfig

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

    make menuconfig

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

    http://pan.baidu.com/s/1qW0TkkO


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

    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://pan.baidu.com/s/1eQ9YT6i

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


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


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

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

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

  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/roccheung/p/5797337.html
Copyright © 2011-2022 走看看