目录
前言
记录下如何编译安卓源码以及内核,刷入到手机的过程
一、下载原生系统到手机
弄了个NEXUS 6P,刚开始就想着刷下安卓原生的系统,折腾折腾。
从官网下载系统包 https://developers.google.com/android/images?hl=zh-CN
可以看到这个有两种类型,内容相同,封包方式不同(区别):
Full OTA Image : recovery模式下,可以放在sdcard上选择刷入(卡刷).OTA镜像,分为增量和全量包,增量包需要在特定的版本上使用
Factory Image : 通过fastboot来刷入(线刷),手机需要解锁
这里我选择,工厂镜像,刷入的步骤,官网上描述很详细.
- 先下载对应的包,右侧选择点击自己的机型,跳转后选择想刷入的系统版本,我这里随便选了个6.0.1 (MTC20L)版本
- 进行解锁 : 打开开发者模式调试ADB,通过ADB连接手机,adb reboot bootloader 进入Bootloader模式.fastboot devices查看下手机是否正常连接,fastboot flashing unlock解锁命令进行解锁
- 刷写命令 :可以执行下载下来镜像包自带的脚本来进行刷写.(查看脚本,理解刷写的顺序和内容)
注意:WIN可能无法连接手机,需要先安装驱动.https://developer.android.com/studio/run/win-usb.WIN环境下ADB、FASTBOOT工具
PS:fastboot 其他一些命令
数据清除命令:
清空 cache 分区 : fastboot erase cache
格式化内部存储数据 : fastboot format userdata
格式化设备全部数据 : fastboot -w
重启命令
重启到 BL 模式:fastboot reboot bootloader
重启设备:fastboot reboot
二、编译android源码刷入
1.编译环境
系统:ubuntu 14.04
安装JDK:Android6.0->OpenJDK7、Android6.0以上->OpenJDK8.
sudo apt-get install openjdk-7-jdk
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
JDK环境变量的设置(两种方式):
1.修改/etc/profile文件
2.修改人用户主目录下的.bash_profile文件
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-jdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
部分依赖安装:
sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev
sudo apt-get install m4
sudo apt-get install libxml2-utils
2.下载安卓源代码
(从清华大学的镜像站下载,下载步骤网站也描述的比较详细AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror):
下载repo工具,脚本文件,封装了下载Android源代码git命令(系统的python是2.x版本,可能需要使用旧版的repo工具).下载后需要放到/usr/local/bin下或者将repo所在路径添加到环境变量下.并将文件添加执行权限.
初始化仓库
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-6.0.1_r21 -b不指定版本的话,是最新的分支.版本及对应的标记:https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
切换分支 repo init -b android-6.0.1_r62
同步 repo sync
3.编译
source build/envsetup.sh(该步骤把envsetup.sh里的函数声明为当前会话终端可用的命令,初始化编译环境,并引入一些辅助的Shell函数)
build/envsetup.sh 中定义的常用函数
lunch,指定编译的目标设备以及编译类型.aosp_angler-userdebug.
angler是nexus 6p的代号(code name)
user 用于正式产品
userdebug 和user类似,但是有root权限,并且可以调试,主要用于调试
eng 开发用的选项,配有额外的调试工具。
4.运行
模拟器位于,prebuilts/android-emulator/linux-x86_64/emulator,可以指定运行文件,默认的运行文件不知道使用的哪个。编译结果如下图,单独将各img刷入手机即可(除boot.img和vendor.img)。
三、内核下载编译
Android源代码不包含Linux内核的源代码,需要单独下载编译.
下载:git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
cd msm
git branch -a 查看版本
git checkout 3.10.73-g8bac269(选择刷入安卓6.0.1 MTC20L 版本时,对应内核版本)
// 将交叉编译工具加入到路径中
# export PATH=$PATH:~/android-6.0.1_r62/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
// 设置目标架构
# export ARCH=arm64
# export SUBARCH=arm64
// 设置编联合编译方式,不要漏了最后边的“-”
# export CROSS_COMPILE=aarch64-linux-android-
// 目标硬件配置
# make angler_defconfig
# make
编译后的成果物是Image.gz-dtb、怎么刷入手机比较疑惑.百度了波,有说使用Android Image Kitchen工具将原生boot.img,解压后替换其中的boot.img-zImage,然后再重新打包.但是我解包boot.img后并没有发现boot.img-zImage.
最后采用方式
在路径kernel\msm\arch\arm64\boot中将编译生成的Image.gz-dtb复制到Android源码路径device\huawei\angler-kernel路径中nexus6p的代号为angler华为代工,故在以上路径.或者回到android源码根目录,进行环境设置
export TARGET_PREBUILT_KERNEL=kernel/msm/arch/arm64/boot/Image.gz-dtb
source build/envsetup.sh
Lunch 选择angler相关选项(如果需要编译其他内核,选择对应即可)
make bootimage -j4
总结
end