android源码编译7.1.2 for Nexus 6P手机

/ android / 4 条评论 / 1552浏览

前言

从2014年毕业到现在一直从事android开发,干过android app开发,也干过android framework开发。为了让自己能够更加方便对android系统有更深入的认识,所以决定从Google AOSP(Android Open Soure Proejct)上拉取源代码,自己编译android rom并刷入Nexus 6P手机。

准备条件

  1. ubuntu14.04LTS 64位;
  2. 内存>=8G;
  3. 硬盘空间>=200GB;
  4. 已解锁Bootloader的Nexus 6P手机一台;

科学上网

众所周知的原因,我们需要科学上网,以方便代码的拉取和相关资料以及问题的查询。从网上搜索的有的博文中说可以从国内某些镜像站拉取aosp代码,这个我没有尝试过。建议大家花钱购买稳定的科学上网途径,“有付出才有回报”。

安装openjdk8

android7.0以上的源码编译必须使用openjdk8。如果使用oracle jdk1.8则会导致编译错误。

sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
sudo apt-get install openjdk-8-jre

建议在安装前查看当前电脑是否安装了JDK,如果不是openjdk8,就建议卸载然后再重新安装。

tuzhao@tuzhao-linux:/$ java -version
openjdk version "1.8.0_141"
OpenJDK Runtime Environment (build 1.8.0_141-8u141-b15-3~14.04-b15)
OpenJDK 64-Bit Server VM (build 25.141-b15, mixed mode)

查看当前系统安装了哪些jdk:

sudo dpkg -l | grep 'jdk'

安装依赖

ubuntu14.04LTS必须安装以下依赖。

sudo apt-get install git-core \
gnupg flex bison \
gperf build-essential zip curl \
zlib1g-dev gcc-multilib g++-multilib \
libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev \
lib32z-dev ccache libgl1-mesa-dev \

如果要使用 SELinux 工具进行政策分析,还需要安装 python-networkx 软件包。

sudo apt-get install python-networkx

如果使用 LDAP 并且希望运行 ART 主机测试,还需要安装 libnss-sss:i386 软件包。

sudo apt-get install libnss-sss:i386

配置USB权限

查看/etc/udev/rules.d/51-android.rules文件中是否包含了以下内容:

#GROUP内容替换为你自己的group name。
#google
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="tuzhao"

安装repo命令

要安装repo,请执行以下操作:
1)确保当前用户主目录下有一个 bin/ 目录,并且该目录包含在路径中:

mkdir ~/bin  

在~/.bashrc文件中添加以下内容:

PATH=~/bin:$PATH  

重新加载一下当前的环境变量:

source ~/.bashrc  

2)下载 Repo 工具,并确保它可执行:

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


#对于 1.21 版,Repo 的 SHA-1 校验和为: 
   b8bd1804f432ecf1bab730949c82b93b0fc5fede  
#对于 1.22 版,Repo 的 SHA-1 校验和为:
   da0514e484f74648a890c0467d61ca415379f791  
#对于 1.23 版,Repo 的 SHA-256 校验和为:
   e147f0392686c40cfd7d5e6f332c6ee74c4eab4d24e2694b3b0a0c037bf51dc5  

查看当前repo命令的SHA-256校验值:

sha256sum repo

git设置

你必须有一个Google Gmail帐号,如果没有则可以创建一个。例如我的:tuzhaocn@gmail.com 。 然后进行下面的配置:

git config --global user.name "Your Name"
git config --global user.email "Your Gmail Account"

下载身份验证设置

默认情况下,访问 Android 源代码均为匿名操作。为了防止服务器被过度使用,每个 IP 地址都有一个相关联的配额。当与其他用户共用一个 IP 地址时(例如,在越过 NAT 防火墙访问源代码代码库时),系统甚至会针对常规使用模式(例如,许多用户在短时间内从同一个 IP 地址同步新客户端)触发配额。在这种情况下,可以使用进行身份验证的访问方式,此类访问方式会对每位用户使用单独的配额,而不考虑 IP 地址。

第一步是使用密码生成器生成密码,然后按照密码生成器页面中的说明进行操作。 https://android.googlesource.com/new-password
生成结果如下图所示: aosp git verify

将上图中的命令依次在终端中进行输入。可以查看~/.gitcookies文件验证是否设置成功。

第二步是通过使用以下清单 URI,强制使用进行身份验证的访问方式:
https://android.googlesource.com/a/platform/manifest。 请注意 /a/

下载代码

创建一个文件夹,我这里使用的是/data/aosp/这个目录,在这个目录中执行以下的操作:

repo init -u https://android.googlesource.com/a/platform/manifest -b android-7.1.2_r28

注意"android-7.1.2_r28",这个是我自己选取的一个android7.1.2的分支。
关于分支与android系统版本之间的对应关系,请看官方文档[代号、标记和细分版本号]:
https://source.android.com/source/build-numbers

当上面repo init操作执行完成以后,在/data/aosp/目录下就会有一个.repo文件夹。这个文件夹到时候会存放所有的git库。然后再执行下面的操作:

repo sync -j8

这个j8的意思就是启用多少个线程来进行同时的下载,官方的建议是当前cpu个数乘以2。然后就慢慢等待下载。"android-7.1.2_r28"这个分支大小大约有70G,我下载了12个小时了......Good Luck!

下载vendor驱动相关代码

上面的下载代码这一步完成以后,还需要下载vendor驱动相关的代码。
aosp中没有包含vendor相关的代码,所以需要另外下载。

地址:https://developers.google.com/android/drivers

比如我当前repo下载的分支为“android-7.1.2_r28”,而这个分支编译后对应的Build number为N2G48C,那么就需要在驱动网页中找到N2G48C对应的驱动。

Nexus 6P binaries for Android 7.1.2 (N2G48C)

然后将这块中的驱动全都下载下来。
我这里全部下载后有两个文件:

huawei-angler-n2g48c-e4620077.tgz
qcom-angler-n2g48c-926da06c.tgz

然后解压这两个文件,tar -zxvf xxx_file.tgz, 将解压后的两个sh脚本移动到aosp的代码根目录中。分别执行这两个sh文件,同意相关条款,然后就可以看见在aosp代码根目录中有一个vendor文件夹。这个文件夹就是用来生成vendor.img的。

为什么分支为“android-7.1.2_r28”编译后对应的Build number为N2G48C呢?
还是请看官方文档[代号、标记和细分版本号]:
https://source.android.com/source/build-numbers

执行编译

首先设置环境。

tuzhao@tuzhao-linux:/data/aosp$ source build/envsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips64/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/google/dragon/vendorsetup.sh
including device/google/marlin/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/linaro/hikey/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash

然后选择目标。

tuzhao@tuzhao-linux:/data/aosp$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. full_fugu-userdebug
     8. aosp_fugu-userdebug
     9. mini_emulator_arm64-userdebug
     10. m_e_arm-userdebug
     11. m_e_mips64-eng
     12. m_e_mips-userdebug
     13. mini_emulator_x86_64-userdebug
     14. mini_emulator_x86-userdebug
     15. aosp_dragon-userdebug
     16. aosp_dragon-eng
     17. aosp_marlin-userdebug
     18. aosp_sailfish-userdebug
     19. aosp_flounder-userdebug
     20. aosp_angler-eng
     21. aosp_angler-userdebug
     22. aosp_bullhead-userdebug
     23. hikey-userdebug
     24. aosp_shamu-userdebug

Which would you like? [aosp_arm-eng]

我这里修改了aosp默认的lunch选项,多了一个aosp_angler-eng这个选项。 怎么增加lunch选项呢?因为我的是Nexus 6P手机,所以编辑vim device/huawei/angler/vendorsetup.sh这个文件就行了。在其中加入下面这一行:

add_lunch_combo aosp_angler-eng

这是因为userdebug类型的编译后adb需要手动的执行adb root,而eng类型开机启动后默认就是root。 关于userdebug和eng之间的差异,请看官方文档:
https://source.android.com/setup/building#choose-a-target

最后编译代码。

#j8的意思同上
make -j8

这里放上一张我编译成功的图片。
aosp compile 查看原图

刷机

执行以下命令:

cd /data/aosp/out/target/product/angler

adb reboot bootloader

fastboot devices

#下面这条命令可选
#fastboot flashall -w
#-w 选项会清除设备上的 /data 分区;
#该选项在您第一次刷写特定设备时非常有用,但在其他情况下则没必要使用。

fastboot flash vendor vendor.img
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

来一张我刷机成功的图。

Nexus 6P

  1. 是否可以直接刷入boot.img? 类似6.0.1 以下的版本是可以的,只获取他的root权限

    回复
    1. @天涯

      理论上是可以的,用eng的boot替换user的boot,但是不推荐,我一般还是信任一套完整编译出来的eng版本。

      回复
    2. yy
      @tuzhao

      请问是否编译后diag端口就是开放的呢

      回复
    3. @yy

      如果是eng版本默认是开放的。

      回复