自己动手编译Android(LineageOS)源码

站长4年前 (2020-10-20)安卓刷机6243

准备

  • 设备:小米 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

相关文章

免ROOT停用小米手机系统应用

免ROOT停用小米手机系统应用

对于未解锁的手机,总存在那么一些我们用不到,甚至看都不想看到的应用,但是没办法卸载,在这里提供一些禁用掉这些应用的方法供参考:本内容是以小米的MIUI系统为例,其他品牌机型不确保可以成功,毕竟系统应用...

手机混用闪存到底是真是假?教你查手机闪存型号

手机混用闪存到底是真是假?教你查手机闪存型号

最近,网上传言某手机混用闪存,将UFS 3.0和UFS 3.1的闪存混用在了同一型号的机器上,买不同容量的手机,闪存协议不一样。光从这个描述来看,这做法相当不厚道,消费者买手机等于抽奖。但这到底是不是...

nubiya努比亚Z17mini Bootloader解锁及工具

网上搜了一圈都没有类似文章,努比亚果然小众啊!1,批处理如下@echo off echo *****    欢迎使用Bootloader&...

miui12申请答题答案大全

miui12内测申请已经开启了,以前没有申请过内测的用户需要先答题之后才能获得内测资格,不过这些试题是很有难度的,这里为大家带来有关试题答案大全。Tips:电脑端用户可以使用【Ctrl+F】进行快捷搜...

小米手机解锁BL跳过168小时方法大全

小米手机解锁BL跳过168小时方法大全

大家都知道小米手机解锁Bootloader需要在手机上登录绑定小米账号至少168小时,那么如何快速跳过这个168小时呢,有以下几种方法。1. 默默等待168个小时。2. 去小米社区申请内测。首先我们拿...

『干货』如何用手机给另一部手机刷机

『干货』如何用手机给另一部手机刷机

 .所需设备  小米8: 控制机、刷机端,要求使用Magisk进行了Root。红米8A:被控机、被刷机端。双头type-c线或者otg连接普通的type-c线。....

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。