概述
很久很久已前,还是苹果,安卓,黑莓等多方等混战的时代,流传着这么一个段子
苹果: 我工艺精良
黑莓: 我辐射低,通话声音清楚
安卓: 我能刷机
苹果: 我速度快,运行流畅
黑莓: 我收发邮件快捷安全
安卓: 我能刷机
苹果: 。。。。
黑莓: 。。。。
安卓: 我能刷机
时至今日,硝烟散去,各大安卓论坛充斥着各种各样的刷机包,无一列外的是每个刷机包帖子后面都有一大波跟随者献上膝盖,直呼大神。你是否也想体验一把被人簇拥的感觉?不要慌,现在就手把手教你如果制作一个刷机包,让你装x让你飞。
闲扯
如果你想了解一下故事背景,请读完该章节,当然,直接跳过该章节也并不会影响制作刷机包。
本文会基于LineageOS来制作一个刷机包。Lineage你可能没有听说过,但是大名鼎鼎的CM(cyanogenmod)你一定听说过,它提供了很多原生系统没有提供的功能,例如主题切换、支持FLAC音频格式、超级用户权限、不含任何捆绑或间谍软件。依靠种种优势成为了当年最火的三方开源rom,并拥有一大批追随者,比如早期的miui,锤子的Smartisan OS, 一加的Color OS等都是基于CM来深度定制的。
那为什么我们不基于CM而是Lineage来制作呢? 因为,在 2016年12月23日,Cyanogen公司突然宣布关闭CyanogenMod的服务器,其创办人Steve Kondik也离开了该公司,背后真想不得而知,一颗星星瞬间陨落。
好消息是,就在隔天,也就是2016年12月24日,LineageOS正式启动,其源代码沿用了CM,成为了CM的继承者。
准备
既然是制作刷机包,那必须得
- 先选定一款手机。这里笔者选取的是Google Nexus 6,可以在某鱼上淘。
- Linux操作系统,建议8G ram, 100G storage (如果是Mac,还需要额外操作,请注意!)
- 耐心!
- 耐心!!
开始
环境配置
-
adb及fastboot下载, 下载成功后解压
unzip platform-tools-latest-linux.zip -d ~
,并配置到环境变量中,在~/.profile
末尾添加
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
PATH="$HOME/platform-tools:$PATH"
fi
执行source ~/.profile
生效。
- 接下来是下载编译android源码需要的编译链和代码管理工具
sudo aptitude intsall bc bison build-essential curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
这里使用了aptitude替代apt-get,因为aptitude能自动帮我们解决依赖关系,谁用谁知道。
- Java环境配置
因为这里是以android7.0为例,所以需要jdk-1.8以上,配置的具体方法 - Jack配置
由于jack是jdk1.8中的新的编译器,为了防止oom,需要将下面配置
export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4G"
添加到~/.bashrc
中
代码下载
考虑到GFW的问题,会尽量使用国内的源进行下载,但是以防万一,最好还是先配置好VPN。
- 由于代码是使用repo管理的,所以先下载repo,这里使用的是清华大学的镜像
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo
因为repo的运行过程中会尝试访问google的git源更新自己,如果不想每次翻墙更新可以配置为使用tuna的镜像源进行更新。
将export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
添加到~/.bashrc
末尾
- 建立源码目录
mkdir -r ~/android/lineage && cd ~/android/lineage
- 初始化下载源
repo init -u https://github.com/LineageOS/android.git -b cm-14.1
完成后会在当前目录下下载一个隐藏目录.repo
。 找到.repo/manifest.xml
文件,该文件是源码清单文件,里面声明了需要下载哪些文件以及下载源地址(有从github下载也有从aosp下载)。 因为github的源不需要翻墙,我们只需要关心aosp的源,在manifest.xml中找到下面代码
<remote name="aosp"
fetch="https://android.googlesource.com"
review="android-review.googlesource.com"
revision="refs/tags/android-7.1.2_r8" />
将fetch="https://android.googlesource.com"
改为
fetch="https://aosp.tuna.tsinghua.edu.cn"
即可。
- 下载源码
repo sync
执行完该句后就只需要静静的等待就可以了。由于代码巨大,所以中途失败是很正常的事情,失败后继续执行repo sync
直到成功即可。 - kernel下载
第四步成功后,你会发现源码中是不包含kernel和device文件的,还需要下载kernel和device相关代码。这部分会和你选择的手机密切相关,以Nexus 6为例。
source build/envsetup.sh
breakfast shamu
shamu是Nexus 6的Codename, 具体机型的codename可以参照对照表
执行完breakfast shamu
后,会自动下载对应kernel代码。如果自动下载失败,可以手动到Lineage的github找到相应kernel和device
注意:source build/envsetup.sh ,执行该脚本会添加许多帮助编译的命令,比如breakfast/mm/m/croot..等等,如果不执行该脚本后续无法编译
-
额外文件拷贝
你以为这个时候就算完了吗? 最开始笔者也是这么认为的,然后开始编译,奇葩的是并没有编译失败,然后刷机,就悲剧了。 刷机后开机会卡在kernel启动界面,根本不能进入到开机动画界面。
那是因为还需要一些额外的文件,而这部分文件LineageOs并没有在github上开源出来,而是直接提供的二进制文件。那我们去哪里找这些二进制文件呢?
唯一的解决办法是先把Nexus 6刷成LineageOs后,再从手机里面将二进制文件拷贝出来或者从官方现成的LineageOs刷机包中去取。这一步确实有点坑爹,感觉是一个先有鸡还是先有蛋的问题!!但是没有办法,寄人篱下不得不低头。
假设你已经刷好了Lineage7.0系统,现在将手机连接上电脑,执行~/android/lineage/device/moto/shamu/extract-files.sh
脚本,会自动帮你拷贝。其中extract-files.sh文件是在第5步中下载下来的。到这是不是发现这一切都是Lineage的圈套?!!需要拷贝的文件清单在~/android/lineage/device/moto/shamu/device-proprietary-files.txt
中。 - 坑
拷贝的过程中可能会失败,原因是找不到device-proprietary-files.txt中指定需要的文件,如果是这样就只需要在device-proprietary-files.txt中注释掉再执行extract-files.sh脚本就行了,反正正常的刷机包中也没有;)
编译
代码终于下载完成了,现在可以编译了
croot //回到跟目录
brunch shamu // 编译
编译完成后会在out/target/product/shamu
目录生成一个刷机包。比如叫做lineage-14.1-2017xx-UNOFFICIAL-shamu.zip
到这里,基本就结束了。
注意:croot和brunch是必在执行完source build/envsetup.sh脚本后才会添加到命令。
最后
一番折腾后,终于根据已有的包编译出了我们自己的包,这有什么意义呢?我想这个意义就是我们可以根据源码自行定制,创造一个属于自己的Rom。如果你有这样的想法,那么欢迎你来到程序员的世界。
网友评论