Ubuntu12.04下载Android4.0.1源码全过程,附若干问题解决

学校里一直在做应用层开发,考虑到日后就业问题,这次决定研究源码和驱动,并进行编译。没想到就下载源码这一步折腾了我整整两天,期间遇到很多问题,哎,记录于此,希望日后再下源码的人不要再走无谓的弯路了。事实上可以在这里http://zhu.im/Android/下载源码,但是google推荐用repo来下载,为了多学东西就学下repo吧,毕竟下现成的也太么含量了。最初我参考的是老罗的博客http://blog.csdn.net/luoshengyang/article/details/6559955

进行下载安装的,但弄着弄着就发现不太对劲了。这里记录下详细过程:

1,我的前提是已经搭建好了Android开发环境,也即jdk已经安装好了,输入java -version来检查是否成功。搭建android开发环境可以看链接1链接2.

2,首先要安装git工具,而repo是基于git的。同时要安装所需的若干软件,命令如下:

sudo apt-get install git-coreflex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curlvalgrind

           最后的valgrind是为了编译时用,一次安完了省事。如果是为了下载源码,只需安装curl和git-core就足够了。curl是一个利用URL语法在命令行方式下工作的文件 传输工具,它支持很多协议,包括FTP、FTPS、HTTP、HTTPS、TELENT等,我们需要安装它从网络 上获取Repo脚本文件。然后curl就用不到了。repo是基于git的,git是一个分布式版本控制软件。由于android源码是由很多个部分组成的,如果用git的话需要多次git clone。为此google提供了repo,其实质就是若干个git命令写的脚本。这是curl  git repo三者之间的关系。关于repo和git的使用,可以参考这里:

(1),http://blog.chinaunix.net/uid-20780196-id-3171133.html
(2),http://www.cnblogs.com/pied/archive/2012/04/12/2444159.html
(3),http://blog.sina.com.cn/s/blog_8218aa3801013ady.html
(4),http://zhidao.baidu.com/question/466204880.html

3,利用curl下载repo脚本

       在普通用户下登录,不是root。这时~表示/home/xxx/的目录,在~下新建一个bin文件夹,用来放下载的repo脚本。参考android的官方指导文档http://source.android.com/source/downloading.html,然后将~/bin目录添加到PATH。方法为sudo gedit /etc/profile, 然后添加 PATH=$PATH:~/bin   保存关闭后,再终端输入source /etc/profile使设置生效。事实上这里也可以用绝对路径来写死,/home/xxx/bin 需要注意的是,这一切都是在普通用户下,如果以root用户登录,~表示的是/root文件夹。所以此次下载android源码一律是普通用户,不要随便切换。因为里面的~在普通用户和root用户下表示的地方不一样。如果用绝对路径写死则无此问题。

然后终端输入:

curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo

用这条命令下载repo脚本到刚建的bin文件夹。

       老罗的博客里的命令是:wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo 用的是wget,应该也可以。我用的是上面的curl命令。然后chmod a+x ~/bin/repo为其增加可执行权限。

4,新建一个文件夹,即是repo的工作空间,将源码下载到此处。我新建的目录是/home/administrator/document/androidSource.  cd到这个目录下,要确保这个目录一般用户可以访问读写。

      然后就要用repo init命令来初始化repo了,如果输入:

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

则是让repo下载最新的android源码。一般我们可以通过-b参数指定下载的android版本,输入:

repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

则是让repo下载4.0.1的源码,也可以用-b Jelly Bean来指定android的版本,具体可以参考:http://source.android.com/source/initializing.html  

http://source.android.com/source/build-numbers.html,尤其是第二个链接来选定版本号比较好。

         如果输入上面的repo init  .................xxx,再进入下一步骤虽然可以下载源码,但是下载中间会出现如下报错:

 

 

[html]view plaincopy

 

  1.  

  2.  

  3.  

  4. error: The requested URL returned error: 406 while accessing https://android.googlesource.com/platform/manifest/info/refs  

  5.  

  6.  

  7.  

  8. fatal: HTTP request failed  

  9.  

  10.  

  11.  

  12. error: The requested URL returned error: 406 while accessing https://android.googlesource.com/platform/manifest/info/refs  

  13.  

  14.  

  15.  

  16. fatal: HTTP request failed  

  17.  

  18.  

  19.  

  20. Fetching projects:   9% (20/221)  error: The requested URL returned error: 406 while accessing https://android.googlesource.com/platform/external/bison/info/refs  

  21.  

  22.  

  23.  

  24. fatal: HTTP request failed  

  25.  

  26.  

  27.  

  28. Fetching projects:  10% (23/221)  error: Failed to connect to 2404:6800:4008:c01::52: Network is unreachable while accessing https://android.googlesource.com/platform/external/apache-xml/info/refs  

  29.  

  30.  

  31.  

  32. fatal: HTTP request failed  

  33.  

  34.  

  35.  

  36. error: Failed to connect to 2404:6800:4008:c01::52: Network is unreachable while accessing https://android.googlesource.com/platform/external/astl/info/refs  

  37.  

  38.  

  39.  

  40. fatal: HTTP request failed  

  41.  

  42.  

  43.  

  44. error: The requested URL returned error: 406 while accessing https://android.googlesource.com/platform/external/bluetooth/glib/info/refs  

  45.  

  46.  

  47.  

  48. fatal: HTTP request failed  

  49.  

  50.  

  51.  

  52. error: The requested URL returned error: 406 while accessing https://android.googlesource.com/platform/external/astl/info/refs  

  53.  

  54.  

  55.  

  56. fatal: HTTP request failed  

  57.  

  58.  

  59.  

  60. Fetching projects:  11% (25/221)  error: The requested URL returned error: 406 while accessing https://android.googlesource.com/platform/external/apache-xml/info/refs  

 

      错误的核心就是 error android.googlesource.com/platform/manifest/info/refs,百度一下参考这里:http://www.rosoo.net/a/201302/16504.html    这是google防止匿名访问连接次数过多而设置的。

        解决方法是:浏览器登录https://android.googlesource.com/new-password,输入自己的gmail帐号,点击网页上的“确定”或“允许访问”会得到如下信息(我只找到了确定按键):

 

[html]view plaincopy

    1.  

    2.  

    3.  

    4. Login for Git:  

    5.  

    6.  

    7.  

    8. Username: git-yanzi1225627.gmail.com  

    9.  

    10.  

    11.  

    12. Password: 1/IwTl_VomaQWIk0I4gRjdDL5SybS8MGDv15Cb0bLonMg  

    13.  

    14.  

    15.  

    16. Staying Authenticated:  

    17.  

    18.  ‍

    19.  

    20. To stay authenticated by saving the password, append the following line to the ~/.netrc configuration file:  

    21.  

    22.  

    23.  

    24. machine android.googlesource.com login git-yanzi1225627.gmail.com password 1/IwTl_VomaQWIk0I4gRjdDL5SybS8MGDv15Cb0bLonMg machine android-review.googlesource.com login git-yanzi1225627.gmail.com password 1/IwTl_VomaQWIk0I4gRjdDL5SybS8MGDv15Cb0bLonMg   

    25.  

    26.  

    27.  

    28.   

    29.  

    30.  

    31.  

    32. Make sure you have set the permissions on ~/.netrc so that only your user account can read the file. If your home directory is on a network filesystem, consider moving it to a local disk and making ~/

    33.  

    34.  

    35.  

    36. .netrc a symbolic link to the local version.  
      新建一个.netrc文件,gedit ~/.netrc,如果有的话就不用新建了。在linux里前面有个"."表示这个文件是隐藏文件。在里面输入machine开头的两行话保存即可。 5,开始同步源码前的修改,就这个地方我摸了两天       参考文章http://blog.csdn.net/lengxibo/article/details/8299888#reply  原来是需要改/etc/hosts, 终端输入ping www.googlesource.com或ping android.googlesource.com,得到IP是www.googlesource.com和android.googlesource.com的IP, 我的电脑上两个IP都是74.125.31.82.   

      保存就ok了。
      chomd a+x download.sh让其可以运行,然后终端输入./download.sh就可以开始下载了,用这一步代替官方文档里的repo sync。
      当连接不上终端时休息3毫秒然后再自动repo sync,这样就很完美了。       里面的projects文件夹即是下载的源码: 
             当然我的还么下载完,估计里面的内容还不太全。下面附一个下载时的截图:

    37. 然后将下载的地址中间加一个/a,也即最终的repo init的命令是

    38. repo init -u https://android.googlesource.com/a/platform/manifest -b android-4.0.1_r1
    39.       经过4步骤里的改.netrc操作,我发现下载时报的错依旧,大爷的。报错如下:

    40. error: Failed connect to android.googlesource.com:443;Connection refused while accessinghttps://android.googlesource.com/a/platform/frameworks/base/info/refs

    41. fatal: HTTP request failed

    42. error: Cannot fetch platform/tools/motodev

    43. error: Cannot fetch platform/frameworks/base

    44. error: Cannot fetch platform/prebuilts/sdk 

    45. error: Exited sync due to fetch errors

    46.          然后sudo gedit /etc/hosts, 在里面输入:

    47.  

    48.  

    49. [html] view plaincopy

    50.  

    51.  

    52. 74.125.31.82 www.googlesource.com  

    53.  

    54.   

    55.  

    56. 74.125.31.82 android.googlesource.com  

    57.  

    58.   

    59.  

    60. 203.208.46.172 cache.pack.google.com  

    61.  

    62.   

    63.  

    64. 59.24.3.173cache.pack.google.com  

    65. 6,开始同步源码喽

    66.        按理说在repo init  ....之后使用repo sync就可以开始下载源码了,但是在下载过程中经常会出现没网速“死”的情况。当然,我修改了/etc/hosts文件之后就再也么有死过。在没网速提示连接不上时,可以按ctrl+z按键来暂停同步,然后再输入repo sync就可以了。但尽管这样也不太方便,比如大半夜的谁会守着电脑监督下载情况,源码貌似都要一夜才下好,汗。为此,可以参考http://www.rosoo.net/a/201302/16503.html  在工作目录,我的是~/document/androidSource文件夹下新建一个download.sh脚本文件,里面的内容是:

    67.  

    68.  

    69. [html] view plaincopy

    70.  

    71.  

    72. <span style="font-size:18px;color:#FF0000;">    #!/bin/bash     

    73.  

    74.     echo "======start repo sync======"     

    75.  

    76.     repo sync     

    77.  

    78.     while [ $? == 1 ]; do     

    79.  

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

    81.  

    82.     sleep 3     

    83.  

    84.     repo sync     

    85.  

    86.     done   </span>  

    87. 7,下载的源码在哪里

    88.           在工作目录~/document/androidSource文件夹下,输入命令 ls -a,可以看到有个.repo文件夹。很显示这是个隐藏文件夹,进去这个目录后查看结果如下:

    89.  

    90.  

    91. [html] view plaincopy

    92.  

    93.  

    94. <span style="font-size:18px;">administrator@ubuntu:~/document/androidSource/.repo$ ls  

    95.  

    96. manifests  manifests.git  manifest.xml  projects  repo</span>  

    97.  

    98.  

    99. [html] view plaincopy

    100.  

    101.  

    102. <span style="font-size:18px;">administrator@ubuntu:~/document/androidSource/.repo/projects$ ls  

    103.  

    104. abi         build.git   development.git  external    libcore.git  prebuilt.git  

    105.  

    106. bionic.git  cts.git     device           frameworks  ndk.git      sdk.git  

    107.  

    108. bootable    dalvik.git  docs             hardware    packages     system  

    109.  

    110. </span>  

       

    111. 有点奇怪的时我在repo init -u的时候已经用-b指定下载源码版本为4.0.1_r1, 不知到为啥下载的时候还会出现4.2.x的信息,有时候还会出现2.3.x的相关信息,知道为啥的大神告知一下哈。

    112.            据说会有10G左右,源码还在下载。等下载完后用mv .repo repo强制把这个隐藏文件夹弄成可见的看着就方便了。(看来不用强制把.repo变可见,在工作目录下等源码下载好后所有文件夹直接可见了。不过用ls -a查看,还是有隐藏文件夹.repo,里面的内容如下:

    113. 自上而下,每一列每一列的看,内容和下面androidSource文件夹中的内容是一样的。只不过也的带.git有的不带。估计带.git是可能会有更新的内容吧。这一点是揣测。这和repo准确说是git的工作流程有关。)源码下好了,下一步就干编译。

    114.          终于下载完了,附一张截图:

    115.  

    116.        原来下载完成后,androidSource下面的东西自动变的可见了,共占空间4.5G大小。截图如下:

    117.  

    118.  

    119.  

    120.       补充一下,早期的android源码是由linux的kernel负责管理的,下载的链接是git://android.git.kernel.org,所以网上有的命令还是这样的:repo init -u http://android.git.kernel.org/platform/manifest.git  这种统统是过时的,kernel已经将android剔除。android源码由android.googlesource.com负责维护发布。所以只要是文档里repo init后面的网址带“kernel”这肯定下不成,趁早pass!

    121.  

    122. 参考文章(下一步编译的时候还要用到):

    123. 1,http://www.59a.cn/1182.html

    124. 2,http://wenku.baidu.com/view/7bd2a3f10242a8956aece40d.html

    125. 3,http://www.startos.com/ubuntu/tips/2011021022209.html

    126. 4,http://www.rosoo.net/a/201302/16503.html

    127. 5,老罗http://blog.csdn.net/luoshengyang/article/details/6559955
      6,http://blog.csdn.net/herbert5069/article/details/7671801
      7,http://www.cnblogs.com/and_he/archive/2012/01/04/2312027.html
      8,http://www.iteye.com/topic/1122739

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。