[日期: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.com\1月\编译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

https://www.linuxidc.com/Linux/2016-01/127291.htm

编译Android系统源码和内核源码的更多相关文章

  1. 【转】编译Android系统源码和内核源码

    原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...

  2. FW 编译Android系统源码和内核源码

    编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...

  3. Android源码和内核源码的下载,编译和执行

    笔者依据罗升阳老师的<Android 系统源码情景分析>一书,尝试下载,编译和执行Android源码和内核源码.但可能是软件源"被墙"或版本号更新的原因.期间遇到诸多问 ...

  4. 编译Android 4.4.4 r1的源码刷Nexus 5手机详细教程

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54562606 网上关于编译Android源码的教程已经很多了,但是讲怎么编译And ...

  5. 自己编译Android(小米5)内核并刷入(一键自动编译打包)

    之前自己编译过Android系统,刷入手机.编译很简单,但坑比较大,主要是GFW埋的坑.. 编译android系统太大了,今天记下自己编译及刷入android内核的方法. 主要是看到第三方内核可以超频 ...

  6. [原创]Android系统中常用JAVA类源码浅析之HashMap

    由于是浅析,所以我只分析常用的接口,注意是Android系统中的JAVA类,可能和JDK的源码有区别. 首先从构造函数开始, /** * Min capacity (other than zero) ...

  7. JDK版本更换后编译android系统出错

    一:javac: 目标发行版 1.5 与默认的源发行版 1.7 冲突 1.设置jdk环境变量 编译android源码只支持jdk 1.6,所以如果需要编译源码必须下载jdk 1.6,不能下载最新的jd ...

  8. 编译Android系统源码(高通平台)

    在Android源码根目录执行下面命令 source build/envsetup.sh choosecombo make –j4 其他命令(首先需要在android源码根目录执行source bui ...

  9. 单独编译Android系统模块并替换进系统

    例如,我修改了frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java文件,进入frame ...

随机推荐

  1. Oralce常用系统函数

    dual:Oracle系统内部提供的一个用于实现临时数据计算的特殊表,它只有一个列DUMMY (VARCHAR2(1)) 字符类函数: concat--连接字符串 initcap--每个单词首字母大写 ...

  2. 洛谷P2387 [NOI2014]魔法森林(LCT)

    魔法森林 题目传送门 解题思路 把每条路按照\(a\)的值从小到大排序.然后用LCT按照b的值维护最小生成树,将边按照顺序放入.如果\(1\)到\(n\)有了一条路径,就更新最小答案.这个过程就相当于 ...

  3. 有根树的表达 Aizu - ALDS1_7_A: Rooted Trees

    有根树的表达 题目:Rooted Trees Aizu - ALDS1_7_A  A graph G = (V, E) is a data structure where V is a finite ...

  4. 转 LoadRunner错误处理函数

    在脚本的Run-time Settings中,可以设置在脚本运行过程中发生错误的处理方式.进入到Run-time Settings中,切换到Miscellaneous标签页,可以看到Error Han ...

  5. Dubbo 系列(07-3)集群容错 - 负载均衡

    目录 Dubbo 系列(07-3)集群容错 - 负载均衡 Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 1.1 负载均衡算法 1.2 继承体系 2. 源码分析 ...

  6. this.$router.push相关的vue-router的导航方法

    this.$router.push相关的vue-router的导航方法:https://blog.csdn.net/zeroyulong/article/details/80312750

  7. CSS学习笔记(基础部分)

    一.CSS 简介: CSS 指层叠样式表 (Cascading Style Sheets),用来设置HTML的格式. 语法:选择器 {属性:值;属性:值} 注释://注释内容 /*注释内容*/ 二.C ...

  8. microtime函数用法

    /** * microtime函数 * 返回:如果参数为空,则返回字符串 "微妙部分(单位:秒) 秒",字符串的两部分都是以"秒"为单位返回的 * 如果参数为 ...

  9. 深入Spring:自定义IOC

    前言 上一篇文章讲了如何自定义注解,注解的加载和使用,这篇讲一下Spring的IOC过程,并通过自定义注解来实现IOC. 自定义注解 还是先看一下个最简单的例子,源码同样放在了Github. 先定义自 ...

  10. ionic3配合使用docker build代码时的显示仓库配置问题

    1.未配置前的报错提示: 会一直提示push失败 2.在/etc/docker目录下新建 daemon.json文件,内容为: { "insecure-registries":[& ...