下载android4.0源代码和kernel及编译

来源:互联网 发布:剪切音乐的软件 编辑:程序博客网 时间:2024/06/06 13:13

下载android源代码及编译及遇到的问题:


最新的android4.0源代码公布以后,相信很多人和我一样都跃跃欲试,其实4.0的代码下载和编译和以前的版本差不多,但是有一些小的差别,写下来供不明真相的新手来参考

首先,开发环境,google建议在ubuntu10.0.4下,并且最好是64位,既然是为了工作和学习,就尽量按照官方要求的来吧。

Python 2.5 -- 2.7  ubuntu10.0.4已经默认安装了,所以不需要安装,其他环境需要安装

JDK 6   编译4.0需要jdk 6 ,sdk的编译需要jdk 5

Git 1.7 or newer

如果你的ubuntu是32位的,请在源码下载后编译前按以下步骤修改:(注:以前需要改下面,现在不需要了,可以直接编译,google好像做了32位,64位都可以编译了)

下载完源码后,修改下面四个文件:external/clearsilver/cgi/Android.mk
                                                            external/clearsilver/java-jni/Android.mk
                                                           external/clearsilver/util/Android.mk
                                                          external/clearsilver/cs/Android.mk

将其中的 LOCAL_CFLAGS += –m64
                LOCAL_LDFLAGS += –m64

修改为    LOCAL_CFLAGS += –m32
               LOCAL_LDFLAGS += –m32

在build/core/main.mk

找到  ifneq (64,$(findstring 64,$(build_arch)))

将其修改为 ifneq (i686,$(findstring i686,$(build_arch)))

如果你装的ubuntu是最新的11.04打头的,由于内核版本的bug可能会在编译的最后出现头文件丢失的错误比如:image_thumb,请按照以下方法修复:

repo download platform/external/qemu 22776/1  如果你是10.0.4就不要做多余的事情了,如果你修复了,编译出的版本可能会出现黑屏现象进入不了系统,切记!

编译的环境不同,碰到的问题也会千奇百怪,如果你编译出问题了请养成google和百度的习惯

  1:jdk的安装比较简单,就不做介绍了

  2:安装依赖库:

        64-bit:

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \  libxml2-utils xsltproc
32-bit
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \  zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev \  libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown \  libxml2-utils xsltproc

     On Ubuntu 10.10:

    $ sudo ln -s /usr/lib32/mesa/libGL.so.1 /usr/lib32/mesa/libGL.so

     On Ubuntu 11.10:

    $ sudo apt-get install libx11-dev:i386
 3:下载Repo
$ mkdir ~/bin $ PATH=~/bin:$PATH
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo

4: 创建源码目录:

$ mkdir ANDROID_SOURCE
$ cd ANDROID_SOURCE
5: 获取git上的android源码版本
$ repo init -u https://android.googlesource.com/platform/manifest
我们下载最新版
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1
此时需要你填写用户名和email
image
填写后即可执行同步命令
6:下载源码
$ repo sync
可加参数: -jx x代表开启多少个线程来下载源码
源码+repo  一共13G左右(因为repo会自动执行check out 命令)
如果中间出错或者网络不稳定,可以重新初始化repo,用同一个email即可实现本地git库和服务器git库的同步
编译源码下载完源码后进入源码主目录 
1 :执行:
$ source build/envsetup.sh
souce命令执行的是源码包build目录下的envsetup文件
image
可以看出这个文件里定义了很多函数供编译使用
function help()function get_abs_build_var()function get_build_var()function check_product()function check_variant()function setpaths()function printconfig()function set_stuff_for_environment()function set_sequence_number()function settitle()function choosetype()function chooseproduct()function choosevariant()function tapas()function choosecombo()function print_lunch_menu()function lunch()function gettopfunction m()function findmakefile()function mm()function mmm()function croot()function pid()function gdbclient()function jgrep()function cgrep()function resgrep()function getprebuiltfunction tracedmdump()function runhat()function getbugreports()function startviewserver()function stopviewserver()function isviewserverstarted()function smoketest()function runtest()function runtest_py()function godir ()
2:选择一个target
$ lunch full-eng
image
我们编译后在模拟器中运行,所以选择full
image
我们选择最大的权限,也就是root后的版本,所以选择eng
3:编译源码
$ make -j4
过程大概3小时
编译完后在源码目录下会生成out文件夹如图
image
好了,可以检验以下我们编译的源码是否正常运行了
$ emulator
如果提示找不到命令,请初始化环境
$ source build/envsetup.sh$ lunch full-eng
image
 
下载的过程中可能遇到的问题:   报错:
  1. Exception in thread Thread-3:  
  2. Traceback (most recent call last):  
  3.   File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner  
  4.   self.run()  
  5.   File "/usr/lib/python2.6/threading.py", line 484, in run  
  6.   self.__target(*self.__args, **self.__kwargs)  
  7.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/subcmds/sync.py", line 200, in _FetchHelper  
  8.   clone_bundle=not opt.no_clone_bundle)  
  9.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/project.py", line 978, in Sync_NetworkHalf  
  10.   and self._ApplyCloneBundle(initial=is_new, quiet=quiet):  
  11.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/project.py", line 1519, in _ApplyCloneBundle  
  12.   exist_dst = self._FetchBundle(bundle_url, bundle_tmp, bundle_dst, quiet)  
  13.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/project.py", line 1583, in _FetchBundle  
  14.   raise DownloadError('%s: %s ' % (req.get_host(), str(e)))  
  15. DownloadError: android.googlesource.com: <urlopen error [Errno 110] Connection timed out>    
  16. ...  
[plain] view plaincopy
  1. Exception in thread  
  2.  Thread-3:  
  3. Traceback (most recent call last):  
  4.   File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner  
  5.   self.run()  
  6.   File "/usr/lib/python2.6/threading.py", line 484, in run  
  7.   self.__target(*self.__args, **self.__kwargs)  
  8.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/subcmds/sync.py", line  
  9.  200, in _FetchHelper  
  10.   clone_bundle=not opt.no_clone_bundle)  
  11.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/project.py", line 978,  
  12.  in Sync_NetworkHalf  
  13.   and self._ApplyCloneBundle(initial=is_new, quiet=quiet):  
  14.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/project.py", line   
  15. 1519, in _ApplyCloneBundle  
  16.   exist_dst = self._FetchBundle(bundle_url, bundle_tmp, bundle_dst,   
  17. quiet)  
  18.   File "/home/haili/android-4.0.4_r1.2/.repo/repo/project.py", line   
  19. 1583, in _FetchBundle  
  20.   raise DownloadError('%s: %s ' % (req.get_host(), str(e)))  
  21. DownloadError: android.googlesource.com: <urlopen error [Errno 110]   
  22. Connection timed out>    
  23. ...  

看这出错很莫名,Python是正确安装了的,版本也是要求的。其实官网(http://source.android.com/source/downloading.html)有段说明,如果认真执行就可解决。

1. 浏览器登录https://android.googlesource.com/new-password,并用gmail帐号登录;

2. 点击网页上的“允许访问”,得到类似:

  1. machine android.googlesource.com login git-<userName>.gmail.com password <password>  
  2. machine android-review.googlesource.com login git-<userName>.gmail.com password <password>  
[plain] view plaincopy
  1. machine  
  2.  android.googlesource.com login git-<userName>.gmail.com password   
  3. <password>  
  4. machine android-review.googlesource.com login   
  5. git-<userName>.gmail.com password <password>  

的信息。

3. 把上面那段信息(<userName>和<password>用自己得到的真实信息)追加到~/.netrc文件结尾;

4. 下载地址的URI更改为https://android.googlesource.com/a/platform/manifest(中间加上了“/a”)。

然后按照官网描述的正常步骤操作,即可拉下Android源码。官方的说法是:因为访问基本是匿名的,为了防止连接过多,对同一IP地址的连接数做了一定的限制。看来是用gmail帐号进行认证。

这样的话,在公司网络内或者用虚拟机下载的话,会经常遇到这问题。

编译遇到的问题:

问题如下:
[java] view plaincopy
  1. Install: out/host/linux-x86/framework/droiddoc.jar  
  2. target Generated: libclearsilver-jni <= out/host/common/obj/JAVA_LIBRARIES/clearsilver_intermediates/javalib.jar  
  3. host C: libclearsilver-jni <= external/clearsilver/java-jni/j_neo_util.c  
  4. In file included from /usr/include/features.h:378,  
  5.                  from /usr/include/string.h:26,  
  6.                  from external/clearsilver/java-jni/j_neo_util.c:1:  
  7. /usr/include/gnu/stubs.h:9:27: error: gnu/stubs-64.h: 没有那个文件或目录  
  8. make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libclearsilver-jni_intermediates/j_neo_util.o] 错误 1  


解决办法:
[java] view plaincopy
  1. sudo apt-get install lib64z1-dev libc6-dev-amd64 g++-multilib lib64stdc++6  




下载android kernel及编译:


第一步:下载goldfish源码

在Android源码根目录下新建kernel文件夹

  1. $mkdir kernel  
  2. $cd kernel  
[html] view plaincopy
  1. $mkdir  
  2.  kernel  
  3. $cd kernel  
下载源码:
  1. $git clone http://android.googlesource.com/kernel/goldfish.git   
[html] view plaincopy
  1. $git  
  2.  clone http://android.googlesource.com/kernel/goldfish.git   

下载完毕如下图:

此时在kernel目录下会生成一个goldfish文件夹。进入此目录:

  1. $cd goldfish  
[html] view plaincopy
  1. $cd  
  2.  goldfish  

此目录下有一个隐藏的目录.git,通过
  1. $ls -al  
[html] view plaincopy
  1. $ls  
  2.  -al  

可看到此目录:


查看所有分支:

  1. git  branch -a  
[html] view plaincopy
  1. git  
  2.   branch -a  
如下图:


check out:

  1. $git checkout remotes/origin/android-goldfish-2.6.29  
[html] view plaincopy
  1. $git  
  2.  checkout remotes/origin/android-goldfish-2.6.29  


此时你会看到goldfish目录下会出现很多文件

  1. $ls  
[html] view plaincopy
  1. $ls  

 这个时候goldfish源码就已经下下来了,接下来的事情就是编译了.


第二步:编译goldfish

导出交叉编译工具目录到$PATH环境变量中去.

  1. export PATH=$PATH:~/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin  
[html] view plaincopy
  1. export  
  2.    
  3. PATH=$PATH:~/WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin  

我们将使用上述这个目录下的交叉编译器arm-eabi-gcc

然后在glodfish目录下用gedit打开Makefile文件,找到这两行文字:

 # ARCH

?= (SUBARCH)

 # CROSS_COMPILE?=
修改为:
ARCH ?= arm
CROSS_COMPILE     ?= arm-eabi-
  1. $gedit Makefile  
[html] view plaincopy
  1. $gedit  
  2.  Makefile  

注意:ARTH ?=arm,的arm后边不要有空格,不然就会出现如下类似错误:
Make:...../kernel/goldfish/arch/arm: Is a directory.  Stop.
害我白白浪费了几个小时.

上述操作的目的是为了指定目标设备的体系架构和交叉编译器,其实也可以通过以下指令来完成:
  1. $ export ARCH=arm  
  2. $ export SUBARCH=arm  
  3. $ export CROSS_COMPILE=arm-eabi-  
[plain] view plaincopy
  1. $   
  2. export ARCH=arm  
  3. $ export SUBARCH=arm  
  4. $ export CROSS_COMPILE=arm-eabi-  


为了确保环境参数正确,接下来执行下面两条指令,否则有可能不能正常启动模拟器.(注:以下两条指令是在Android源码根目录下执行)
  1. $ source build/envsetup.sh  //缺少这条指令,可能会导致无法编译通过  
  2. $ lunch full-eng            //缺少这条指令,可能会导致无法启动模块器,系统报无法找到AVD,并要求你创建AVD。  
[cpp] view plaincopy
  1. $   
  2. source build/envsetup.sh  //缺少这条指令,可能会导致无法编译通过  
  3. $ lunch full-eng            //缺少这条指令,可能会导致无法启动模块器,系统报无法找到AVD,并要求你创建AVD。  

关闭gedit,接下来就开始make了,执行如下指令:
  1. $ make goldfish_armv7_defconfig  
  2. $ make  
[html] view plaincopy
  1. $ make   
  2. goldfish_armv7_defconfig  
  3. $ make  
注:用$make goldfish_defconfig这样配置也可以编译通过,模拟器也可以启动,但是Android的开机画机就显示不了,$adb shell也死活连不上,原因就是这个goldfish_defconfig这个配置文件问题.

提示:
$make goldfish_armv7_defconfig指令的意思是将目录WORKING_DIRECTORY/kernel/goldfish/arch/arm/configs/下的goldfish_armv7_defconfig文件内的Kconfig配置内容复制到WORKING_DIRECTORY/kernel/goldfish/目录下的.config文件中,.config文件是一个隐藏目录,保存着各个目录下Kconfig文件的配置.
最终结果如下图所示:


这样就表示编译成功了.

  1. $ ls arch/arm/boot/  
[html] view plaincopy
  1. $   
  2. ls arch/arm/boot/  
可以看到zImage文件.


第三步:在模拟器中启动编译好的内核
 
按下来再运行其下指令:
  1. $ export PATH=$PATH:~/WORKING_DIRECTORY/out/host/linux-x86/bin  
  2. $ export ANDROID_PRODUCT_OUT=~/WORKING_DIRECTORY/out/target/product/generic  
  3. $ emulator -kernel ~/WORKING_DIRECTORY/kernel/goldfish/arch/arm/boot/zImage &   
[html] view plaincopy
  1. $   
  2. export PATH=$PATH:~/WORKING_DIRECTORY/out/host/linux-x86/bin  
  3. $ export   
  4. ANDROID_PRODUCT_OUT=~/WORKING_DIRECTORY/out/target/product/generic  
  5. $ emulator -kernel   
  6. ~/WORKING_DIRECTORY/kernel/goldfish/arch/arm/boot/zImage &   
模拟器启动界面:



进入模拟器从设置里看版本信息:

从上图可以看出当前Android版本是4.0.1,内核版本是2.6.29,说明成功了.

同样也可以通过adb shell来查看内核版本信息,如下图:

  1. $adb shell  
  2. #cd proc  
  3. #cat version  
[html] view plaincopy
  1. $adb  
  2.  shell  
  3. #cd proc  
  4. #cat version  


完!
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 肾结石无疼血尿怎么办 胆囊胆管都结石怎么办 肾里面有肿瘤怎么办 肾癌手术后发烧怎么办 尿结石堵住尿道怎么办 尿结石不能排尿怎么办 肾癌小便有血怎么办 膀胱癌膀胱全切怎么办 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办 尿毒症透析磷高怎么办 怀孕了有膀胱炎怎么办 宝宝拉肚子尿少怎么办 猫尿血怎么办吃什么药 肝癌小便不出来怎么办 怀孕三个月结石血尿怎么办? 肾小球滤过率65怎么办 肾穿后有血肿6cm怎么办 肾穿刺后血肿怎么办 手术后有血肿怎么办 尿蛋白胆红素高怎么办 哺乳期尿蛋白高怎么办 产后老放屁便秘怎么办 肝癌移植后复发怎么办 产后屁多便秘怎么办 肝癌切除后复发怎么办 宝宝便秘拉不出大便怎么办 宝宝便秘屁多怎么办