想成为一位合格的 Android 程序员或者一位 Android 高级工程师是十分有必要知道 Android 的框架层的工作原理, 要知道其工作原理那么就需要阅读 Android 的源代码. 想要阅读 Android 的源代码最爽的方式的肯定是自己亲手下载编译. 为什么要阅读 Android 源代码? 第一, 面试加分项. 第二, 知其原理写出的代码差不到那里. 第三, 学习深度. 正所谓, 知其然知其所以然. 下面记录我基于 7.1.1 系统源码下载到刷机的过程.
基本概念
AOSP https://source.android.com/ : 就是 Android Open Source Project 也就是谷歌开放源代码项目. 通过 Google 官方下载的源代码也就是 AOSP 的代码, 是不包含 Google 开发的全家桶的应用.
ps: 这个作为一个 Android 程序员肯定要知道的一个专业词, 不然显得你很 Low, 很不专业.
Repo https://code.google.com/archive/p/git-repo/ : Repo 是一款工具, 可让您在 Android 环境中更轻松地使用 Git, 换句话来说 Repo 是用来管理 Git 管理的每个仓库. 详情定义请点击 here https://code.google.com/archive/p/git-repo/ .
准备
编译系统: 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 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ .
安装 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 进行检出相对应的分支, 要查看分支列表, 请参阅源代码标记和编译版本 https://source.android.google.cn/setup/start/build-numbers.html#source-code-tags-and-builds .
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57
初始化成功后, 客户端目录中现在应包含一个 .repo 目录, 清单等文件将保存在该目录下.
下载 Android 源代码树
然后将 Android 源代码树从默认清单中指定的代码库下载到工作目录, 运行以下命令:
$ repo sync
在下载的时候保证网络的稳定性, 保证电脑设置了不休眠, 可以晚上放着让它下载. 下载完大概 30G 左右. 下载源码出现的问题不会太多, 有问题的话大多数为网络的问题, 真正出问题最多的是源代码的编译, 那简直就是恶梦.
准备编译
下载专有二进制文件
我需要将编译的源代码刷到 Nexus6, 所以需要下载 Nexus6 的相对应的驱动.
具体找到系统版本对应手机型号相对应的驱动二进制文件可以在这里找到 here https://developers.google.cn/android/drivers .
二进制驱动文件
然后将这三个压缩包下载后, 解压缩得到三个 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 的最后一个版本.
- [ 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 bison
- sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev
- $ adb reboot bootloader // 进入 bootloader 模式
- $ fastboot -w flashall // 使用 fastboot 进行刷机
来源: https://juejin.im/entry/5b79542c6fb9a019fb5150c9