ubuntukylin 下编译 android4.4

http://source.android.com/source/initializing.html 官网操做方法html

 

说明:本次是下载android4.4最新源码并编译的过程,java

环境:本次使用UbuntuKylin发布的长期支持系统14.04python

 

前提条件:linux

1 系统:Linux/ Ubuntu / Mac OS == (2.3.x以上必须使用64位),至少30GB 的硬盘存储空间,有可能达到100GB以上在编译中,其中源码下载后总共大约8.5GB ,android

2 网络条件:有google账号,国内容易被墙,因此。。。git

3 软件环境:jdk,git,python,curl,make, ==github

电脑配置越好,速度也就越快了-_-!shell

 

一.设置编译环境

 1 . 使用ubuntu 10.04版本以上,对以android 2.3.x以上的版本,必须使用64位的环境,比较老的则能够在32位环境下编译。ubuntu

也能够在虚拟机下编译android,可是你的机器至少有16gb内存,这个就不大现实了吧,通常人的机器仍是没那么高配的,因此忽略不看。api

2.安装JDK,最新的源码编译须要java7,固然也能够用6版本,可是最新的老是有好处的,因此就用7.由于版权问题,推荐在ubuntu下安装OpenJDK便可,固然也可使用标准oracle的JDK.  在终端下输入 sudo apt-get install openjdk-7-jdk ,输入密码,一路yes安装便可。

若是提提示成功,试下这个命令,那么才是真的成功了,

java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.6) (7u51-2.4.6-1ubuntu4)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)

3. 安装一些必要的工具

sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386

这里安装了一大批工具,可是可能会出错,

 

根据这两个出错的分开单独安装,直至所有安装成功为止.(不一样版本上须要安装有些不一样的,看官网)

 

生成软链接

sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1/usr/lib/i386-linux-gnu/libGL.so

4 设置缓存

 在当前用户目录下找到.bashrc写入 export USE_CCACHE=1

默认缓存目录为当前用户下的.ccache目录,通常使用默认便可,若是有特殊状况则设置缓存目录, export CCACHE_DIR=your_cache_dir

建议缓存大小为50~100GB 

当你下载玩所有源码后执行这句  prebuilts/misc/linux-x86/ccache/ccache -M 50G  

在4.0.x之前的 位置不一样,则执行 这个  prebuilt/linux-x86/ccache/ccache -M 50G

只有下载彻底后才能执行,在你的源码目录下才有这个工具执行

 

5.输出目录

默认下输出目录在你下载源码的子目录下 out

若是把输出目录设置为另一个不一样的盘,则编译速度会快不少,

export OUT_DIR_COMMON_BASE=your_out_dir

 

二.下载源码

1 下面是下载源码前的准备过程

新建一个目录用于存放下载用到的工具

mkdir ~/bin    在当前用户下新建一个bin目录

PATH=~/bin:$PATH    使用临时的path,能够在.bashrc中写入 下面这句永久生效

export PATH="$PATH:/home/user/bin/:."   没个之间使用:分开,最后一个是.表示当前目录

只要路径设置好了,无论你走到哪一个目录下都能执行路径下的命令

2 下载源码工具之repo

你们都知道通常源码是存放git上的,可是考虑到众多的android分支及各个功能,那是有一大堆git等着你去clone啊,那还不是要你的命,所以google把这些git地址写成了一个repo,其实里面也就是那些git地址了,只不过方便咱们使用.

正常状况下使用下面的这句

 curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

可是在china网络就是喜欢抽风,当失败时能够试下这个

curl http://git-repo.googlecode.com/files/repo-1.19 > ~/bin/repo

(我是用这个获得repo文件的,   git clone https://gerrit.googlesource.com/git-repo )

 

把文件下载到bin目录下,下载完成后 chmod a+~/bin/repo  增长可执行权限 ,能够试一下 输入repo命令,看输出就知道成功没.

3.新建目录用于存放源码的目录,进入该目录下

获取最新的版本  http://source.android.com/source/build-numbers.html 这里查看最新的版本对应的名字

repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2

出现了以下错误提示

别急,把你当前目录下的.repoconfig删除

rm -rf .repoconfig

https://android.googlesource.com/new-password 到这里验证一下你的身份,把获得的以machine 两行开始的 复制保存为.netrc ,(有个点,表示为隐藏的文件)保存到你的目录下,

再次执行(中间加了个/a  )

repo init -u https://android.googlesource.com/a/platform/manifest -b android-4.4.2_r2   (下载原生的android)

若是仍是提示什么公钥错误的话,那就多是那个repo的问题了,须要下载个最新的稳定版本,我就是这个搞得头痛的

!-_-    用这个clone过来,而后把repo文件放到bin下,  (git clone https://gerrit.googlesource.com/git-repo)

若是是下载CM11的话就用

cm_repo 下载,用法和上面的同样,只是区分了命名而已,且这个不用那么麻烦

cm_repo  init -u git://github.com/CyanogenMod/android.git -b cm-11.0  (下载CM的源码)

等待完成

4 正式开始下载源码中

先用这个脚本保存到前面那个bin目录下,加执行权限

download.sh

 #!/bin/bash     

    echo "======start repo sync======"     

    repo sync     

    while [ $? == 1 ]; do     

    echo "======sync failed, re-sync again======"     

    sleep 3     

    repo sync     

    done 

 用这个shell代替直接使用repo sync,这个网络问题很容易出问题,须要不停的操做,因此这个shell就能够解决问题了

 能够查看下载了那些,在咱们下载源码的目录下有个隐藏的文件夹 .repo

里面就是存放了一大堆文件了(大可能是带有.git的文件),等到下载彻底后它会自动把这些文件移动到咱们下载源码的根目录下,这时就能够显示所有内容了.

用上一天半天的时间,让机子下载去吧.

...............................................

下载了一个晚上了,已经下载彻底了

下载完后能够校验一下

执行  gpg --import

而后把这个复制进去

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version:GnuPG v1.4.2.2(GNU/Linux)

mQGiBEnnWD4RBACt9
/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF
+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG
+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL
+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA
/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b
/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20
+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT
+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk
/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb
/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL
/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj
+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK
+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c
/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm
/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM
/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT
+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----

而后 ctrl + D结束,提示成功导入

执行校验   git tag -v TAG_NAME

最后看看下载后的大小

.repo 下占用了 27.4GB,也就是源码总共占据了大约9GB左右,还好硬盘够大,否则还真吃不消,这些还没包括输出的和缓存文件呢.按理来讲那个.repo应该也没那么大啊,我只clone一个最新的版本啊,发现.repo/project-objects目录很大,和咱们源码跟目下同样..

 

所有目录

 

 不要忘了,这是应该设置一下缓存大小!

 

三. 开始编译工做

1.初始化脚本  source build/envsetup.sh  或者  . build/envsetup.sh (注意.后面有空格)

2.开始编译源码,注意根据你的电脑cpu来选择最佳的参数以获得最快的编译速度,N = 你的核心数乘以1或者2

个人是4核4线程的,我就用  make -j8  

出现了一下的各类毛病

提示不能用OpenJDK编译,这不是很奇葩么,官网说了用的OpenJDK,到编译这不就死了,仍是老老实实的装上Oracle的JDK6吧,

而后又遇到了  OSError: [Errno 2] No such file or directory make: *** [/home/odexcide/android-4./out/target/product/generic/obj/GYP/shared_intermediates/ui/gl/jni/Surface_jni.h]

GG了一下,找到答案了,须要设置一个javap的软链接到/usr/bin/目录下

 再次make 而后又遇到了  Too many levels of symbolic links

删除刚才创建的软链接,使用绝对路径来创建软链接

如今就等编译完成了..~~

========================== 漫长时间=========================

大约过了1个小时,编译完成了,听说是第一次编译时间比较久,果然如此,须要彻底编译一遍,

最终生成的文件在 这里 /source/out/target/product 能够看到一些.img文件了.

这时直接执行emulator就能够运行咱们编译好的了,若是不当心关闭了前面使用的窗口则会不能使用

我就是这样 ,由于编译完后感受系统很慢,因此就注销了一下,回来发现不能执行,GG之,应该是路径问题致使的

因此从新设置编译一下过程,时间很短(确保和前面编译时选择参数一致),没有什么改变的话编译速度是很快的

.编译完后就能够执行 了

上结果图

 

好了,编译运行成功了,但这只是什么都没作的编译,只适合nexus系列的手机,不适合咱们的X机,须要后面的加工才行.