安装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.png2:安装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
然后使用下面的命令增加交换分区
$ 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
第一步的命令执行完以后,你会发现在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
欢迎关注我的微信公众号,我会把一些生活的感想和投资方面的总结写到公众号,希望你能来和我一起交流技术之外的东西。
张鹤的公众号
网友评论