版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fuchaosz/article/details/52473660

1 前言

经过一周的奋战,终于从谷歌官网上下载最新的android 6.0.1_r62源码,编译成功,并成功的刷入nexus6p,接着root完毕,现写下这篇博客记录一下实践过程。

2 简介

自己下载android系统源码,修改定制,然后编译刷入安卓手机,想想还有点小激动呢。简单点说一句话——定制我们自己的MIUI,这就是android的魅力,这篇博客博主就来教大家实现自己的定制系统。 
首先,要明白下面的基础知识:

(1) 什么是aosp? 
aosp就是android open source project(安卓开源项目),也就是android源码的简称,使用git管理,我们要下载的就是aosp源码,它托管在谷歌的服务器上,直接编译aosp后得到的android系统就叫原生android。

(2) 如何下载aosp? 
aosp需要专门的下载工具repo下载,当然必须科学上网。

(3) 如何编译aosp? 
aosp必须在Linux系统上编译,官方推荐的是Ubuntu系统。目前官网上只有Ubuntu 14.04的编译教程,但博主用的是Ubuntu 16.04,并且编译成功了。

(3) 什么手机可以刷入aosp? 
并不是所有安卓手机都可以刷入安卓源码,虽然aosp是开源的,但是aosp本身界面很简陋,也不带有驱动,所以厂商拿到aosp后都会进行定制,这些定制系统就是MIUI们,它们并不开源,所以你无法拿到MIUI的源码,自然也无法编译它了。现在大部分手机厂商为了自家定制系统的市场占有率,都给手机的bios(bootloader)加了锁,所以魅族的手机你是无法刷入小米的系统的。所以能够刷入原生android的机型很少,博主只知道谷歌的nexus系列和一加手机可以。这里推荐谷歌nexus系列手机,也就是人称的太子,android的标杆机,当然,nexus手机不在大陆发售,你需要在万能的淘宝上购买。

(4) android开放但不开源 
android并不是真正的开源操作系统,因为android的驱动是不开源的,所以它从Linux中除名了,linux才是真正的开源系统,你可以拿到所有源码,包括驱动,但是安卓不行,所以安卓是开放的系统。android把驱动放在了HAL层,这个是抽象层,具体实现交给了各个厂商,而且为了规避GPL协议的传染性,android巧妙的将HAL层放在了用户态,并且把关键的内核库全部重写了,从而保证从android的framework层开始不必开源了,不得不说谷歌在开源和商业化之间做了巧妙的结合,这也是安卓能够迅速发展的原因之一。所以,我们编译的系统要刷入手机中去最难的地方就是没有驱动,那么有没有手机厂商放出了驱动呢?有的,这就是谷歌的nexus系列手机,最新的是nexus 5x和nexus 6p,作为android开发者必备手机。

(5) 什么是CM? 
前面提到了,将AOSP刷入手机最困难的地方是没有驱动,因为驱动是商业机密,是闭源的,那么有没有人专门处理不同手机的驱动问题呢,屏蔽掉驱动的差异呢?答案是有的,这就是大名鼎鼎的Cyanogenmod,简称CM,目前全球最有名的第三方编译团队。换句话说,如果你的手机不是nexus系列手机,又想编译源码刷入手机中,那么你可以下载你手机型号对应的CM的源码。当然,CM是怎么解决驱动问题的呢,据说是从官方ROM中提取的二进制代码。

3 环境

  • Ubuntu 16.04
  • nexus 6p
  • 科学上网
  • Git
  • Gmail 邮箱
  • Twrp recovery
  • Open Gapps
  • SuperSU

4 准备工作

(1) 安装ubuntu 16.04 
首先要安装Ubuntu 16.04,博主直接安装在实体机器上,你也可以在vmware虚拟机中安装,但是强烈建议在实体机器上直接安装Ubuntu,因为运行流畅、编译速度快,节约时间。Ubuntu和windows的兼容做的很好,博主安装的就是win7和Ubuntu双系统。 
至于如何安装Ubuntu百度一下一大堆,这里博主就带过来了,只是顺便提醒一点,如果在实体机上安装Ubuntu,一定要给Ubuntu的/home分区至少250G空间,因为源码解压、编译后真的很大,如果你想把源码压缩保存起来,那么至少300G空间,博主就在压缩的过程中遇到了空间不足的情况,只好切换到win7用分区助手压缩分出空闲分区,然后再用Gparted在Linux下面把空闲分区分给/home,整整浪费一天时间,其中涉及到windows和linux重新分区,Gparted用法,linux启动修复等高级技术,所以提醒大家多分点空间给Linux.

(2) 科学上网 
要下载Google上的Android源码必须学会科学上网,博主使用的是搬瓦工vps+shadowsocks的方式科学上网,为了下载Android源码,博主专门写了一篇如何科学上网的博客,具体请看这里:

Ubuntu 16.04 使用ShadowSocks + Privoxy 科学上网

科学上网一般都是要花钱的,免费的不稳定。

(3) Gmail邮箱 
在下载源码的过程中,谷歌为了防止匿名连接过多,对同一个ip的访问次数进行了限制,这就导致我们下载过程中很可能会失败,因此我们需要用一个谷歌账号(也就是Gmail邮箱)来进行验证。博主在下载过程中就遇到了匿名下载失败这个问题,后来加了验证之后才下载成功。有了Gmail邮箱就可以使用Google的所有服务了,可以体验优秀的Google App了,如果你还没有Gmail账号,那就赶紧去申请吧,当然,前提是能科学上网。

(4) nexus 6p手机 
作为Android标杆机,nexus系列是Android开发者必备,你可以自己修改源码,编译后push到手机中看看效果,这样学习过程就不会枯燥了,想想是不是还有点小激动呢。如果nexus手机上某个app有问题,那么一定是app写的不好,而不是手机的问题,这就是标杆机。目前最新的nexus系列是华为代工的nexus 6p,颜值高,大屏幕,双喇叭,瞬间指纹解锁,高端大气,上一张nexus 6p的图片:

这里写图片描述

当然原生的AOSP不带谷歌全家桶(GApps),用nexus不用谷歌全家桶就好比喝拿铁不加糖一样—苦不堪言。所以,刷机完毕,博主会教大家如何刷入Google Apps。 
最后补充一点,nexus不翻&墙也是可以用的,但是,逼格呢?

5 下载源码

(1) 安装Git 
Git安装命令如下:

sudo apt-get install git 
  • 1

安装完毕,配置Git账号,这里用户名可以随便写,但是邮箱请务必使用你的Gmail邮箱,因为涉及到下面的访问验证,命令如下:

git config --global user.name "Your Name"   
git config --global user.email "Your Gmail@gmail.com"
  • 1
  • 2

(2) Google账号验证 
对于匿名访问,为了防止连接过多,谷歌对同一个ip的访问次数进行了限制,所以我们需要添加一个下载验证,打开下面的链接:

https://android.googlesource.com/new-password

登录谷歌账号,会看到下面的界面:

这里写图片描述

翻译一下就是:通过复制下面的脚本代码到shell中,为Git配置cookie,用于访问谷歌服务。 
如果你是在windows下用Git for windows来下载源码,那么复制上面框框里面代码到cmd命令行中去执行,一行一行的执行。 
由于我们使用的是Ubuntu,所以我们打开shell窗口,将下面框框的代码一行一行的复制到shell中执行,复制一行执行一行就可以了。

(3) 安装repo 
android源码包括很多模块,每个模块都是一个个工程,不同版本依赖不同模块,总不能一个一个去下载这些工程吧,所以为了管理这些工程,谷歌开发了一个管理Git仓库的工具叫repo,官网的安装教程是这样的: 
首先创建bin文件夹:

$ mkdir ~/bin
$ PATH=~/bin:$PATH
  • 1
  • 2

下载repo工具:

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
  • 1
  • 2

(4) 选择合适的源码版本 
android源码除了大版本外还有很多小版本,例如:android-6.0.1_r62,6.0.1就是大版本号,r62就是小版本号,因此我们需要先确定好需要下载的版本号,具体有哪些版本请看下面的链接:

https://source.android.com/source/build-numbers.html#source-code-tags-and-builds

第一列是编译的代号,第二列是版本号,第三列是版本名称,最后一列是该版本支持的手机型号,请下载与你手机对应的版本,由于博主用的是nexus 6p,所以我下载的是最新的android-6.0.1_r62:

这里写图片描述

(5) 开始下载 
确定了版本号之后,首先创建文件夹,这里以版本号命名:

$ mkdir android-6.0.1_r62
$ cd android-6.0.1_r62
  • 1
  • 2

初始化repo,注意把 -b 后面改为你要下载的版本号:

$ repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r62
  • 1

使用下面的命令就可以开始下载了:

$ repo sync 
  • 1

但是,请先不要着急下载,由于下载过程中还会遇到各种各样的问题,所以我们需要创建一个自动下载脚本,确保出错了之后会自动执行repo sync,在android-6.0.1_r62下创建一个脚本down.sh,代码如下:

#!/bin/bash
repo sync  -j16
while [ $? = 1 ]; do  
        echo “======sync failed, re-sync again======”  
        sleep 3  
        repo sync  -j16
done 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在shell中执行下面命令:

chmod a+x down.sh
./down.sh
  • 1
  • 2

好了,开始下载源码了,整个源码大概有40G,建议在晚上下载。在没有下载完毕之前,源码的文件夹中只有一个.repo文件夹,这是正常的,等到所有源码下载完毕,其余文件夹就会出现,不要着急。下载完毕后如下图:

这里写图片描述

全部下载完后android-6.0.1_r62中文件如下:

这里写图片描述

(6) 备份源码 
源码下载完毕后,先不要着急着编译,我们先备份一下源码,万一玩坏了还可以推倒重来,否则又要辛辛苦苦下载一遍。博主一上来就直接压缩打包android-6.0.1_r62这个源码文件夹,结果发现有50多G,直接把磁盘爆掉了,于是又重新从windows下面分出空闲分区,然后调整Linux的分区,折腾了整整一天,后来解压的时候解压了半个小时还没有解压完,又把硬盘给爆掉了。仔细一想,不对啊,别人上传到网盘的源码只有7G左右啊,我的源码怎么这么大呢,后来发现都是.repo这个文件夹太大了,百度一下,发现这个文件夹只是与代码同步有关,并不影响编译,于是果断删掉之后,压缩打包源码,这次只有7G左右,而且删掉之后编译成功。下面我们来备份源码。 
首先删掉 .repo 文件夹,然后使用下面的命令:

cd ~
tar -zcvf android-6.0.1_r62.tar.gz android-6.0.1_r62/
  • 1
  • 2

压缩完毕后android-6.0.1_r62.tar.gz只有不到7G,如果你已经编译完了才备份代码,那么备份前请使用make clean来清除掉编译出来的文件,以便减小压缩后的体积。

下载完源码请务必删掉 .repo 文件夹,以便备份源码,同时防止编译时磁盘空间不够用

6 编译

关于android 6.0 的编译,请看我之前写的一篇博客,非常详细,这里不再赘述,博客地址如下,只补充两点:

[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程

(1) 下面三个库如果你安装失败了,不用管他,照样可以编译成功:

libncurses5-dev:i386
libreadline6-dev:i386
lib32ncurses5-dev
  • 1
  • 2
  • 3

(2) 在lunch的时候选择17,如下图所示:

这里写图片描述

aosp_angler-userdebug ,解释一下,angler是nexus 6p的代号(code name),每个设备对应的代号如下:

这里写图片描述

userdebug 是编译类型,含义如下:

这里写图片描述

user 用于正式产品 
userdebug 和user类似,但是有root权限,并且可以调试,主要用于调试 
eng 开发用的选项,配有额外的调试工具。

如果编译后只在模拟器上运行,则lunch时选择:1 
这里我们的目标是要编译后刷入nexus 6p,所以 lunch 时选择:17

如果你不知道lunch该选哪一个,请参考下面的链接,根据第三列选择编译选项:

https://source.android.com/source/running.html

上一张编译成功后的图:

这里写图片描述

7 驱动概述

如果只在模拟器中运行,到这里就结束了,但我们要把编译好的镜像刷入nexus 6p,首先得去官网下载工厂镜像(factory image)。

(1) 为何还要下载工厂镜像呢? 
前面我们提到了,只有nexus系列手机放出了驱动,所以我们需要去谷歌官网获取驱动。

(2) 驱动又是以什么形式放出的呢? 
在nexus 6p(5x)之前,例如nexus 5,驱动的二进制代码(当然不可能有源码啦)是压缩包的形式,下载后在aosp源码根目录下面解压,然后执行里面的sh脚本文件,接着编译全部源码就能编译出驱动镜像,谷歌一下都是这种方法,然而关于nexus 6p编译AOSP后刷机时驱动问题的资料就很少了,博主在这里卡了很长时间才搞清楚了nexus 6p刷入AOSP时如何刷入驱动的方法。

(3) 如何获取nexus 6p的驱动? 
从nexus 6p(5x)起,驱动都放在了专门的vender分区中,谷歌官网上只有工厂镜像,没有二进制文件的压缩包了。我们需要下载工厂镜像,然后提取出里面的vender.img镜像,刷入nexus 6p中就可以了。当然,经过实践发现,驱动问题可没这么简单就解决了哦。

8 刷机

(1) 首先到谷歌官网下载工厂镜像,下载地址如下:

https://developers.google.com/android/nexus/images

根据前面下载源码时候的编译代号(Build)来选择工厂镜像:

这里写图片描述

根据源码下载那一节,我们选择的android-6.0.1_r62版本对应的build是MTC20F,所以我们下载MTC20F的工厂镜像,博主将下载的文件保存在~/nexus6p目录中。解压后如下图所示:

这里写图片描述

(2) 配置adb命令 
刷机需要使用adb和fastboot两个命令,先下载Android SDK,下载地址如下:

Android SDK下载地址

打开~/.bashrc文件,在末尾追加下面的代码,注意替换成你的sdk路径:

export PATH=$PATH:/home/fuchao/Android/Sdk/tools
export PATH=$PATH:/home/fuchao/Android/Sdk/platform-tools
  • 1
  • 2

重新打开shell,输入adb命令,看看配置是否生效。

(3) 解锁bootloader 
bootloader可以简单理解为手机的bios,解锁bootloader之后才可以用fastboot命令刷机(线刷),相当于U盘重装系统,虽然不解锁也可以通过进入recovery模式的方法刷机(卡刷),相当于PE重装系统,但是强烈建议你解锁,因为解锁之后就不怕变砖了,万一玩坏了,最后还可以通过fastboot救回来,当然,解锁后就不能保修了,鱼和熊掌不可兼得嘛。刷机是个long long story,相关知识请看后面章节,我们先来操作。 
谷歌在nexus 6p的bootloader前面加了一个oem锁,所以先得解oem锁,才能再解bootloader锁。 
解oem锁很简单,开机进入设置、关于手机、连续点版本号6次,进入开发者模式,将OEM解锁选项打开,如下图所示:

这里写图片描述

建议一直打开OEM解锁,这样你就可以随时进入bootloader了,能够进入bootloader就不怕变砖了。 
接着解bootloader锁,在shell中输入下面命令进入bootloader:

adb reboot bootloader
  • 1

bootloader界面如图所示:

这里写图片描述

接着输入下面的代码解锁bootloader:

fastboot flashing unlock
  • 1

然后会看到下面的界面:

这里写图片描述

用音量+选择yes,电源键确认,解锁完成。 
解锁完毕后,开机会显示一个警告,请无视之,如图:

这里写图片描述

至此解锁完毕。

(4) 备份数据 
只需要备份联系人和短信就可以了,应用不需要备份,因为还原的时候太慢了,博主用的是360手机助手备份的。值得一提的是,如果你想备份Google App然后刷完机再还原,这是不行的,这不是谷歌全家桶的正确安装姿势。

(5) 刷机ing 
万事俱备,终于进入到了激动人心的刷机阶段了,首先进入解压后的工厂镜像文件夹中,博主的是~/nexus6p/angler-mtc20f:

cd ~/nexus6p/angler-mtc20f
  • 1

重启进入bootloader,接着执行flash-base.sh脚本:

adb reboot bootloader
./flash-base.sh
  • 1
  • 2

接着刷入驱动,解压 image-angler-mtc20f.zip 文件后进入image-angler-mtc20f文件夹:

unzip image-angler-mtc20f.zip
cd image-angler-mtc20f
  • 1
  • 2

刷入vernder.img:

fastboot flash vendor vendor.img
  • 1

驱动刷入完毕,接着就要刷入我们编译的其他镜像了,进入源码编译后生成的镜像目录android-6.0.1_r62/out/target/product/angler:

cd android-6.0.1_r62/out/target/product/angler
  • 1

依次执行下面的命令,分别刷入镜像:

fastboot flash boot boot.img
fastboot flash recovery recovery.img
fastboot flash system system.img
fastboot flash userdata userdata.img
fastboot flash cache cache.img
  • 1
  • 2
  • 3
  • 4
  • 5

好了,刷完之后重启就可以了:

fastboot reboot
  • 1

到这里就成功的刷入了我们编译的aosp啦,不过别高兴的太早,问题还在后头呢。

(6) 一次批量刷入 
到这里你应该明白了,其实刷机就是将我们编译出来的系统镜像和工厂镜像里面的vernder.img用fastboot命令写入手机中,那么我们可以将imge-angler-mtc20f中的镜像除vender.img以外全部替换成我们自己的,然后打包,用flash-all.sh脚本一次性刷入,省时省力,下面来操作。 
将imge-angler-mtc20f下的文件除vender.img外全部替换成我们的,如下图所示:

这里写图片描述

在imge-angler-mtc20f下将所有文件压缩打成包imge-angler-mtc20f.zip:

cd ~/nexus6p/angler-mtc20f/image-angler-mtc20f
zip image-angler-mtc20f ./*
  • 1
  • 2

这个时候在 imge-angler-mtc20f 文件下会产生一个 imge-angler-mtc20f .zip的文件,接着替换掉上级文件夹angler-mtc20f中的同名文件,如果你想保留官方镜像文件,只需要重命名一下官方zip包就可以了。接着执行flash-all.sh脚本:

cd ~/nexus6p/angler-mtc20f
./flash-all.sh
  • 1
  • 2

上一张一次刷入的图片:

这里写图片描述

(7) 原生AOSP 
刷机完毕,开机,原生android就呈现在你面前,是不是有点小激动外稍微又有点小失望呢,没有Google全家桶的AOSP丑的不是一点点啊,尤其是那个首页的Google搜索栏还停留在android 2.3的样式,相机和相册也是分分钟不想用啊,默认的声音简直是满大街山寨机即视感。作为谷歌粉的博主当然不能忍啦,但是别急,后面我们再来刷入Gapps,首先我们得解决一些”小”问题,你有没有发现原生aosp刷入nexus 6p后不能识别sim卡和蓝牙呢?也就是说,电话都打不了,每次开机都报个错误,说系统遇到一个问题,请联系设备制造商。下面我们就来解决这两个问题。

9 解决sim卡不识别问题

博主刷完aosp后遇到这个问题,sim卡怎么都识别不了,驱动明明已经刷好了呀,于是顺手百度了一下,结果差点吓尿,看到机锋论坛有人说是因为刷机前没有备份,把基带搞丢了,要返厂修理,于是赶紧看了下关于手机里面,基带一栏果然是空白的,吓的午觉都没睡好,这才刚买的手机呢不会就玩坏了吧?不管了,先喝口82年的雪碧冷静一下,然后开始谷歌大法,经过一天奋斗,终于解决了这个问题,擦,百度这个坑货。 
博主在这里找到了解决方法:

https://github.com/anestisb/android-prepare-vendor

出现这个问题的原因是,先看英文:

if vendor.img is not generated when system.img is prepared for build, a few bits are broken that also require manual fixing (various symbolic links between two partitions, bytecode product packages, vendor shared libs dependencies, etc.).

解释一下,vender.img的生成需要以system.img为前提,其中涉及到一些符号、变量、分区、vernder依赖的包等都需要system.img中的信息。也就是说,谷歌的工厂镜像中的system.img和我们自己编的当然不同啦,所以直接刷入工厂镜像的vender.img就会出现问题,需要我们自己生成vender.img。搞清楚了原因,下面我们就来解决它。 
首先下载这个工程:

git clone git@github.com:anestisb/android-prepare-vendor.git
  • 1

接着进入这个工程,执行下面的命令:

./execute-all.sh -d angler -b MTC20F -o $(pwd) -i ~/nexus6p/angler-mtc20f-factory-4355fe06.zip -k
  • 1

解释一下参数:

-d 后面是设备代号,nexus6p是angler
-b build id,分支编译时的代号
-o 输出目录
-i 下载好的谷歌工厂镜像路径
-k (不懂,好像是保持所有工厂镜像,优化数据)
  • 1
  • 2
  • 3
  • 4
  • 5

耐心等待程序执行完毕,如图所示,中间的那块是API,自己看英文:

这里写图片描述

执行完毕,会在我们的设备代号文件下,生成一个vender文件夹,例如博主的nexus6p生成的路径就是 angler/mtc20f/vender,接着我们要将这个vender文件夹复制到我们的android源码目录下面,注意:不要用GUI来操作,必须用命令,因为其中有些文件你没有权限

//复制所有文件到android源码下面
sudo cp ~/android-prepare-vendor/angler/mtc20f/vendor ~/android-6.0.1_r62/
//进入android源码目录
cd ~/android-6.0.1_r62
//改变vernder所有者为自己,防止编译的时候没有权限
sudo chown -R fuchao:fuchao ./vender
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

接着开始编译喽:

source build/envsetup.sh 
lunch           
make clean      
make -j8    
  • 1
  • 2
  • 3
  • 4

编译完毕,在android-6.0.1_r62/out/target/product/angler 下面就可以看到我们自己遍出来的vender.img啦,赶紧刷入试试吧。上一张博主编译好的图:

这里写图片描述

10 解决开机报错的问题

刷完AOSP每次开机都会报个错:

There’s an internal problem with your device. Contact your manufacturer for details

中文则是:

您的设备内部出现了问题,请联系您的设备制造商了解详情。

如下图所示:

这里写图片描述

报这个错的原因是,同样先看英文:

The problem occurs because of a check that google implemented in Android 5.1 which compares /system/build.prop with the values found in /vendor/build.prop. If they differ you get that error message. All one has to do to get rid of the error is to change the 3 values in /vendor/build.prop according to the values in /system/build.prop.

翻译一下:从android 5.1开始谷歌有个检查,这个检查会比较/system/build.prop和/vendor/build.prop这两个文件中的3个变量值,如果不一致则导致这个错误,解决方法是手动修改,让两个文件中的这几个变量保持一致。

听起来很复杂,其实解决方法很简单啦,将下面的压缩包放在sd卡上,然后进recovery安装就可以了:

vendor-build-prop-fix-signed.zip

博主是通过刷入twrp recovery后来安装这个压缩包的,如果你还不懂recovery是怎么回事没关系,看完后面的刷入Gapps章节后你就懂了。 
问题解决。

最后附上博主搜到的解决问题的xda上的帖子:

[FIX] build.prop variety fix (aka contact manufacturer problem)

作者说手动修改这些参数是很烦人的,于是他制作了这个压缩包,看他原话:

Doing this manually after every flash is cumbersome so I created an update-zip that corrects the values in /vendor/build.prop in a generic way (it should work no matter what rom you use). It mounts /system and /vendor, extracts the relevant information from /system/build.prop and creates a new /vendor/build.prop. I successfully tested it on my nexus 9 so I decided to release it to all of you.

当然每次刷入新的rom都要重复上面的操作:

Just install it via your recovery and you are done! This has to be done every time you flash a new rom

xda,你值得拥有。

11 刷入Gapps

好了,解决了前面两个问题,下面我们就来刷入谷歌全家桶喽。先科普一下,谷歌全家桶,指的是Google开发的一系列App和Google服务,包括: Google Play,Google Now,Google Service,Google Play,Google Driver等。由于终所周知的原因,Google Service不能像普通app那样安装,反正博主是没有安装成功,没有Google Service其余的Google App即使安装了也无法运行,所以必须使用Recovery的形式刷进去,所谓Recovery,你可以简单的理解为windows pe系统,这里博主推荐twrp recovery。去哪儿找哪些Google app呢?放心,早有第三方把谷歌一套收集打包好了,只等你刷进去了,这些包,行话叫Gapps,这里博主推荐OpenGapps。下面我们来刷入OpenGapps。

首先,到这里选择你的设备对应的twrp recovery版本去下载:

https://twrp.me/Devices

博主使用nexus6p下载地址:

Download twrp-3.0.2-2-angler.img

注意:一定要下载你的设备对应的twrp版本 
接着刷入twrp,先用adb reboot bootloader命令进入bootloader,接着用下面的命令刷入twrp:

fastboot flash recovery twrp-3.0.2-2-angler.img
  • 1

刷入twrp成功之后,接着我们去下载OpenGapps。OpenGapps的官网如下:

http://opengapps.org

平台选择Arm64。OpenGapps有很多版本,各版本介绍如下:

  • stock :最为贴近 Nexus 机型体验的 GApps 版本,包含了 Nexus 机型所预装的所有 Google 服务和 Google 应用。需要注意的是,这个版本会用 Chrome 、 Google Now Launcher 、 Google Keybord 等 Google 应用替换掉 CM 系 ROM 中那些基于 AOSP 代码的相关应用。
  • full :与 stock 版所包含的内容相同,但不会替换 AOSP 应用。
  • mini :包含了完整的 Google 服务框架和主流 Google 应用,去掉了 Google Docs 等文档处理应用
  • micro :包含了完整的 Google 服务框架和少数 Google 应用,如 Gmail 、 Google Calender 、 Google Now Launcher 。
  • nano :包含完整的 Google 服务框架但不包含多余的 Google 应用。
  • pico:包含了最基础的 Google 服务框架,体积最小,一些依赖完整 Google 框架的应用(如 Google Camera )将无法运行。

这里我们选择stock就行了,保持和官方预装的App一致。如下图:

这里写图片描述

然而,博主下载了很多次始终下载失败,这个OpenGapps实在很难下载成功,于是博主从下面的帖子中的百度网盘下载了一个:

http://tieba.baidu.com/p/4646253729

博主下载的文件是open_gapps-arm64-6.0-stock-20160701.zip,接着将这个文件放进手机的sdcard上,然后进入bootloader,按两下音量减键,看到recovery,电源键确认进入,此时屏幕下方会有一个滑动条,向右拉即可:

这里写图片描述

点击安装,选择我们放在sdcard上的Gapps,然后把滑动条拉到右边即可开始安装,

这里写图片描述

安装完毕,重启系统就可以了,第一次开机可能比较慢。如果开机后不停的弹框报错,请把菜单拉下来,然后点击设置进入应用,给Google Service打开所有权限就行了。

特别注意:刷完aosp后必须马上刷入Gapps,中途不能开机,否则会卡在开机Logo

12 root

root的原理就是把所有者为root的su文件放入系统文件/system/bin、/sbin等目录下,放入之后就拥有了root权限,但是这个放入过程需要root权限,所以这就是矛盾的地方,怎么想办法放进去呢?一般思路是利用系统的漏洞,例如具有root权限的进程对栈溢出,或者adbd提权漏洞等。但是漏洞越来越难找了,所以就有了下面recovery的方式,nexus6p的root方法很简单,用twrp将下面的SuperSu刷入就可以了,前面我们已经用twrp刷入了OpenGapps,这里OpenGapps换成SuperSu刷入就可以了,不再多说。 
SuperSu的下载地址如下:

SuperSU-v2.78 下载地址

13 正确的刷机顺序

好了,到这里主要步骤就讲完了,但是在实践中,博主发现,刷入我们自己编译的AOSP后,接着进入recovery刷入OpenGapps、刷入SuperSU完成root、刷入vendor-build-prop-fix-signed.zip 解决开机报错的问题,可是这样虽然成功的打开了系统,但是总是有很多APP报错,也就是说很多APP用不了,例如:百度外卖、猫眼电影、饿了么等点开就停止运行。这就很头疼,总不能拿着个砖头来装X吧,说好的各大厂商都要适配AOSP的呢?博主在刷了大概10次以后,终于找到了解决办法:进Recovery刷完后,要清除掉所有数据,包括虚拟机的缓存cache/Dalvik,博主估计是之前安装App后的字节码还在Dalvik的缓存中,与新的app冲突。所以正确的步骤如下:

  1. 拔掉SIM卡
  2. 刷入AOSP后接着刷入trwp-recovery,进入recovery后选择wipe,清除掉所有数据,包括cache/Dalvik。这一步是为了清除数据,同时为放入OpenGapps做准备。
  3. 开机进入AOSP,将OpenGapps、vendor-build-prop-fix-signed.zip两个文件放入Sdcard中,SuperSu以后再刷。
  4. 再次刷入AOSP和trwp-recovery,进入recovery刷入OpenGapps、vendor-build-prop-fix-signed.zip
  5. 刷完两个文件之后再清除掉所有数据,包括cache/Dalvik
  6. 开机进入系统,按照谷歌的安装向导来设置,并给谷歌服务所有权限。
  7. 插入SIM卡,这个时候应该可以识别sim卡了
  8. 再次进入recovery,刷SuperSU,root掉

到这里,基本上大部分APP都能运行了,像百度外卖、猫眼电影都可以运行了,然鹅,饿了么这货还是停止运行,博主打算留到以后再来研究,如果你解决了这个问题,或者找到了原因,欢迎给我留言。

14 实践记录

下面记录博主在实践过程中遇到的问题,以及怎么解决这些问题的心路历程。博主的体会就是:能用谷歌坚决不用百度这个渣渣。每当爆出一个error,如果全是英文的,博主就很happy,因为Google一下一定能搜到,如果是china特色的问题就很头大,例如:QQ,以及GFW。

(1) 源码下载失败问题 
博主在下载源码工程中遇到一个错误:

A TLS packet with unexpected length was received
  • 1

如图:

这里写图片描述

导致这个错误的原因是,谷歌对同一个IP的匿名访问次数有限制,解决方法是在下载源码前,配置谷歌的访问验证,也就是设置Git的cookie,具体参见上文。

(2) fastboot 卡在 waiting for device 
在使用fastboot命令刷入镜像的时候总是卡在waiting for devices

$ fastboot flash boot boot.img
   < waiting for device >
  • 1
  • 2

看看devices:

$ fastboot devices
   no permissions  fastboot
  • 1
  • 2

原来是fastboot没有权限,那就给fastboot增加权限:

$ whereis fastboot             //先看fastboot在哪儿
$ sudo chown root:root /bin/fastboot       //改为root用户所有
$ sudo chmod +s /bin/fastboot          //执行的时候就会自动拥有root权限
$ fastboot devices
   7D89BCD6        fastboot
  • 1
  • 2
  • 3
  • 4
  • 5

注意替换你的fastboot位置。

(3) nexus 6p的驱动问题 
编译完AOSP后,怎么处理驱动问题,博主在这里卡了很长时间,最开始,在谷歌的官网上看到了放出nexus二进制驱动的地方:

https://developers.google.com/android/nexus/drivers

但是,始终没有找到nexus 6p的二进制驱动,于是又看了很多编译Android 6.0的源码的博客,要么就是编译完了之后启动模拟器就结束了,要么就是刷入nexus 5的教程,直接在官网下载一个驱动包,解压后执行一个shell脚本,再编译就出现驱动了。 
后来,在这里看到一篇博客,知道了nexus 6p的驱动是在工厂镜像中:

http://www.jianshu.com/p/99ba74eda9c4

不过作者说的太简单了,又没有操作步骤。然后自己摸索,将vernder.img刷入nexus 6p,结果开机发现sim卡无法识别,百度一下,发现基带没了,尼玛,吓了一跳。赶紧谷歌,后来在这里发现了别人在谷歌论坛上提的问题:

With a custom AOSP build on the Nexus 5X (bullhead), the SIM Card fails to work

慢慢看,居然有人解决了,卧槽,赶紧试试,看中间那个叫 Jared Tsai 的说:

I found a solution in the github. 
https://github.com/anestisb/android-prepare-vendor

The script will download a Google factory image, extract necessary files, and create a vendor folder for aosp. 
Move the created vendor folder to aosp root and build the images again, the vendor.img will be in the out folder. 
Just flash all the images into device, the radio works as normal.

然后博主打开那个github后,就一脸懵逼了,尼玛,全是英文,不知所云,怎么用的也不写清楚,还好下面有个example,博主clone之后,执行了一下脚本,擦,各种参数说明都出来了,再对比一下example之后,嗯,so easy。 
然后再看上面 Jared Tsai 说的,把生成的vender文件夹复制到源码文件夹下,开编。擦,过一会儿报个错,说那个vender文件找不到target,无法编译,根据博主多年经验,这很明显是makefile文件无法识别嘛,于是又谷歌,在谷歌论坛上发现别人也有同样的问题,原因是复制的时候vender文件夹的文件丢失了,没有复制全,于是博主又在命令行下面用sudo来复制,然后修改所有文件的所有者为自己,这样再编译就ok了,终于编出来了,费了好大劲才解决驱动问题。

(4) 继续解决fuseext2的问题 
后来博主在家里面按照上面步骤操作的时候,在用anestisb/android-prepare-vendor这个工程来生成vender目录的时候,执行execute-all.sh这个脚本的时候遇到了下面这个问题:

这里写图片描述

仔细看报错:

fuse-ext2: command not found
  • 1

擦,在公司电脑上好好的,在家里的电脑就不行了,再看报错,挂载system.img的时候失败,怀疑是没有权限导致挂载失败,于是sudo来执行脚本,然鹅还是不行,遂谷歌一下,发现linux下面要读取android的镜像文件,必须借助fuse-ext2这个程序,接着找到fuse-ext2的github地址,然后clone下来,配置一下.bashrc,结果还是报同样的错,然后仔细看anestisb/android-prepare-vendor的github:

Required steps summary 
………………………… 
All scripts can be executed from OS X, Linux & other Unix-based systems as long as fuse-ext2 and other utilized command line tools are installed. Scripts will abort if any of the required tools is missing from the host

翻译一下,就是执行这个脚本前,系统必须安装好fuse-ext2和其他一些工具。好了,明白了,是因为fuse-ext2这个工具没有安装,接着谷歌后找到了按照命令:

sudo apt-get install fuseext2
  • 1

安装完毕,再接着执行脚本,解决问题。

(5) Open Gapps下载、刷入的问题 
博主开始安装Google Service时,打算用360手机助手,直接把刷机前备份的Google App还原到手机中,结果发现太慢了,几十分钟才还原了两个,总共有28个,遂无法忍受放弃了,然后又在360市场下载专门安装谷歌服务的App,结果这些谷歌服务安装器无一例外,全部安装失败,其结果就是不停的弹框报错,谷歌服务已停止运行。后来在下面这个地方知道了OpenGapps,这才了解了正确的安装姿势:

好马配好鞍,安装谷歌服务框架的正确姿势

虽然OpenGapps可以直接打开,但是下载OpenGapps却要翻&墙,博主下了4、5次,下着下着就没有速度了,有一次下载到99%就卡住了,实在不行放弃了,到OpenGapps的贴吧去下了一个别人上传到网盘的版本,解决问题。

接着刷入,然而,并不是一开始就成功了,刷完AOSP,解决完sim卡的问题,再来刷入OpenGapps,结果一开机就报错,说无法启动配置向导,然后不停的弹窗,无法忍受,接着百度,在机锋论坛看到别人的帖子,才知道刷完ROM,也就是我们编的AOSP后要马上刷入OpenGapps,不能开机,否则就会不停的弹窗报错。然而刷完之后,还是不停弹窗报谷歌服务已停止,再百度一下,给谷歌服务打开所有权限,世界就平静了,终于成功了。

(6) 刷机的问题 
刷机的水真是深啊,各种知识,各种概念,各种术语,什么卡刷,线刷,解锁,救砖,oem锁,bootloader锁,进recovery,双清,OTA升级,xposed,绿色守护等,博主补了一个上午,看贴吧、论坛才把这些概念搞懂了。非得要自己动手操作,才能体会这些东西。

15 总结

纸上得来终觉浅,绝知此事要躬行。终于把AOSP从谷歌官网下载、编译、刷入nexus 6p了,接下来就可以开始定制系统了。 

版权声明:本文为coffee520原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/coffee520/p/9639417.html