一,下载源码
1,环境
>ubantu 16.04
>nexus6p
>git repo
>可以翻墙的网络
>大于100G的硬盘
2,安装软件
>安装git
sudo apt-get install git
>安装repo
1,首先创建bin文件夹
mkdir ~/bin
PATH=~/bin:$PATH
2,下载repo工具
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
3,选择合适的源码版本
https://source.android.com/source/build-numbers.html#source-code-tags-and-builds
如 下图,自行选择
3,下载源码
以源码版本号为名创建文件
$ mkdir android-6.0.1_r62
$ cd android-6.0.1_r62
初始化repo,注意把 -b 后面改为你要下载的版本号
$ repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r62
使用下面的命令就可以开始下载了
$ repo sync
但是,请先不要着急下载,由于下载过程中还会遇到各种各样的问题,所以我们需要创建一个自动下载脚本,确保出错了之后会自动执行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
在shell中执行下面命令:
chmod a+x down.sh
./down.sh
当出现下面的语句时,说明下载完成,通常需要几个小时
Syncing work tree :100% (456/456), done.
进入下面的目录可以看到我们编译的结果
cd /home/wendy/android-7.0.0_r17/out/target/product/angler
//angler 是产品名字,不一定相同
如下图中 system.img文件就是将来要刷入手机中
4,编译前准备
>更换软件源
首先打开文件
sudo gedit /etc/apt/sources.list
然后给文件的开始加入下面的内容
deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse
>安装依赖
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
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 lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
Ubuntu 16.04请务必使用上面的依赖,Ubuntu 16.04需要的依赖和Ubuntu 14.04所需要的依赖是不同的。
>关于java
根据自己编译的源代码版本对照下图决定使用JDK的版本,使用 java -version 查看Java版本
如果java版本不同,就需要重新安装
安卓7.0以上的源码编译需要java8
//正常来说命令行配置jre即可
sudo apt-get install openjdk-8-jre
//但我同时安装了jdk
sudo apt-get install openjdk-8-jdk
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
>关于jack的编译内存
开始之前加上这句语句
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"
5,开始编译
>导入编译Android源码所需的环境变量和其它参数:
source build/envsetup.sh
>运行lunch命令选择编译目标:
lunch
直接输入想要编译的目标序号就可以了
>关于编译目标的选择
编译目标的编号模板:平台名_手机型号代号_开发模式
手机型号代号需要自行查找
开发模式
user 用于正式产品
userdebug 和user类似,但是有root权限,并且可以调试,主要用于调试
eng 开发用的选项,配有额外的调试工具。
因此一般选用userdebug模式
>开始编译,执行make -j8, 8为同时编译的线程数,一般google推荐这个数字为2倍的cpu个数,博主使用的是8:
make -j8
关于cpu个数,可以用下面命令查看:
cat /proc/cpuinfo
好了 ,接下来就是不断地报错和上谷歌修改的过程了。
可能会出现的问题一:
terminating with uncaught exception of type std::bad_alloc: std::bad_alloc Could not build FEC data! Error: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc Out of space? the tree size of out/target/product/angler/system is (MB): 955 out/target/product/angler/system The max is 3072 MB.
ninja: build stopped: subcommand failed. 16:23:12
ninja failed with: exit status 1
解决方案:杀死java进程 在命令行输入pkill -9 java ,然后再从下图位置重新编译
source build/envsetup.sh
当出现下面的语句时说明编译完成了
make completed successfully
此时在 andriod6.0.1_r62/out/target/product/generic 目录中就会出现我们编译好的img文件
6,刷入手机
>首先到谷歌官网下载工厂镜像驱动,下载地址如下:
https://developers.google.com/android/nexus/images
这时你会看到同一型号手机的多种驱动,需要去之前选择源码的网站查看对应的编号, 如(NBDX09)
下载的文件保存在~/nexus6p目录中,进行解压。
>配置adb命令
刷机需要使用adb和fastboot两个命令,先下载最新Android SDK,下载地址如下:http://sdk.android-studio.org/
打开~/.bashrc文件,在末尾追加下面的代码,注意替换成你的sdk路径:
export PATH=$PATH:/home/fuchao/Android/Sdk/tools
export PATH=$PATH:/home/fuchao/Android/Sdk/platform-tools
重新打开shell,输入adb命令,看看配置是否生效。
>解锁bootloader
bootloader可以简单理解为手机的bios,解锁bootloader之后才可以用fastboot命令刷机(线刷),相当于U盘重装系统,虽然不 解锁也可以通过进入recovery模式的方法刷机(卡刷),相当于PE重装系统,但是强烈建议你解锁,因为解锁之后就不怕变 砖 了,万一玩坏了,最后还可以通过fastboot救回来。
谷歌在nexus 6p的bootloader前面加了一个oem锁,所以先得解oem锁,才能再解bootloader锁。
解oem锁很简单,开机进入设置、关于手机、连续点版本号6次,进入开发者模式,将OEM解锁选项打开。
接着解bootloader锁,在shell中输入下面命令进入bootloader:
adb reboot bootloader
用音量+选择yes,电源键确认,解锁完成。
解锁完毕后,开机会显示一个警告,请无视之
至此解锁完毕。
>开始刷机
首先进入解压后的工厂镜像驱动文件夹中,
重启进入bootloader,接着执行flash-base.sh脚本:
adb reboot bootloader
./flash-base.sh
接着刷入驱动,解压 image-angler-mtc20f.zip 文件后进入image-angler-mtc20f文件夹(mtc20f为驱动编号,不一定相同):
unzip image-angler-mtc20f.zip
cd image-angler-mtc20f
刷入vernder.img:
fastboot flash vendor vendor.img
驱动刷入完毕,接着就要刷入我们编译的其他镜像了,进入源码编译后生成的镜像目录
android-6.0.1_r62/out/target/product/angler:
cd android-6.0.1_r62/out/target/product/angler
依次执行下面的命令,分别刷入镜像:
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
好了,刷完之后重启就可以了:
fastboot reboot
>一次批量刷入
其实刷机就是将我们编译出来的系统镜像和工厂镜像里面的vernder.img用fastboot命令写入手机中,那么我们可以将imge- angler-mtc20f中的镜像除vender.img以外全部替换成我们自己的,然后打包,用flash-all.sh脚本一次性刷入,
cd ~/nexus6p/angler-mtc20f/image-angler-mtc20f
zip image-angler-mtc20f ./*
在imge-angler-mtc20f下将所有文件压缩打成包imge-angler-mtc20f.zip:
cd ~/nexus6p/angler-mtc20f/image-angler-mtc20f
zip image-angler-mtc20f ./*
这个时候在 imge-angler-mtc20f 文件下会产生一个 imge-angler-mtc20f .zip的文件,接着替换掉上级文件夹angler-mtc20f中的同名文件,如果你想保留官方镜像文件,只需要重命名一下官方zip包就可以了。接着执行flash-all.sh脚本:
cd ~/nexus6p/angler-mtc20f
./flash-all.sh
等待完成即可