Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战

想成为一位合格的Android程序员或者一位Android高级工程师是十分有必要知道Android的框架层的工作原理,要知道其工作原理那么就需要阅读Android的源代码。 想要阅读Android的源代码最爽的方式的肯定是自己亲手下载编译。为什么要阅读Android源代码? 第一,面试加分项。第二,知其原理写出的代码差不到那里。第三,学习深度。正所谓,知其然知其所以然。下面记录我基于7.1.1系统源码下载到刷机的过程。

基本概念

  • AOSP : 就是Android Open Source Project也就是谷歌开放源代码项目。 通过Google官方下载的源代码也就是AOSP的代码,是不包含Google开发的全家桶的应用。
    ps: 这个作为一个Android程序员肯定要知道的一个专业词,不然显得你很Low,很不专业。
  • Repo : Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git,换句话来说Repo是用来管理Git管理的每个仓库。详情定义请点击here.

准备

  • 编译系统:UbuntuKylin 16.04 LTS。
  • 手机:Nexus 6。
  • 驱动:Nexus 6驱动。
  • Android系统:Android 7.1.1。

注:从Android官网上是否有支持该手机的系统源代码和驱动程序。

搭建编译环境

1.安装 JDK

如果 Ubuntu >= 15.04,则可以运行以下命令进行安装OpenJDK,这里使用的是OpenJDK. 之前准备使用Ubuntu LTS 14.04版本编译,但是安装OpenJDK有点麻烦所以放弃使用Ubuntu LTS 14.04。

sudo apt-get update
sudo apt-get install openjdk-8-jdk

如果你不是编译Android 7.1.1系统源码,那么可以参考图中的Android版本所对应的JDK版本进行安装。


Android系统版本对应的JDK

2.主要软件包

  • Python : Python 2.6 - 2.7.
  • Git : Git 1.7 或更高版本.

下载源代码

我这里下载的Google官方的AOSP, 下载官方的需要科学上网并且保证你的网络稳定。具体在清华大学开源软件镜像站的AOSP,可以参考这里的设置here

  • 安装 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
  • 初始化 Repo 客户端

安装 Repo 后,设置您的客户端以访问 Android 源代码代码库:
1 . 创建一个空目录来存放您的工作文件。

$ mkdir AndroidSource // AndroidSource这个是我自己命名存放源代码的目录名称
$ cd AndroidSource
  1. 使用您的真实姓名和电子邮件地址配置 Git。如果你设置了Git的配置则跳过这一步。
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
  1. 运行 repo init进行初始化。以下-b进行检出相对应的分支,要查看分支列表,请参阅源代码标记和编译版本
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57

初始化成功后,客户端目录中现在应包含一个 .repo 目录,清单等文件将保存在该目录下。

下载 Android 源代码树

然后将 Android 源代码树从默认清单中指定的代码库下载到工作目录,运行以下命令:

$ repo sync

在下载的时候保证网络的稳定性,保证电脑设置了不休眠,可以晚上放着让它下载。下载完大概30G左右。
下载源码出现的问题不会太多,有问题的话大多数为网络的问题,真正出问题最多的是源代码的编译,那简直就是恶梦。

准备编译

下载专有二进制文件

我需要将编译的源代码刷到Nexus6,所以需要下载Nexus6的相对应的驱动。
具体找到系统版本对应手机型号相对应的驱动二进制文件可以在这里找到here

二进制驱动文件

然后将这三个压缩包下载后,解压缩得到三个sh文件。
将这三个sh文件copy到Android编译目录下。

$ ./extract-broadcom-shamu.sh
$ ./extract-moto-shamu.sh
$ ./extract-qcom-shamu.sh

运行以上命令后会显示声明信息,一直按回车,当你看到以下信息就输入:I ACCEPT就可以了。不要按得太快,很容易跳了输入接受。。。。


图片.png

Jack配置

Jack 是一种 Android 工具链,用于将 Java 源代码编译成 Android dex 字节码。要使用 Jack,您只需使用标准的 Makefile 命令来编译源代码树或您的项目即可,无需进行任何其他操作。Android 8.1 是使用 Jack 的最后一个版本。

2017 年 3 月 14 日公告发布之后,Jack 工具链已被弃用。Jack 是 Android 6.0–8.1 的默认 Android 编译工具链

如果你编译AOSP的master分支,以及Android O及以后版本,Android提供了禁用的支持。具体可以参考 here

在编译7.1.1源码的时候,我并没有查怎么关闭Jack编译。所以,需要检查一下Jack-Server是否已经安装以及启动。

  • 根据机器的RAM设置Jack-Server的VM大小,我机器是16G内存,所以设置8G左右VM。
    修改prebuilts/sdk/tools/jack-admin 文件,找到变量JACK_SERVER_VM_ARGUMENTS位置在后面添加,添加参数 -Xmx8000M

  • 进入prebuilts/sdk/tools 运行以下命令:

$ ./jack-admin start-server 
  • 如果提示没有安装的话,则运行以下命令,然后再次运行上面启动jack-server的命令。
$ ./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar 

保证Jack-Server服务启动。不然在编译的时候会遇到Jack-Server很多坑的。。。

设置环境

使用 envsetup.sh 脚本进行初始化环境。

$ source build/envsetup.sh

使用 lunch 选择要编译的目标。

$ lunch

运行以上命令后,会列出当前所有的Build Type,然后输入23。这里我选择23. aosp_shamu-userdebug,这个Build Type是可以调试,所以建议你选择userdebug。具体可以参考这里的解析 here

编译代码

make -j8 //-j8是并行的任务数,根据机器CPU的内核线程数来设置。

编译过程遇到的问题

  • 编译百分比之0就报出来的错误,m4没有安装。
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -o/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll"
flex-2.5.39:严重内部错误,exec of /usr/bin/m4 failed
[  0% 8/49773] Yacc: aidl <= system/tools/aidl/aidl_language_y.yy
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/bison/bison -d  --defines=/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.h -o /home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.cpp system/tools/aidl/aidl_language_y.yy"
[  0% 8/49773] host C++: ijar <= build/tools/ijar/classfile.cc
ninja: build stopped: subcommand failed.
build/core/ninja.mk:151: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1

解决方法:

sudo apt-get install m4
  • 编译百分之一的时候报的错误,bison 没有安装。
编译错误1

解决方法:

1. sudo apt-get install bison
2. sudo apt-get install  g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
  • 其中编译过程有Jack-Server也报的问题,有没有安装,没有启动的问题,那时候急着解决问题,所以没有相对应的截图。所以我在上面也写保证Jack-Server先安装启动,不然在后面的编译7.1.1源码会报错。在编译的过程中,我的机器暂时没有报Jack-Server内存不足的错误。如果你使用虚拟机进行编译时,内存至少要8G,不然会报内存不足的编译错误。
Jack-Server错误.png
图片.png

编译的时候遇到的坑远远不止以上的问题,有些没有记录下来。。。

编译失败后,我都是重新手动删掉out目录,以避免出现更多的问题,然后重新运行上面的>设置环境步骤。

  • 经过几天的努力与坚持,终于编译成功了,激动~~


    编译成功后的提示.png

使用 fastboot 刷机

首先,保证已经unlock解锁 可以正常刷机。具体怎么解锁Google一下。刷机前,请备份好个人重要的资料,刷机会将所有资料都会清空。
然后,连上电脑。
接着,在源码根目录下(就是下载源代码的目录)执行下面命令:

$ adb reboot bootloader //进入bootloader模式
$ fastboot -w flashall  //使用fastboot进行刷机
开始刷机.png
刷机已完成.png

End

在这里整一个过程就结束了,但是这只是阅读源代码的一个新开始!接然的还有如何将AOSP导入到Android Studio进行阅读以及调试和如何阅读。虽然这个过程辛苦,但是这是值得的,一起加油努力学习~~

更多编译错误链接:https://ichrisking.github.io/2017/08/25/rom7.0-build/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容