本文为原创,转载请注明出处:http://blog.youkuaiyun.com/helloaugust11/article/details/20568671
写给想深入理解android的android开发爱好者。每个android开发爱好者,手头至少要有一份完整的Android源码,不管哪个版本。今天我给广大android开发人员推荐的是
Android4.4的源码下载和编译的全过程,解析的很详细包括了每个步骤和下载编译出错的解决方案。
该博客主要挑重点叙述,更详细,详细的内容我已经写好了一个文档,下载阅读就ok。
文档下载地址:http://download.youkuaiyun.com/detail/yxchen0811/6995527
首先android4.4源码的下载步骤:
1. 安装下载的客户端
$ sudo apt-get install curl
$ sudo apt-get install git-core
2. 创建一个~/bin目录,并添加到环境变量中
$ mkdir ~/bin
$ PATH=~/bin:$PATH
3. 下载repo脚本且修改他的权限为可执行
$ curl http://git-repo.googlecode.com/files/repo-1.13 > ~/bin/repo
$ chmod a+x ~/bin/repo
4. 创建一个保存android源码的目录,修改为最大权限且进入到该目录下
$ /home/august/android4.4
$ sudo chmod –R 777 /home/august/android4.4
$ cd /home/august/android4.4
PS:由于android下载过程中有个.repo的隐藏目录,这个目录很大(12G),下载到其他分区,估计硬盘不够用,如果你按照我前面的教程安装的虚拟机只有下载到home目录下才能下载完。创建目录时目录中的august是我本人的英文名。读者可以根据自己的喜好随便命名,这里是允许自由发挥的,除了这好像没有其他的,如果想一次成功,就需要按照我的步骤一步一步来。
5. 初始化repo客户端,选择将要下载的android版本
$ repo init -u https://android.googlesource.com/platform/manifest
PS:输入回车后,可能会看到需要你输入你的姓名和邮箱,姓名可以随便输入,但是邮箱最好是可用的且最好是gmail的邮箱,原因我也不清楚,网上这么说的。
6. 上面的所有工作都弄完成后,就开始下载源码了
$ repo sync
下载代码就这么简单,总共就6个步骤,其中还有个步骤是创建个文件夹,整个下载过程出奇的简单,但是这小6个步骤可能会折腾你好长时间。需要你不停的解决错误,不停的repo sync。哈哈,这个单词我在命令行敲了不下100遍,这个后面会讲到,可以使用个脚本让计算机自己来重复的执行这个操作,人类真是太聪明了,我不得不佩服啊。还是回到下载源码让我们痛苦的错误上来,你解决了这些问题,就可以安心的睡觉,明天早上起来看看是否已经成功下载完成。
出现的第一个问题是repo客户端的问题,提示什么,按照他的提示输入什么就ok了是不是很简单。
Q:“A new repo command ( 1.18) is available”
A: 按照提示输入就可以了,cd /home/august/android4.4/.repo/repo/repo /home/august/bin/repo
Q: 出现类似提示 Cannotfetch platform/tools/motodev Fetchingprojects: 3% (7/228) fatal: Not a git repository fatal: HTTP request failed error: RPC failed; result=56, HTTP code =200B fatal: The remote end hung upunexpectedly fatal: early EOF fatal: index-pack failed
A: 编辑/etc/hosts文件 在文件末尾增加
74.125.31.82 www.googlesource.com
74.125.31.82 android.googlesource.com
203.208.46.172 cache.pack.google.com
59.24.3.173 cache.pack.google.com
添加完这些源后(好像这样表述是不对),重新回到命令行输入 repo sync
当有一天你看到命令行出现如下所示的字样时,表示你已经下载完android4.4的所有代码了,你应该兴奋了,我终于下载完了。
避免多次重复输入repo sync,写一个脚本,执行脚本就ok了。脚本很简单,这里也给出脚本的源码。
#! /bin/bash
echo "=====start repo sync======"
/home/august/android4.4/repo sync
while [ $? = 1 ]; do
echo “======sync failed, re-sync again======”
sleep 3
/home/august/android4.4/repo sync
done
到这里下载源码的过程就结束了,但是这个下载的工程确实很漫长,需要你有足够的耐心。下载源码必须要确保你的磁盘够大,这个主要是针对一些已经安装好虚拟机的读者,因为你没有按照我的教程说的步骤操作,可能会出现下载的过程中硬盘不够用。下载中由于.repo目录很大,需要的空间在25G左右才能顺利的下载完成android4.4.
编译android4.4源码
源码下载完后,还有个比较重要的环节没有完成,当然是Android的编译了。可能由于版本的原因,每个版本的编译还略有点不一样。比如以前我编译4.2的时候需要gcc和g++的版本都要比ubuntu12.04带的要低,所以要进行一次降级处理,但是编译4.4的代码不需要降级,编译版本可能还是有点不一样吧,但是大体还是相同的。下面就进入编译的环节以及出现的错误解决方案。
编译比下载时需要输入的命令还更少,但是编译出现的错误却比下载出现的错误要更多,且耗时也较长,这个我记录下我的编译时间(CPU采用4核8线程)
17:35 2014/2/22 start build
19:16 2014/2/22 end build
编译android的步骤如下:
1. 初始化编译环境
$ source build/envsetup.sh
2. 选择需要编译的版本类型
$ lunch full-eng
3. 编译源码
$ make –jN
PS:N表示的是你创建虚拟机时cpu核心数,比如我的上图虚拟机的核心数为8,所以命令为 $ make –j8。即采用8核来编译源码。
编译就这么简单,就这3步骤,遇到的问题也会很多。下面将是遇到的问题按照先后顺序解答,读者也按照这个顺序,因为这个顺序是编译能通过的。
1. Executing the followingcommands would install ia32-libs multiarch package.
Answer:
sudo apt-get update
sudo apt-get installia32-libs-multiarch:i386
PS: 此过程很慢,ubuntu下网速不好,下载耗时接近2个小时,耐心等待。
2. /bin/bash: flex: command notfound
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:In function ‘int yyparse()’:
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1827:warning: deprecated conversion from string constant to ‘char*’
out/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cpp:1970:warning: deprecated conversion from string constant to ‘char*’
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
Answer:
sudo apt-get install flex
PS:此过程大概3分钟
3. /bin/bash: xmllint: command notfound
Answer:
sudo apt-get install libxml2-utils
PS:此过程大概3分钟
4. gcc: error trying to exec'cc1plus': execvp: No such file or directory
Answer:
sudo apt-get install g++
PS:此过程5分钟
5. sh: gperf: not found
target Generated: libwebcore <=external/webkit/Source/JavaScriptCore/create_regex_tables
Generating CSSPropertyNames.h <=CSSPropertyNames.in
sh: gperf: not found
calling gperf failed: 32512 at./makeprop.pl line 140.
make: ***[out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/css/CSSPropertyNames.h]Error 25
make: *** Deleting file`out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/css/CSSPropertyNames.h'
Answer:
sudo apt-get install gperf
PS:此过程不到1分钟
6. /bin/bash: bison: command notfound
Yacc: aidl <=frameworks/base/tools/aidl/aidl_language_y.y
bison -d -oout/host/linux-x86/obj/EXECUTABLES/aidl_intermediates/aidl_language_y.cppframeworks/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
Answer:
sudo apt-get install bison
PS:此过程很快1分钟内
解决了上面的所有的问题,基本能顺利的一次通过android4.4源码的编译。这时候你需要等待的时间大概2个小时左右。
编译成功
编译成功之后,会在out/target/product/generic下面看到system.img, ramdisk.img, userdata.img
如果在该目录下没有看到上面的3个img文件,说明编译没有成功。需要重新检查编译出现的问题。
运行模拟器
$ emulator
源码编译成功后,生成的system.img就是可以刷机用的system。这里我们采用命令来启动模拟器,看看Android4.4的庐山真面目。
运行命令后可能会出现一个ERROR:
Q:No command'emulator' found, did you mean:Command 'qemulator' from package 'qemulator'(universe) emulator: command not found
A:重新运行以下命令:
source build/envsetup.sh
lunch full-eng
emulator
运行上面的命令后能顺利的启动模拟器,下面是启动模拟器的截图:
至此,整个Android源码,下载和编译都完成了,你可以自由定制修改android代码,实现自己的私人定制Android ROM,同时你也查看源代码,和Google大神近距离的接触,体会和感受Google大神是怎样书写高质量的代码。
更详细的文档图文并茂解析下载和编译的全过程,请点击下载该文档:http://download.youkuaiyun.com/detail/yxchen0811/6995527
本文为原创,转载请注明出处:http://blog.youkuaiyun.com/helloaugust11/article/details/20568671