android源码Android知识Android开发

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

2017-05-10  本文已影响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

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

张鹤的公众号
上一篇下一篇

猜你喜欢

热点阅读