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版本进行安装。
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
- 使用您的真实姓名和电子邮件地址配置 Git。如果你设置了Git的配置则跳过这一步。
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
- 运行 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就可以了。不要按得太快,很容易跳了输入接受。。。。
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. 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,不然会报内存不足的编译错误。
编译的时候遇到的坑远远不止以上的问题,有些没有记录下来。。。
编译失败后,我都是重新手动删掉out目录,以避免出现更多的问题,然后重新运行上面的>设置环境步骤。
- 经过几天的努力与坚持,终于编译成功了,激动~~
使用 fastboot 刷机
首先,保证已经unlock解锁 可以正常刷机。具体怎么解锁Google一下。刷机前,请备份好个人重要的资料,刷机会将所有资料都会清空。 然后,连上电脑。 接着,在源码根目录下(就是下载源代码的目录)执行下面命令:
End
在这里整一个过程就结束了,但是这只是阅读源代码的一个新开始!接然的还有如何将AOSP导入到Android Studio进行阅读以及调试和如何阅读。虽然这个过程辛苦,但是这是值得的,一起加油努力学习~~
更多编译错误链接:https://ichrisking.github.io/2017/08/25/rom7.0-build/
Android 7.1.1系统源码下载、编译、刷机-Nexus 6实战的更多相关文章
- Android6.0源码下载编译刷入真机
编译环境是Ubuntu12.04.手机nexus 5,编译安卓6.0.1源码并烧录到真机. 源码用的是科大的镜像:http://mirrors.ustc.edu.cn/aosp-monthly/,下载 ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- 基于Android开发的天气预报app(源码下载)
原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...
- Android开发系列之系统源码目录
相信大家对于Google给出的那副经典Android架构图非常的熟悉,从下往上依次是Linux内核层(主要是负责硬件管理调度),HAL层(主要是硬件抽象层),libs层+Runtime,Framewo ...
- 基于java开发jsp+ssm+mysql实现的在线考试系统 源码下载
实现的关于在线考试的功能有:用户前台:用户注册登录.查看考试信息.进行考试.查看考试成绩.查看历史考试记录.回顾已考试卷.修改密码.修改个人信息等,后台管理功能(脚手架功能不在这里列出),科目专业管理 ...
- 【转】Android用NDK和整套源码下编译JNI的不同
原文网址:http://www.devdiv.com/android_ndk_jni_-blog-99-2101.html 前些天要写个jni程序,因为才几行代码,想着用ndk开发可能容易些,就先研究 ...
- MAC环境下 Android P 系统源码下载、编译、导入到AS、Pixel2xl刷机 实战
一.下载源码 1 . 确保主目录下有一个 bin/ 目录,并且该目录包含在路径中: mkdir ~/bin PATH=~/bin:$PATH 2 . 下载 Repo 工具,并确保它可执行: curl ...
- Android 11 源码下载+编译教程
下载AOSP源码 这里我使用的是外国语大学的镜像执行的下载,Mac系统的话,一定要在区分大小姐的磁盘下执行 repo init -u https://mirrors.bfsu.edu.cn/git/A ...
- android加固签名工具(源码下载)
背景 每次android加固了都要命令行签名好麻烦,正好之前做了个图标生成工具. 所以改了改,比写批处理还要省事. 原理 其实就是用winform程序调用控制台执行命令,android签名的命令如下 ...
随机推荐
- use tool wget for windows download
1.什么是wget Wget是一个在网络上进行下载的简单而强大的自由软件,其本身也是GNU计划的一部分.它的名字是"World Wide Web"和"Get"的 ...
- 日志采集框架Flume
前言 在一个完整的大数据处理系统中,除了hdfs+mapreduce+hive组成分析系统的核心之外,还需要数据采集.结果数据导出.任务调度等不可或缺的辅助系统,而这些辅助工具在hadoop生态体系中 ...
- CCF认证201803-1 跳一跳
import java.util.Scanner; public class Jump { public static void main(String[] args) { Scanner sc = ...
- SQL引用DAL
步骤:https://www.cnblogs.com/grom/articles/8981116.html 异常: 解决方案: 执行 ALTER DATABASE [DBName] SET TRUST ...
- ios开发遇到的问题
运行后界面空白,Xcode跳转到APPDelegate.swift文件提示如下 第一种可能原因: 做输出口后在代码中重新命名了输出口 解决方法: 右键控件关闭输出口的连接,变回+号,将它重新连到代码的 ...
- vue 复习(2)v-bind的应用 v-bind:classv-binf:style
dasdclass与style绑定v-bind 1. 绑定HTML Class 对象语法 有些时候我们想动态的切换class的类名.在原生的js或jq中我们就要通过事件来动态的改变class类名,但在 ...
- 安装mysql时出现initialize specified but the data directory has files in in.Aborting.该如何解决
eclipse中写入sql插入语句时,navicat中显示的出现乱码(???). 在修改eclipse工作空间编码.navicate中的数据库编码.mysql中my.ini中的配置之后还是出现乱码. ...
- bootstrap世界探索1——山川河流(文字排版)
世界到底是什么?其实世界很简单,正所谓一花一世界,一树一菩提,世界就在我们身边.造物神是伟大的,在我看来无论是HTML,css,js都可以看作是一个世界,但是他们是构成宏观世界不可或缺的,正如IU框架 ...
- No space left on device 解决 Cydia 安装应用错误
在 Cydia 上搜索应用进行安装,提示错误:failed to write (No space left on device),从字面上的意思看是磁盘空间不够,导致写入错误,但是到 “关于” 里看到 ...
- Redis 持久化深入--机制、可靠性及比较
本文是对 antirez 博客中 Redis persistence demystified 的翻译和总结.主要从Redis的持久化机制,提供何种程度的可靠性以及与其他数据库的比较三个方面进行讨论. ...