前言

首先,我没有编译成功,不知道为什么到90%左右报了以下东西,真的不知道怎么修了

[ 43% 14365/32989 55m24s remaining] Check prebuilt ELF binary: out/soong/.intermediates/vendor/xiaomi/sm8450-common/libgrpc++_unsecure_prebuilt/android_vendor_arm64_armv8-a-branchprot_shared/libgrpc++_unsecure_prebuilt.so
FAILED: out/target/product/unicorn/obj/SHARED_LIBRARIES/libgrpc++_unsecure_prebuilt_intermediates/check_elf_files.timestamp
/bin/bash -c "(rm -f out/target/product/unicorn/obj/SHARED_LIBRARIES/libgrpc++_unsecure_prebuilt_intermediates/check_elf_files.timestamp ) && (out/host/linux-x86/bin/check_elf_file 	    --skip-bad-elf-magic 	    --skip-unkn
own-elf-machine 	     	    --soname libgrpc++_unsecure_prebuilt.so 	    --shared-lib out/target/product/unicorn/obj/SHARED_LIBRARIES/liblog.vendor_intermediates/liblog.vendor.so --shared-lib out/target/product/unicorn/o
bj/SHARED_LIBRARIES/libc.vendor_intermediates/libc.vendor.so --shared-lib out/target/product/unicorn/obj/SHARED_LIBRARIES/libm.vendor_intermediates/libm.vendor.so --shared-lib out/target/product/unicorn/obj/SHARED_LIBRARIES/libc++.
vendor_intermediates/libc++.vendor.so --shared-lib out/target/product/unicorn/obj/SHARED_LIBRARIES/libdl.vendor_intermediates/libdl.vendor.so 	    --system-shared-lib libc --system-shared-lib libm --system-shared-lib libdl 	
--llvm-readobj=prebuilts/clang/host/linux-x86/clang-r536225/bin/llvm-readobj 	    out/soong/.intermediates/vendor/xiaomi/sm8450-common/libgrpc++_unsecure_prebuilt/android_vendor_arm64_armv8-a-branchprot_shared/lib
grpc++_unsecure_prebuilt.so ) && (touch out/target/product/unicorn/obj/SHARED_LIBRARIES/libgrpc++_unsecure_prebuilt_intermediates/check_elf_files.timestamp )"
out/soong/.intermediates/vendor/xiaomi/sm8450-common/libgrpc++_unsecure_prebuilt/android_vendor_arm64_armv8-a-branchprot_shared/libgrpc++_unsecure_prebuilt.so: error: DT_SONAME "libgrpc++_unsecure.so" must be equal to the file name
"libgrpc++_unsecure_prebuilt.so".
20:55:04 ninja failed with: exit status 1
There was 1 action that completed after the action that failed. See verbose.log.gz for its output.

failed to build some targets (10:16 (mm:ss))

最近心血来潮(也有可能是受够了你小米的垃圾优化了)于是想给手头的小米12s Pro刷个Lineage玩玩,但是找了一圈发现好像没有新版的,于是决定自己编译一个,编译过程可谓是一波三折,在这个过程里也解决了好多问题,于是想写个blog记录一下,哈哈哈

首先哈,编译的设备需要有device tree、vendor blob、kernel device tree这几个东西,相应的,还需要有当前机型对应的common文件以及module文件

然后,编译机的要求,我看网上大部分都在说至少200G的硬盘空间,在我自己的这台设备上肯定是不太够的,因为单拉了源码差不多就快200G了,然后在后面的编译过程中也发现硬盘的用量确实会比想象的要大很多,所以这里建议400G起步(至少我编译的时候给了300G是不够的)

因为unicorn这台机子的三方依赖还是挺全的,所以直接拉来用就可以了,因为过程中发现有东西少了,所以自己也加了点东西,之后会贴上,先来配置环境吧,这里挺简单的,基本上只是网络环境的毛病

开始配置环境

1.安装platform-tools(也就是adb)

这步我个人觉得可有可无吧,看你后面需不需要从设备提取blob,如果要提取的话那就装一下

Google下载好,然后拷贝到/home/用户名/(放哪随意,我是放在这了,因为专门装Linux也就是为了编这东西hhh)放好后解压

unzip platform-tools-latest-linux.zip -d ~

然后要把platform-tools添加到环境变量里,vi ~/.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 install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32readline-dev lib32z1-dev libelf-dev liblz4-tool lz4 libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev

安装libncurses5,官方说的好像是如果版本在23.10前的话只用装lib32ncurses5-dev libncurses5 libncurses5-dev,具体不太清楚

wget https://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2_amd64.deb && sudo dpkg -i libtinfo5_6.3-2_amd64.deb && rm -f libtinfo5_6.3-2_amd64.deb
wget https://archive.ubuntu.com/ubuntu/pool/universe/n/ncurses/libncurses5_6.3-2_amd64.deb && sudo dpkg -i libncurses5_6.3-2_amd64.deb && rm -f libncurses5_6.3-2_amd64.deb

Java的话,不同版本的LineageOS需要的版本是不一样的,详见官方,我这里要编译的是lineage-22.2,所以也不需要特别去安装,已经包含在source里了

Python也有要求,LineageOS 17.1+需要Python3,LineageOS 11.0-16.0则需要Python2,我这里Linux也自带了Python3,不需要特别去安装

3.创建目录

这里创建的是repo的存放处和源码的存放处

mkdir -p ~/bin
mkdir -p ~/android/lineage

~/bin目录用来存git-repo工具(repo)

~/android/lineage目录会用来下载LineageOS的源码

安装repo

用以下命令即可下载好repo并放到~/bin里

curl https://storage.googleapis.com/git-repo-downloads/repo -o ~/bin/repo
chmod a+x ~/bin/repo

将~/bin设置进环境变量

vi ~/.profile打开.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更新环境

3.配置Git

repo需要识别身份才能同步 Android,所以需要运行以下命令来配置git身份

git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git lfs install

4.开启缓存以加速以后的编译

如果你以后还需要为这台设备编译的话,可以开一下,可以加快编译的速度

export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache

然后vi ~/.bashrc把上面两行也塞到末尾去

好了之后需要设置一下缓存大小

ccache -M 50G

有必要的话你也可以启用一下ccache压缩,可能会降低性能,但是省点空间

ccache -o compression=true

初始化LineageOS存储库

终端输入以下内容来初始化存储库

cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b lineage-22.2 --git-lfs --no-clone-bundle

lineage-xx.x自己按需更改

之后,也确保在~/android/lineage目录内

repo sync

同步完成后你应该会看到sync successfully之类的字眼,如果一片红的话一般也是成功了,为了确保没问题再跑一次repo sync

有的库用了lfs去管理,同步完之后可以执行一下以下代码来防止出奇奇怪怪的问题

repo forall -c 'git lfs pull' 

提取Vendor Blob

我觉得这也是坑挺多的一步了,稍微不注意也会导致编译失败,因为Lineage自己维护的机型没我的机子,所以需要自己去找一下机子的dt(device tree),什么?你问我为什么不自己搓?问就是不会!

这步我想说的东西也挺多的,因为踩了很多坑,直到最后可能也是因为这里导致的编译失败

这里需要你自己补全的文件一共有5个,其中同时需要自己提取的文件有两个

以下是几个示例

这两个是设备的dt,用来build system
android_device_xiaomi_sm8450-common
android_device_xiaomi_unicorn
这是设备kernel的dt,用来build kernel
android_kernel_xiaomi_sm8450

注意,如果你的设备有modules的话,也需要一起拉到源码中

例如我的unicorn就有
android_kernel_xiaomi_sm8450-modules

之后,还需要一个hardware文件,这个主要是HAL层的一堆东西的,对于小米设备的话应该可以直接用Lineage官方的,在GitHub上有

android_hardware_xiaomi

假设你已经找到了你想要编译机子的dt,需要在sync的同时也一起拉好

只需要在.repo/local_manifests/roomservice.xml加一点东西(没有的话创建就好)

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <project name="cupid-development/android_device_xiaomi_sm8450-common" path="device/xiaomi/sm8450-common" remote="github"/>
  <project name="cupid-development/android_device_xiaomi_unicorn" path="device/xiaomi/unicorn" remote="github"/>
  <project name="cupid-development/android_kernel_xiaomi_sm8450" path="kernel/xiaomi/sm8450" remote="github"/>
  <project name="cupid-development/android_kernel_xiaomi_sm8450-modules" path="kernel/xiaomi/sm8450-modules" remote="github"/>
  <project name="LineageOS/android_hardware_xiaomi" path="hardware/xiaomi" remote="github" revision="lineage-22.2"/>
</manifest>

设置好之后

repo sync -c

也可以按需加上-j等参数哈

拉完后,就可以开始提取了

首先手机得有root哈,不管你是magisk还是ksu都可以,ksu的话记得给shell权限

手机连接上电脑,打开USB调试,到device/xiaomi/unicorn这个目录中,运行python3 extract-files.py

然后你会发现一堆问题:

1.找不到一个叫extract-utils的模块

这个好解决,运行以下命令,然后重新运行python3 extract-files.py

export PYTHONPATH=$HOME/android/lineage/tools/extract-utils

2.能运行起来,但是一堆红,而且在vendor/vendor_name/device_name下也没生成任何东西

这是一个小坑,几乎所有厂商的ROM都是production环境的,adb root用不了

然后你需要一个小东西在手机上运行一下这个东西,打开adb root

创建adbroot.sh,把下面的代码粘进去,给root,运行

if [[ `ps -A -o USER,CMD -ww | grep adbd |grep root` == "" ]];then
setenforce 0
resetprop ro.secure 0
resetprop ro.adb.secure 0
resetprop ro.debuggable 1
echo "adb进入root模式"
else
setenforce 1
resetprop ro.secure 1
resetprop ro.adb.secure 1
resetprop ro.debuggable 0
echo "adb退出root模式"
fi
stop adbd
start adbd

此处感谢:酷安@请输入新用户名99

运行完之后再跑python3 extract-files.py,现在应该就能正常提取了

提取好之后运行一下python3 setup-makefiles.py来生成配置文件

这步我不知道具体需不需要,至少我这么做了,或许也是因为这个所以失败了吧

接下来,到device/xiaomi/sm8450-common里,一样运行一下python3 extract-files.py

提取好之后一样运行一下python3 setup-makefiles.py来生成配置文件

到这里,准备环节基本就完事了

开始编译

1.进入编译环境

source build/envsetup.sh

2.准备编译文件

breakfast unicorn

3.回到源码目录

croot

4.开始编译

brunch unicorn

漫长的等待

理论来说编译成功了以后就可以直接拿出来用了(嗯)

cd $OUT

在这你就能看到编译出来的所有东西了,rec.img和一个zip刷机包,你可以用这个rec去刷机,也可以用twrp去刷机,都一样的(嗯)

好了,到这里的话我的心得就差不多完了。我也是第一次自己给一台设备去编译系统,估计很多地方肯定也不对,希望大家多多指点呀,当然,没成功还是有点不甘心,但是这几天的精力都花在这里了,有点余力不足了hhh,就这样啦,谢谢观看