记一次编译Android源码

前言:已是第二次编译Android源码了,因为距离第一次编译Android源码的时间较长,因此有一些编译源码的命令以及编译的时候遇到问题的解决方法都忘记了,须要从新查找相关资料,这样就显得有些事倍功半了,故写下这篇文章记录编译Android源码的方式以及编译的时候遇到的问题。python

编译前的准备

  工欲善其事,必先利其器。在编译源码前须要进行一些相关环境的配置,有如下几点须要准备git

  • 电脑须要安装Linux系统(不推荐虚拟机)
  • 配置Java环境
  • 已经安装过Git
  • 安装编译源码须要的依赖

我编译源码的时候用的是Ubuntu16.04的系统,关于Ubuntu16.04的安装以及Java环境的配置你们能够本身搜索,这里就介绍一下编译源码时须要的依赖的安装方法,能够经过如下命令进行安装api

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib
sudo apt-get install libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
复制代码

同步源代码

  这里推荐清华大学开源软件镜像站进行源码的同步,下载速度真的很快,清华大学开源软件镜像站提供了两种同步源码的方式,我采用的是第一种,好像这种同步下来的源码都是最新的Android源码,第一种同步源码的方式以下bash

下载安装repo工具

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 若是上述 URL 不可访问,能够用下面的:
## curl https://storage-googleapis.proxy.ustclug.org/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
复制代码

同步源代码

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar xf aosp-latest.tar
cd aosp   # 解压获得的 AOSP 工程目录
# 这时 ls 的话什么也看不到,由于只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍便可获得完整目录
# 或 repo sync -l 仅checkout代码
复制代码

注:这里在执行repo sync的时候可能会出现下面的错误markdown

error: .repo/manifests/: contains uncommitted changes
复制代码

这时咱们在搜索引擎搜索这个错误,出来的答案大都以下架构

先 cd .repo/manifestscurl

再执行 Git stash 和 git clean -f -d工具

而后再repo sync 就能够经过了fetch

可是,这答案对我并没用,历经千辛万苦最后终于找到了解决这个错误的办法,执行如下命令flex

git config core.filemode false
# 加入忽略文件权限的配置
复制代码

而后在执行 repo sync便能同步成功。可能在同步的过程当中会遇到下面的错误

error:Exited sync due to fetch errors
复制代码

解决办法就是再执行一次repo sync或 repo sync -f 命令。

编译源码

  进入解压后的aosp文件夹,执行下面的命令

source build/envsetup.sh
复制代码

下面是执行命令后的结果

能够看出这个命令是将一些脚本文件包含进来,接着执行一下命令

lunch
复制代码

执行后的结果以下

这时咱们只要输入相应的序号,就能够指定编译目标的格式了,如此时输入序号‘1’,则编译的目标格式为aosp_arm-eng,所谓的编译目标就是生成的镜像要运行在什么样的设备上。下面介绍一下编译目标格式,编译的目标格式都是BUILD-BUILDTYPE形式,BUILD就是

BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像能够运行在什么环境.其中,aosp(Android Open Source Project)表明Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构;处理器,x86则表示x86架构的处理器;

BUILDTYPE就是

BUILD TYPE则指的是编译类型,一般有三种: -user:表明这是编译出的系统镜像是能够用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不鞥年dedug等) -userdebug:在user版本的基础上开放了root权限和debug权限. -eng:表明engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具

了解了编译目标格式,咱们根据本身的须要输入相应的序号便可。若是你是准备编译源码后在电脑上运行,那么推荐选择序号“5”进行编译,由于这样在运行时速度会快不少。

开始编译

  输入下面的命令则编译开始

make -j8
复制代码

注:这里的 -j8表明的时启用编译的线程数,参与编译的线程并非越多越好,一般是根据你机器cup的核心来肯定:core*2,即当前cpu的核心的2倍.好比,我如今的笔记本是双核四线程的,所以根据公式,最快速的编译能够make -j8(经过cat /proc/cpuinfo查看相关cpu信息)

若是编译的过程当中没有出现什么错误,那么在几个小时后你应该会看见下面的输出

make completed successfully 
复制代码

那么恭喜你完成了Android的源码编译。

运行模拟器

  若是你是在编译完后马上运行模拟器,能够经过如下命令来运行模

emulator
复制代码

不然,经过如下命令来运行

source build/envsetup.sh
lunch 
(选择刚才你设置的目标版本,好比这里了我选择的是5)
emulator
复制代码

下面看下,我这次编译后运行的模拟器

结束语

  编译源码的时候仍是有一些坑的,本文的目的就是让你们在编译源码时少入坑,节省时间作更有意义的事情。至此,已经成功编译了Android源码,有了Android的源码,你就能够更深刻的研究Android了。

ps: 历史文章中有干货哦!

转载请注明出处:www.wizardev.com

欢迎关注个人公众号
扫码关注公众号,回复“获取资料”有惊喜