美文网首页android源码Android知识Android开发
下载Android5.1.1源码、编译源码、SDK和内核

下载Android5.1.1源码、编译源码、SDK和内核

作者: 安新小子 | 来源:发表于2017-05-10 19:26 被阅读205次

    安装Ubuntu系统:

    由于Android源码编译谷歌官方是推荐Ubuntu系统的,所以第一步就是安装Ubuntu系统,而我要下载的Android5.0的系统,官方要求最低是Ubuntu12.04,这里是官方要求的网址 https://source.android.com/source/requirements**
    我想所有人第一次打算下载和编译Android的源码,第一时间想到的肯定是到百度上去搜教程,我也是这样的找了一篇博客,上面说最好使用Ubuntu14.10,因为他在下载和编译的时候使用14.04出现了好多软件依赖问题,然后我就快了的去按照Ubuntu14.10了(我用的虚拟机安装的Ubuntu,硬盘给了100G,内存2G),安装完毕了,然后按照教程去下载必要的软件吧,一下载全部没有,当时就懵了,怎么回事了?这时旁边的同事看见了(他一直在使用Linux系统),看到我用的14.10,告诉我Ubuntu系统每年发布的两个版本之后4月份发布的版本同时还是偶数年版本才是长期支持版,也就是说14.10不是长期支持版,这个版本只维护八个月,所以软件都找不到了,同事说哪个博客肯定是两年以前的了,我一看,果然是,然后又装了一个14.04

    上面的经历就是建议大家,在找博客的时候一定要找比较新的,因为软件行业的变化非常快,如果因为版本的问题浪费时间,真的就得不偿失了。

    还有硬盘大小问题,如果下载Android5.0或者5.0以上的源码,硬盘好预留100G以上,其实源码并没有多大,我5.1的源码下载完之后大概25G左右,最占空间的是在下载的过程中会下载一个.repo的隐藏文件夹,这个文件夹的作用是保存的关于git的所有缓存命令,5.1的这个文件夹大小大概40G左右,大小很惊人,4.0.3的源码大概4.5个G,它的.repo文件夹是10G多大小。由于我的硬盘空间有限所以在确定源码下载完毕之后我就把这个.repo隐藏文件夹删掉了,因为我查找的这个文件夹的作用是缓存git命令,执行repo sync等下载源码命令的时候需要用到这个文件夹中的内容,就是说这个文件夹确保了本地和远程仓库的链接,既然源码已经下载完毕所以我就删掉了。

    下载Android源码

    1:更新源
    打开Ubuntu上自带的软件中心

    image.png

    将软件源修改成清华的镜像

    image.png

    2:安装jdk
    上面官方网址中有下载Android源码对应版本需要下载的jdk版本,这里下载openjdk-7-jdk

    $  sudo apt install openjdk-7-jdk
    

    安装好之后,配置到环境变量中

    $ cd /etc
    $ gedit profile
    

    之后会打开prifile文件,在文件的结尾加上

    JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/  
    PATH=$PATH:$HOME/bin:$JAVA_HOME/bin  
    export JAVA_HOME  
    export PATH
    

    然后保存,退出,如果不让保存,就改一下这个文件的权限,或者使用vim来修改。
    可以在命令行输入 java -version 来检验一下是否生效

    3:安装必要的工具软件

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

    在安装的过程中如果出现有些软件被新的替代了,就使用apt-get install 命令去安装新的软件
    4:配置Cache

    $ sudo apt-get install ccache  
    $ source  ~/.bashrc 
    

    由于Google使用repo工具管理的Android源码,所以要先现在Repo工具
    官方的下载教程地址:https://source.android.com/source/downloading
    5:建立一个目录用来放repo工具,同时添加到path目录中

    $ mkdir ~/bin
    $ PATH=~/bin:$PATH
    

    6:下载Repo工具,然后设置Repo可执行权限
    因为我们把镜像改成了清华的镜像,所以从镜像中下载repo

    $ cd ~/bin
    $ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
    $ chmod a+x ~/bin/repo
    

    7:这是你在bin目录下就看见了一个叫repo的文件打开它

    image.png

    修改这个url路径成清华的源路径,保存退出。

    REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
    

    百度好多老博客不管在使用镜像下载的时候还是使用git来下载repo,我当时也是直接拿过来,总是出错,报「网络无法连接」,明明是有网的,为什么还无法连接呢?我想肯定又是版本更新的问题,登录清华镜像的网站,就明白了人家网站上说了使用我上面的方式来连接。

    8:创建存放Android源码的目录、初始化Repo,下载源码

    $ mkdir ~/android
    $ cd ~/android
    

    初始化repo,这是就要确定你要下载的源码,我下载的是5.1.1的源码

    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-5.1.1_r4
    

    下载Android源码,这步是最耗时的

    $ repo sync 
    

    注意事项:

    1、在源代码下载过程中,我们在源代码下载目录看不到任何文件,ctrl+H“显示隐藏”,会看到一个名为.repo的文件夹,这个文件夹是用来保存Android源代码的“临时文件”
    2、文件最后下载接近完成时,会从.repo文件夹中导出Android源代码
    3、若是必须关闭电脑停止下载,那么可以在源代码下载的终端中按Ctrl + C 不会造成源代码的丢失或损坏
    4、自动或者手动停止源代码的下载,可以使用命令: repo sync 继续下载
    5、因为在下载过程中因为网络或者什么原因会中断,我们可以写一个自动化脚本来当停止以后自动执行 repo sync

    #!/bin/sh
    repo sync 
    while [ $? -ne 0 ]
    do
    repo sync 
    done
    

    在源码下载目录创建一个文件,比如down.sh,将上面的代码复制保存,然后停止源码下载以后,执行脚本,执行命令:sh down.sh
    6、如果不确定源码是否下载全,可以多执行几遍 repo sync 命令。

    编译源码

    直接进入源码目录执行 make 命令,可以在后面指定可以同时几个线程工作,如果你的CPU是4线程可以执行 make -j4 这样可以在编译过程中让CPU充分利用

    编译过程中的错误:
    错误一:

    collect2: ld terminated with signal 9 [Killed]
    make: *** [out/host/linux-x86/obj/EXECUTABLES/clang_intermediates/clang] 错误 1
    make: *** 正在等待未完成的任务....
    

    或者

    g++: internal compiler error: Killed (program cc1plus)
    Please submit a full bug report
    make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/content_content_common_gyp_intermediates/content/common/content_message_generator.o] 错误 4
    

    原因:在编译过程中,内存占用量很高,如果没有设置swap分区,或者分区太小就会报上述错误,当然如果你能改编译源码的电脑内存足够大就不用设置交换分区了,也不会出现这个错误了。
    解决办法:
    使用 free -m 命令查看自己的交换分区,可以看到我的交换分区之后2G

    image.png

    然后使用下面的命令增加交换分区

    $ mkdir swap
    $ cd swap
    $ sudo dd if=/dev/zero of=swapfile bs=1024M count=5
    $ sudo mkswap swapfile
    $ sudo swapon swapfile
    

    可以看到,我设置增加了5G 交换分区,bs的值和count的值相乘 就是你增加的交换分区的值,最后两步是挂在你设置的交换分区

    image.png

    设置完之后查看,交换分区增加了5G

    这里我的经验是:错误出现以后我没有看到上面的 error 提示,只看 make:*** 那一行提示了,然后就开始Google解决办法,找了好久都没找到解决办法,大家在编译的时候一定要找到有「error」字样的提示,然后去搜索,当出现问题总会无法找到原因时,一定要相信肯定会有人已经遇到过了,肯定是自己方法错了,因为我当时在解决这个错误的时候就差一点放弃,然后我想,编译Android源码的人这么多,不可能我会遇到别人遇不到的问题,肯定之前有人遇到过并分享出来了,只是我搜索的方式不对,最后找到了解决办法。

    错误二:

    /bin/bash: xmllint: 未找到命令
    make: *** [out/target/product/generic/system/etc/apns-conf.xml] 错误 127
    make: *** 正在等待未完成的任务....
    

    解决办法:
    安装一个工具

    sudo apt-get  install libxml2-utils 
    

    最后编译完成终端截图

    image.png

    运行模拟器:
    编译完毕之后,就自然而然有这样的问题,我编译的正确吗,怎么验证呢,基本上都是通过命令行启动模拟器来验证,网上好多都是把source(你的源码目录)/out/host/lunux-x86/bin 这个路径配置到 PATH 中直接执行 emulator 指令,就可以启动命令行了,但是当我配置之后,系统提示没有emulator 命令,然后看bin目录下也没有 emulator 执行文件,这是为什么呢?先说解决办法的,要想运行模拟器需要再执行两步命令

    $ source build/envsetup.sh
    

    执行完之后截图

    image.png

    这个命令的作用是导入一些执行脚本
    然后执行

    $ lunch
    

    执行完之后截图

    image.png

    我选择的是 1 ,aosp表示(Android Open Source Project)Android开源项目,arm表示运行在arm架构的处理器上,eng表示编译类型为工程版本

    然后在运行emulator,就出现了模拟器

    这里注意上面的两步也可以在编译源码之前,即make 命令执行之前执行,这样在编译完成之后直接就可以运行 emulator命令调用模拟器了。


    2017/5/15更新
    编译SDK

    编译SDK,比较简单,我开始就执行了下面这条命令

    $ make sdk
    

    如果你是看这个教程第一次编译sdk,就不要像我一样直接执行上面的命令,而是这样先后执行三条命令

    $ source build/envsetup.sh
    $ lunch sdk-eng
    $ make sdk
    

    错误总结:

    如果你出现了这个错误,上面编译SDK的时候肯定是和我一样只执行了 make sdk 这一条命令

    development/build/sdk.atree:500: couldn't locate source file: system/app/EmulatorSmokeTests/EmulatorSmokeTests.apk
    make: *** [out/host/linux-x86/sdk/full/android-sdk_eng.zhanghe_linux-x86.zip] 错误 44
    

    解决办法:

    $source build/envsetup.sh //初始化构建环境
    $lunch sdk-eng //选择目标
    

    执行上面两步再去 make sdk。这个错误是可以避免的,就是在第一次编译sdk之前就先执行这两步,然后在执行 make sdk,这个错误就不会出现

    最后编译完毕,如下图,系统已经自动的将 zip 包解压完毕。解压之后的文件夹就是编译之后得到的SDK

    image.png

    下载Android 内核

    一:使用git 关联内核
    在存放源码的目录创建一个存放内核的目录

    $ makedir kernel
    

    然后使用git 关联,我这里使用清华的镜像

    $ git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
    
    image.png

    二:查看你要下载的内核版本
    从运行的模拟器中我们可以看到要使用的内核版本,我的模拟器使用的是3.4

    image.png

    第一步的命令执行完以后,你会发现在kernel 目录中有一个空文件夹 goldfish,进入到这个goldfish目录中可以使用下面命令查看有哪些内核的版本分支可以下载

    $ git branch -a
    
    image.png

    三:下载内核代码

    $ git checkout remotes/origin/android-goldfish-3.4
    

    下载完毕截图

    image.png

    编译内核

    一:配置环境变量

    $ export PATH=$PATH:~/source/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin
    

    上面是我的路径地址,根据你本机的地址进行修改

    二:在goldfish 目录下找到 Makefile 文件修改

    #ARCH        ?= $(SUBARCH)
    #CROSS_COMPILE    ?= $(CONFIG_CROSS_COMPILE:"%"=%)
    #上面注释掉,加入下面的
    ARCH ?= arm
    CROSS_COMPILE     ?= arm-eabi-
    
    image.png

    三:在goldfish目录下 执行

    $ make goldfish_armv7_defconfig
    

    四:编译开始

    $ make
    

    成功截图:

    image.png

    在目录下 kernel/goldfish/arm/boot 目录下就会多了一个zImage 文件

    五:使用我们自己编译的内核启动模拟器
    执行下面三条命令

    $ source build/envsetup.sh
    $ lunch sdk-eng
    #指定内核文件启动模拟器
    $ emulator -kernel ./kernel/goldfish/arch/arm/boot/zImage
    
    image.png

    可以看到编译此内核的用户和编译的时间

    错误总结:

    在编译内核的时候出现了一个错误,导致的结果是,在最后一步使用编译好的内核启动模拟器的时候,模拟器一直黑屏

    原因:
    在修改完Makefile 文件之后应该执行下面这条命令

    $ make goldfish_armv7_defconfig
    

    但是我执行的是

    $ make goldfish_defconfig
    

    这两个有什么区别的:这是根据不同的CPU架构来执行不同的命令,第一个命令是当你的模拟器CPU是 armv7架构的时候;执行第二个命令是你的CPU架构是armv5的时候,2.3版本以后的体系架构是用的是armv7了,所以我应该执行第一个命令。
    重新执行,编译一遍然后再启动模拟器就ok了。

    参考地址:
    http://www.cnblogs.com/lanrenxinxin/p/5424554.html
    http://jingyan.baidu.com/article/3c48dd34777079e10ae3585b.html
    http://www.jianshu.com/p/367f0886e62b
    http://www.jianshu.com/p/6d97b4a10b18

    欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。

    张鹤的公众号

    相关文章

      网友评论

      本文标题:下载Android5.1.1源码、编译源码、SDK和内核

      本文链接:https://www.haomeiwen.com/subject/wyggtxtx.html