美文网首页
记一次折腾的lineageOS编译

记一次折腾的lineageOS编译

作者: HAPPYers | 来源:发表于2020-03-27 21:33 被阅读0次

    本来AOSP也是编译完了,但只能跑在模拟器上。由于没有谷歌亲儿子,打算利用一下手上的一批老年机。从小米、魅族,华为、三星等等各种找到的手机里面最后选择了三星S4(因为它的电池非常好)。

    因为后期需要修改安卓系统的源码,所以要找开源且社区活跃一些的os。开始一波搜索,除了AOSP以外,活跃且开源的Android OS屈指可数。最后选择了lineage OS,这是基于已经不再维护的CM系统继续开发的,而且适配的机型相当多。

    源码准备

    首先就是去官网找对应机型的安装说明。
    比如这是S4的build说明
    前面的步骤和AOSP编译步骤一样,安装一些依赖库

    sudo apt install -y 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具体版本看os的要求。装好之后用update-alternative配置好java,javac,jar路径。

    这里百度网盘上传了openjdk-11.04_linux.tar.gz的版本
    链接:https://pan.baidu.com/s/10gGqdTC5JAawWe8VtjH2DQ
    提取码:n7b1

    而后创建源码目录

    mkdir -p ~/android/lineage
    

    然后安装repo (连不上可以用清华源)

    sudo curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo
    chmod a+x /usr/bin/repo
    

    开始初始化

    cd ~/android/lineage
    repo init -u https://github.com/LineageOS/android.git -b lineage-16.0
    

    init后修改一下.repo/manifests/default.xml文件

      <remote  name="github"
               fetch=".."
               review="review.lineageos.org" />
    

    修改为

      <remote  name="github"
               fetch="https://github.com/" />
    
      <remote  name="lineage"
               fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"
               review="review.lineageos.org" />
    
      <remote  name="aosp"
               fetch="https://android.googlesource.com"
    

    修改为

      <remote  name="aosp"
               fetch="https://aosp.tuna.tsinghua.edu.cn"
    
      <default revision="..."
               remote="github"
    

    修改为

      <default revision="..."
               remote="lineage"
    

    修改完之后的前半部分:

    <?xml version="1.0" encoding="UTF-8"?>
    <manifest>
    
      <remote  name="github"
               fetch="https://github.com/" />
    
      <remote  name="lineage"
               fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"
               review="review.lineageos.org" />
    
      <remote  name="private"
               fetch="ssh://git@github.com" />
    
      <remote  name="aosp"
               fetch="https://aosp.tuna.tsinghua.edu.cn"
               review="android-review.googlesource.com"
               revision="refs/tags/android-9.0.0_r46" />
    
      <default revision="refs/heads/lineage-16.0"
               remote="lineage"
               sync-c="true"
               sync-j="4" />
    

    然后下载源码

    repo sync -c -j8 --no-clone-bundle
    
    • --no-clone-bundle 可以避免bundle的警告
    • -c仅同步当前分支
      如果网络波动大,可以用下面的脚本
    #!/bin/bash  
    echo "======start repo sync======"  
    repo sync -j8 -c
    while [ $? = 1 ]; do  
            echo "======sync failed, re-sync again======"  
            sleep 3  
            repo sync -j8 -c
    done 
    

    下载好的repo初始化包
    链接:https://pan.baidu.com/s/1SVTfeLiwT9uiVgBYPTfhiA
    提取码:12pt
    下载解压后直接repo sync -l一遍就能提取源码了。

    提取proprietary blobs

    可以从已经安装lineageOS的同机型设备中提取(https://wiki.lineageos.org/devices/jfltexx/build#extract-proprietary-blobs)。
    还可以从全量包或者OTA包中提取。这里采用后者,更加方便。
    方法参见https://wiki.lineageos.org/extracting_blobs_from_zips.html
    首先下载对应设备的lineageOS全量包,
    然后

    mkdir ~/android/system_dump/
    cd ~/android/system_dump/
    

    然后提取

    unzip path/to/lineage-*.zip system.transfer.list system.new.dat*
    

    如果提取出来的文件有system.new.dat.br(a brotli archive),要先用brotli来解压

    sudo apt-get install brotli
    brotli --decompress --output=system.new.dat system.new.dat.br
    

    然后用sdat2img脚本转换镜像

    git clone https://github.com/xpirt/sdat2img
    python sdat2img/sdat2img.py system.transfer.list system.new.dat system.img
    

    然后挂载镜像

    mkdir system/
    sudo mount system.img system/
    

    而后就能在编译目录中提取blob了

    cd  ~/android/lineage/device/samsung/jfltexx 
    ./extract-files.sh ~/android/system_dump/
    

    然后所有的blob就会提取到~/android/lineage/vendor/samsung中了。注意,这里给extract-files.sh传的路径并不包括system目录,因为这个脚本内部会自动去找传入目录下的system目录。
    最后取消挂载

    sudo umount ~/android/system_dump/system
    rm -rf ~/android/system_dump/
    

    验证源码

    这一步是验证之前所有工作的成功与否了。如果有源码确实的错误,例如缺少***mk,可能是之前源码sync没有完整,建议重新repo sync -c一遍(速度还是很快的),也可能是blob没有提取出来。
    对于三星S4

    source build/envsetup.sh
    breakfast jfltexx
    

    如果没有报错,那么就成功了一半了。

    编译

    使用ccache加速编译过程(用空间换时间)

    sudo apt install ccache -y
    

    然后设置大小

    export USE_CCACHE=1
    ccache -M 50G
    export CCACHE_COMPRESS=1
    

    可以把export加到bashrc文件中。

    关于给ccache的大小,官方的原文
    where 50G corresponds to 50GB of cache. This needs to be run once. Anywhere from 25GB-100GB will result in very noticeably increased build speeds (for instance, a typical 1hr build time can be reduced to 20min). If you’re only building for one device, 25GB-50GB is fine. If you plan to build for several devices that do not share the same kernel source, aim for 75GB-100GB. This space will be permanently occupied on your drive, so take this into consideration.
    You can also enable the optional ccache compression. While this may involve a slight performance slowdown, it increases the number of files that fit in the cache. To enable it, run:

    NOTE: If compression is enabled, the ccache size can be lower (aim for approximately 20GB for one device).

    然后开始编译吧(中途如果提示少包,就按照提示装上即可。如果预装了本文开头的包,那就没问题了)

    croot
    brunch jfltexx
    

    注:注意一下我的java版本号


    如果要给build签名,参见https://wiki.lineageos.org/signing_builds.html

    最后编译成功的话,会显示

    #### build completed successfully (01:06 (mm:ss)) ####
    

    然后去生成目录看一眼

    cd $OUT
    

    这其中的lineage-16.0-20200327-UNOFFICIAL-jfltexx.zip就是卡刷包了。recovery.img是对应的recovery镜像。

    刷入recovery

    为了把卡刷包刷入手机,一个好用的recovery必不可少。听网上有说lineageOS的那个recovery不太好刷,而且我之前给小米用的也是TWRP,所以这里就给三星S4刷TWRP了。

    TWRP可以在这里找到对应的包。但是我找了对应s4的,结果只找到一个app,提示说要用app去下载对应的包,太麻烦了。于是百度上搜到一个适用于S4(l905/l908的高通版本)的TWRP

    S4(l905/l908的高通版本)的TWRP传到百度网盘了
    链接:https://pan.baidu.com/s/1imUT-pGiLjaX1Ji80ay0aA
    提取码:wk3v

    给三星手机刷入recovery的方法参见lineageOS官方
    https://wiki.lineageos.org/devices/jfltexx/install

    因为三星的fastboot和别的手机不太一样,其称为downloading模式,所以即使装好了三星驱动,但是fastboot device还是识别不出来。三星官方给了一个Odin的软件,可以用来刷入recovery,然后在AP那里要求tar压缩包,尝试把img压缩为tar然后写进去失败了。
    最后还是lineageOS给的刷recovery的方法好。具体就不重复说明了,参看https://wiki.lineageos.org/devices/jfltexx/install
    注意,要先把三星手机的驱动装上。

    其中用到的Heimdall-Windows:https://pan.baidu.com/s/1DnN6CSygz0ppcfb6RqJAag
    提取码:66qo
    复制这段内容后打开百度网盘手机App,操作更方便哦

    刷入系统

    一般来说用TWRP直接卡刷放入的zip包即可。但是刷的时候提示devices unknown和已知的设备不同,不让刷。遂修改卡刷包里的
    META-INF/com/google/android/updater-script,把最前面的assert去掉以后,重新保存打包即可刷入。
    参见https://forum.xda-developers.com/showthread.php?t=2522762

    安装root

    lineageOS 16.0提供了root权限,但是缺少su的二进制。
    在官网找到extra里的su二进制
    https://download.lineageos.org/extras
    三星S4是arm平台,所以是addonsu-16.0-arm-signed.zip,然后adb push到sdcard,TWRP卡刷入即可。

    λ adb shell
    jfltexx:/ $ su
    :/ #
    

    注:如果是16.0以上的版本,官方默认采用Magisk作为root权限管理,也就不用官方提供的su了。

    如果想装Magisk,参见https://github.com/topjohnwu/Magisk/releases

    总结

    一些adb命令

    重启进入fastboot

    adb reboot bootloader
    

    重启进入recovery

    adb reboot recovery
    

    参考

    编译刷机的过程漫长且困难连连,有几篇文章还是比较系统的
    https://blog4jimmy.com/2018/11/656.html

    相关文章

      网友评论

          本文标题:记一次折腾的lineageOS编译

          本文链接:https://www.haomeiwen.com/subject/ljqruhtx.html