ubuntukylin 下编译 android4.4

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

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

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

前提条件:

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

2 网络条件:有google帐号,国内容易被墙,所以。。。

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

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

一.设置编译环境

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

也可以在虚拟机下编译android,但是你的机器至少有16gb内存,这个就不大现实了吧,一般人的机器还是没那么高配的,所以忽略不看。

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机,需要后面的加工才行.

原文地址:https://www.cnblogs.com/act262/p/3673706.html