1.概述

做了四五年的android应用层开发后,想研讨下底层源码的完结,所以想下载源码研讨下,可是万事开头难,源码下载的进程十分崎岖,我运用的是双体系(ubantu 和windows),主机的固态只有1TB,而android的源码下载完一个版别也有几百个G。所以我想到了运用移动硬盘来保存下载的Android源码。也便是这个决议,让我折腾了两个多月。所以本文主要介绍整个下载源码编译到刷机的经验。

2.Android源下载

依据网上的教程,我做了如下的装备,预备下载源码,这儿默认读者现已装置git 东西,未装置的能够百度装置下。很简略这儿就不废话了,别的下载源码的脚本中用到了Pyton,所以需求装备好python环境,python有两个版别python2和python3,我主张读者能够都装置,百度上有一种能够同时装置python2和python3的办法,然后能够自动切换,两个python的版别都装置的原因是咱们下载源码的时分需求运用python3,而编译android源码的时分有时分需求运用python2,比方android10 的源码便是这样的,装置好了可切换的python环境后是这样的:

Android AOSP源码研讨之万事开头难----经验经验记载

1.装备环境变量

kdir ~/bin
echo "PATH=~/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

2.装置curl

sudo apt-get install curl

3.下载repo并授权

由于android的源码特别大,所以是运用repo东西办理,不理解repo东西的能够去android官网或者百度了解,这儿不做讲解。

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

4.创立一个文件夹保存源码

在这儿我下载的是android9.0的源码,其实下载那个版别的都一样,只需把后面的分支姓名改了就能够,而这些分支姓名的获取地址为:android代号、符号、build号 翻开上面的地址后,如下:

Android AOSP源码研讨之万事开头难----经验经验记载

上图中选中的地方便是我下载源码对应版别的分支名称,咱们只需求仿制它放到后面下载指令中就能够了

然后咱们新建一个目录预备开端下载源码

Android AOSP源码研讨之万事开头难----经验经验记载

5.设置repo的地址并装备为清华源

由于一些特殊原因,在咱们国家无法直接访问国外的网,所以需求咱们运用国内镜像,清华镜像或者中科大的镜像都能够下载android源码,假如有VPN 能够翻墙的小伙伴也能够直接下载源码,详细的下载办法便是把下面的地址换成google官方的android源码地址即可,在咱们新建的寄存源码的目录下翻开指令行履行下面的指令

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

6.初始化仓库

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

7.指定咱们需求下载的源码分支并初始化

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

上面指令中的android-9.0.0_r46 便是第4步中获取到的分支名 运行上面的指令成功后如下

Android AOSP源码研讨之万事开头难----经验经验记载
最终履行指令:

repo sync

开端同步代码,同步或许需求很长的时刻而且中心还或许会犯错,犯错的原因大多数都是网络,一向同步代码就行了,详细的坑,请看下面的内容,下载成功后的成果如下所示:

Android AOSP源码研讨之万事开头难----经验经验记载

2.1 运用移动硬盘寄存Android源码的坑

我开端下载源码挑选移动硬盘是想着能够将源码携带着随时都能看,而且还解放了我的主机的存储空间,想法十分的丰满,可是现实很骨感,当然归根到底也是由于我穷,假如一开端我直接就将电脑的一切装备拉满,应该不会这么崎岖。我运用移动硬盘,将其格局化成NTFS格局,然后去下载源码,下载的进程很长,刚开端的时分,下载老是报错,由于一下载源码,就会在本地被莫名美妙的修正文件,导致老是和线上的代码抵触报错,最终我发现了一招能够处理这个报错,便是把一切本地的修正强制回退一个版别,然后再拉,就成功了。指令如下所示:

repo forall -c "git add -A" && repo forall -c "git reset HEAD^^^ --hard" && repo sync

这一通操作下来,终于显示代码下载成功了,我以为我的高兴现已抵达了高峰,可是现实给了我一逼兜。当我预备编译源码的时分发现无法编译,由于我拉的源码不全,罪魁祸首便是文件体系的问题,由于移动硬盘运用的是NTFS 文件体系,导致在Ubantu中有部分文件无法识别,也便是无法创立,所以下载的文件会有缺失,由所以编译的时分犯错,我翻开了blueprint目录,在这个目录下运用git指令回退版别拉取最新代码时发现报错,过错大概意思便是无法创立文件名为*号的文件夹。然后我在另一个Ubantu本机目录下载blueprint,然后对比android源码目录中的发现确实少了好几个目录,所以导致了编译不成功。自此移动硬盘寄存android源码而且编译的这条路被完全堵死。所以想这么干的小伙伴能够停止你的想法了。

2.2 处理办法

既然无法运用移动硬盘,咱们就只能是运用Ubantu的体系的存错来寄存android源码,可是咱们的体系固态硬盘只有1TB,所以处理办法便是扩容,为此我花巨资买了一个固态硬盘装置上后,下载代码贼快,编译也是一把过,便是一个字,爽,再提一句,主机下载代码最好连接网线,不要用无线网卡,会很慢

3.Android源码编译

源码下载完后便是编译,编译网上会有一堆教程,这儿就给咱们简略介绍下留意点,网上的有些教程会让你扩大交换空间便是履行

sudo fallocate -l 1G /swapfile

这个指令切记不要随意用,假如你的体系空间本来就紧张的话运用这个指令会导致你体系重启的时分一向卡在启动页,连康复形式都进不了 编译源码需求装置依靠,百度网上一堆,这儿随意列一个吧

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 g++-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
sudo apt-get install libssl-dev

装置JDK

sudo apt-get install openjdk-8-jdk

编译源码还需求对应的Python环境,这儿咱们装备好可切换的python后切换即可,例如假如是android10,运用python2,我的办法便是先编译源码,假如python脚本报错,我就切换别的一个python环境。 编译代码之前还需求咱们去下载对应的驱动二进制文件android 对应驱动二进制文件,下载完后会得到两个可履行的bash脚本,然后咱们将其仿制到源码目录,履行生成vendor目录。

Android AOSP源码研讨之万事开头难----经验经验记载
如上图所示,便是图中选中的两个文件。履行完后咱们预备编译源码

编译的指令如下:

//1.设置环境变量
source  build/envsetup.sh
//2.运用lunch指令挑选对应的源码装备
lunch
// 3.开端编译
make -j8 // 能够是-j4 或不带参数

然后接下来便是漫长的等待编译完结。

假如想要清理前次的编译产品咱们能够履行指令

make clobber

然后删除生成的out目录就能够了

4.Android源烧录

编译完源码后便是烧录进手机了,咱们要想往手机中烧录代码必须要求手机能够进行oem解锁,解锁完后运用指令进入bootloader形式

adb reboot bootloader

然后进入咱们编译的成果目录

Android AOSP源码研讨之万事开头难----经验经验记载
上图是我编译android10源码后生成的目录,其他版别的源码结构也差不多哦,这儿我运用的是模拟器的方法,由于我买的google pixel一代太废物刷了后时好时坏的,我的意图是了解这个进程,所以我就运用了模拟器。不过运用真机刷机一定要留意:不然手机就成砖了,便是千万不要在刷机的进程中运用fastboot指令锁oem 千万不要,千万不要,由于开启oem是需求你的手机能开机进入体系设置的,如果你刷机不成功,又无法今天体系,然后你的手机oem还锁了,那就没救了。所以要刷机的小伙伴留意了。只需oem不锁,随意刷,刷坏了能够去找对应的原厂镜像包刷来康复。这儿给出google pixel 和nexnus的原厂镜像包地址:google pixel 和nexnus的原厂镜像包地址 运用模拟器的方法编译源码的时分咱们能够直接运行指令emulator,就能够翻开模拟器啦
Android AOSP源码研讨之万事开头难----经验经验记载
这些便是我的下载AOSP 源码之路的坑和经验,假如读者还经历过其他坑的话,欢迎谈论区交流。本文到此结束