自己动手编译Android(LineageOS)源码
准备
设备:小米 MIX2
设备代号:chiron
Android版本:9.0
PC配置:
系统:Ubuntu18.04
至少12G RAM
至少200GB 剩余硬盘空间
良好的网络环境
开始
1.下载并解压SDK
sdk中包含fastboot和adb
下载
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
解压
unzip platform-tools-latest-linux.zip -d ~
添加到环境变量
gedit ~/.profile
输入:
# add Android SDK platform tools to path if [ -d "$HOME/platform-tools" ] ; then PATH="$HOME/platform-tools:$PATH" fi
保存。
使改动生效:
source ~/.profile
2.安装依赖
安装必要库和工具
sudo apt-get install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-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
安装openjdk-8-jdk
sudo apt install -y openjdk-8-jdk
3.配置源
创建repo存放目录
mkdir -p ~/bin
创建源码存放目录
mkdir -p ~/android/lineage
× 注:请确保该目录所在的磁盘有足够的空间(至少200G)
安装repo
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
将~/bin放入环境变量
gedit ~/.profile
加入:
# set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
使改动生效:
source ~/.profile
初始化repo
cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-16.0
× 注:这里的lineage-16.0是分支名,对应Android 9.0。更多分支请浏览:https://github.com/LineageOS/android
4.拉取源码
repo sync
5.配置源码
cd device/xiaomi
git clone https://github.com/LineageOS/android_device_xiaomi_chiron -b lineage-16.0 chiron
提取vendor信息
提取手机厂商的库。这一步将手机连接电脑,并保证手机能被adb
命令操控,还需要手机授予adb root权限。
adb shell su -c setenforce 0
cd chiron
./extract-files.sh
提取需要点时间,需耐心等待
第二种提取方式:
LineageOS官方的文档中使用的是一个脚本然后用adb从你的设备中提取vendor,我觉得这种方法太麻烦了,因为不一定是每一台设备都正好装了adb,比如说服务器上这种办法就不行了。
于是,在另外一篇博客教程上我找到了替代的方法,现在应该都是这样做的了。
github项目地址:https://github.com/TheMuppets
仓库中有一个清单的项目,里面提供了所有的清单,你只需要将对应你机型的厂商vendor的代码添加到LineageOS/.repo/local_manifests/roomservice.xml文件中就行了。
拉取kernel
cd kernel/qcom
git clone https://github.com/LineageOS/android_kernel_qcom_msm8998 -b lineage-16.0 msm8998
配置构建环境
source build/envsetup.sh
配置设备信息
breakfast chiron
6.配置构建工具
配置ccache
gedit ~/.bashrc
加入:
export USE_CCACHE=1
使改动生效:
source ~/.bashrc
执行:
ccache -M 50G
来设置缓存大小
× 注:ccache默认在home目录,请确保home目录有足够的空间。如果想自定义ccache的目录,可以在~/.bashrc文件里加入export CCACHE_DIR=/path/to/.ccache。缓存大小根据自己硬盘大小设置,设置25G以上可以显著提高源码的构建速度。
配置jack
gedit ~/.bashrc
加入:
export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx8G"
使改动生效:
source ~/.bashrc
7. 构建
构建整个源码
croot
brunch chiron
× 注:构建成功后,在源码目录执行cd $OUT进入编译好的ROM的存放目录。lineage-16.0-xxxxxxxx-UNOFFICIAL-chiron.zip为编译好的刷机包。
只构建某个模块
mmm <模块名>
例如构建frameworks中的base
mmm frameworks/base
打包成system.img
有时候我们只修改system里的模块,没必要编译整个源码,就只打包system.img
make snod
编译system
make systemimage
8.刷入手机(可选)
下载twrp
https://dl.twrp.me/chiron/
刷入trwp
刷入recovery前,要先解锁手机的bootloader,如何解锁,各个厂商不太一样,这里就不阐述了。
adb reboot bootloader fastboot flash recovery twrp.img fastboot reboot
刷入system.img
我们调试源码时,如果不想刷入整个ROM,可以只刷入system.img。以下命令将system.img刷入system分区
fastboot flash system system.img
刷入ROM
将编译好的刷机包,通过adb push命令将刷机包传输到手机存储。进入twrp界面,擦除system分区,data分区。选择手机存储中的刷机包,刷入!!!
9.常见问题
(1) 编译目标设备为emulatorx86时在编译时出错,提示yasm找不到。
安装yasm
sudo apt-get install yasm
(2) adb命令提示没有权限
lsusb
找到类似一行:
Bus 001 Device 005: ID 18d1:4ee7 Google Inc.
编辑51-android.rules:
sudo gedit /etc/udev/rules.d/51-android.rules
输入类似的内容:
# MIX2 normal SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="4ee7",MODE="0666",GROUP="plugdev" # MIX2 fastboot SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="d00d",MODE="0666",GROUP="plugdev"
×注:idVendor,idProduct分别为lsusb命令显示的ID。开机状态和fastboot模式都需要添加权限,所以,需要增加两行。
更改文件权限:
sudo chmod a+r /etc/udev/rules.d/51-android.rules
参考
https://wiki.lineageos.org/devices/chiron/build
https://www.htcp.net/741.html
https://www.isthnew.com/archives/build-lineageos.html
http://blog.csdn.net/luoshengyang/article/details/6566662/
https://www.cnblogs.com/luoyesiqiu/p/10701419.html