云梦
www.htcp.net

Ubuntu 16.04 LTS 下编译 LineageOS 源码

0x01 介绍

在 Ubuntu 16.04 下编译 LineageOS/CM 等 AOSP 源码可能会踩到很多坑。下面就跟我一起来配置避免入坑吧。Ubuntu 16.04 LTS 请选择 64 位的。

硬件设施最低要求

CPU: Core i3 530 及以上的 CPU(推荐 Intel Core i7 6 代以上或 AMD Ryzen 系列 CPU)
RAM: 8GB 及以上的 CPU(推荐 16GB 及以上)
HDD: HDD 120GB 及以上剩余存储空间(推荐 SSD 256GB 及以上)

当然 CPU 差点没事,只不过是浪费时间与电费而已。源码所在目录最低剩余空间不要小于 100GB。

操作系统

Ubuntu 16.04 64bit

0x02 安装依赖组件

主要组件:

sudo apt install -y bc bison build-essential curl flex gcc-multilib git git-core gnupg gperf g++-multilib libesd0-dev libgl1-mesa-dev liblz4-tool libncurses5-dev libreadline6-dev \
libsdl1.2-dev libwxgtk3.0-dev libxml2 libxml2-utils libx11-dev lib32ncurses5-dev lib32z1-dev lzop pngcrush schedtool squashfs-tools \
unzip xsltproc zip zlib1g-dev

额外组件,可能会使用到:

sudo apt install imagemagick libbz2-dev libssl-dev lzma ncftp bash-completion

0x03 安装 JDK

Open JDK 8 安装:

CM 14.1 及 LineageOS 14.1 以上,需要安装 JDK 8,直接安装即可,不要添加 PPA 源。

使用如下命令:

sudo apt install -y openjdk-8-jdk

CM 14 以下,需添加 JDK 7 的 PPA 源:

由于 Ubuntu 官方已经移除了对 Open JDK 7 的支持,所以要使用第三方的仓库。这真是大坑。

注:Android 7.1+ 已经支持 Open JDK 8,不要安装 Open JDK 7。

sudo apt install software-properties-common

sudo add-apt-repository ppa:openjdk-r/ppa 
sudo apt update
sudo apt install -y openjdk-7-jdk

注:第一条命令导入 PPA 时,按回车键继续导入即可。

安装完毕后不需要设置 JAVA 环境变量,是直接可以用的。

0x04 设置 repo

Google 可能无法下载。建议爬墙访问。PS:如果有 TZ 需要,可以找我哦(发邮件到 admin@htcp.net)。

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
echo "export PATH=~/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

关于清华的源:

无力吐槽清华源,老是出问题。当然您可以自己试试看使用这个,总有好的时候不是么 :)。

0x05 设置 git

1. 设置 git 用户名和邮箱
示例如下:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

双引号中的 “you@example.com” 填写您的 github 所使用的邮箱。注意格式,不要把双引号去掉。
双引号中的 “Your Name” 填写您的 github 用户名,不要把双引号去掉。

2. 生成 ssh 并添加到 github:

您可以参考官方的文档:

https://help.github.com/articles/connecting-to-github-with-ssh/

如果您不将 ssh 添加到 github 的话,您可能会遭遇下载受限,从而导致接下来的同步源码失败。

0x06 下载源码

注:千万不要使用中文路径!千万不要包含空格或一些特殊字符!不要将使用 Windows 的坏习惯带入到 Linux 中来!

6.1 新建源码目录:

(假如您想使用 Lineage 14.1,则可将 lineage-15.1 改为 cm-14.1)

mkdir -p ~/android/los/lineage-15.1

cd ~/android/los/lineage-15.1

6.2 初始化源码:

(假如想使用 Lineage 14.1,则将 lineage-15.1 改为 cm-14.1)

repo init -u https://github.com/LineageOS/android.git -b lineage-15.1

Enable color display in this user account (y/N)? y

6.3 正式同步源码:

<1> 使用如下命令:
在过程中可能会提示 clone 失败的信息,可以添加参数 --no-clone-bundle 到命令末尾。

repo sync -j4 -c --no-clone-bundle

由于国内环境不太好。网络比较差的同学,可以试试自动化 repo 同步脚本。

复制粘贴如下代码到终端中,回车将会保存为 repo.sh。注意将源码的路径改成您设置的源码路径。

cat > repo.sh <<EOF
#!/bin/bash
echo "======start repo sync======"
~/bin/repo sync -j4 -c --no-clone-bundle
while [ $? == 1 ]; do
echo "======sync failed, re-sync again======"
sleep 3
~/bin/repo sync -j4 --no-clone-bundle
done
EOF

假如您在服务器上编译,建议使用 screen 开启一个新的窗口,避免 ssh 掉线后导致同步终止。
假如 ssh 断掉,使用 screen -r 窗口名 即可恢复这个窗口。在 ssh 断掉的时候,这个窗口始终会保持程序的运行。具体的使用方法您可以使用 Google 搜索看一下文档。

安装 screen:

sudo apt install screen -y

开启窗口:

screen -S sync

<2> 然后执行这个脚本:

chmod a+x repo.sh
bash repo.sh

网速很慢的话(10M 带宽以下),估计要下 1 天左右。

当同步源码接近完毕后,会提示 Syncing work tree,直到同步完毕后会自动退出这个脚本。

0x07 编译源码

7.1 设置编译机型的 device tree、kernel 和私有文件。在这里以 shamu(Nexus 6)为例。其他机型请参照对应机型的相关设备源码来设置。

以下仅供参考,您需要根据设备的具体依赖自行修改:

(请将这里的 lineage-15.1 修改为您自己使用的源码目录)

mkdir ~/android/los/lineage-15.1/.repo/local_manifests
vim shamu.xml

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <project name="LineageOS/android_device_moto_shamu" path="device/moto/shamu" remote="github" />
  <project name="LineageOS/android_kernel_moto_shamu" path="kernel/moto/shamu" remote="github" />
  <project name="TheMuppets/proprietary_vendor_motorola" path="vendor/motorola" remote="github" />
</manifest>

Lineage-14.1 可能要在 上面再加一行(Lineage15.1+ 不要这个,会冲突并报错):

<project name="LineageOS/android_device_qcom_common" path="device/qcom/common" remote="github" />

7.2 再次 repo sync。

repo sync

7.3 设置 ccache 提高编译效率。

sudo apt install ccache -y

echo export USE_CCACHE=1 >> ~/.bashrc
prebuilts/misc/linux-x86/ccache/ccache -M 50G

7.4 解决 jack 内存不足导致编译失败的问题

7.4.1 允许 jack 使用更多的内存

echo 'export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"' >> ~/.bashrc
source ~/.bashrc

可以将这个添加进 ~/.bashrc 末尾最后一行中,然后 source 一下。否则每次打开终端时都要执行一次。

7.4.2 重启 jack:

./out/host/linux-x86/bin/jack-admin kill-server
./out/host/linux-x86/bin/jack-admin start-server

7.5 开启自带的 Root 权限

默认不带 Root,可通过输入如下命令开启(每次打开终端时执行一次,或者将这个加入到 ~/.bashrc 中并执行 source):

export WITH_SU=true

7.6 设置编译变量

. ./build/envsetup.sh

7.7 开始编译

使用如下命令,会将编译过程中的所有屏幕输出保存至 build.log 文件中,方便排错。假如是其他设备,请修改对应的 brunch 机型。

croot
brunch lineage_clark-userdebug 2>&1 | tee build.log

假如只需要编译 recovery,则:

make recoveryimage -j8 2>&1 | tee build.log

提示:j 后面的是线程数,一般是 CPU 核心数的 2 倍。不要设置的太大,否则会适得其反并且炸内存。

0x08 编译完成

编译完成后,会在 源码目录/out/target/product/您的机型 文件夹生成对应的刷机包、镜像和一些编译出来的文件。

假如在编译过程中遇到报错,尝试 Google 对应的报错内容,不建议使用国内搜索引擎。

每次重新编译,可执行清理步骤:

make clean

然后重新执行 0x07 分段中的第 7.6 和 7.7 步。

0x09 其他

9.1 使用高通 LLVM(Lineage 15.1 没有试过)

貌似高通的 Snapdragon LLVM Compiler for Android 不错?被人安利了,但感觉没有什么区别?!另外,这个东西不支持 MacOS 操作系统。

9.1.1 您可以从此处下载(需要注册并登录高通账户才可下载):

https://developer.qualcomm.com/software/snapdragon-llvm-compiler-android

9.1.2 解压下载的 snapdragon-llvm-3.8.*-linux64.tar.gz,然后再解压 Snapdragon-llvm-3.8.*-toolchain.tar.gz,您将会得到 toolchains 文件夹。

9.1.3 将 ./toolchains/llvm-Snapdragon_LLVM_for_Android_3.8/prebuilt 下的 linux-x86_64 文件夹复制到 prebuilts/clang/linux-x86/host 下,并重命名为 sdclang-3.8

cp -rf toolchains/llvm-Snapdragon_LLVM_for_Android_3.8/prebuilt/linux-x86_64 ~/android/los/cm-14.1/prebuilts/clang/linux-x86/host/sdclang-3.8

9.1.4 在您的 源码目录/device/您的设备厂商/您的设备开发代号/BoardConfig.mk 中添加下面几行代码:

ifneq ($(HOST_OS),darwin)
SDCLANG := true
SDCLANG_PATH := prebuilts/clang/linux-x86/host/sdclang-3.8/bin
SDCLANG_LTO_DEFS := device/qcom/common/sdllvm-lto-defs.mk
endif

9.1.5 参照 0x07 重新编译试试看。

文章最后修订于:2018 年 02 月 02 日 02:00 CST。

赞(1) 打赏
文章通过 CC 4.0 BY-NC-ND 协议发布,转载请注明出处:云梦 » Ubuntu 16.04 LTS 下编译 LineageOS 源码

评论 56

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #29

    xiaomi_libra lineage-15.1
    brunch 是提示 warning ****uses deprecated kernel header dependency path. 最后失败.请问还有救吗?

    xg3个月前 (03-23)回复
    • 可能是方法不对。不过我没有这机型,没法帮到你。

      晨晨3个月前 (03-24)回复
      • prebuilts/misc/linux-x86/bison/bison: 1: prebuilts/misc/linux-x86/bison/bison: Syntax error: “(” unexpected
        [ 11% 10891/92409] target Strip: libmediandk.ndk.21 (/home/wlsxg/android/lineage/out/target/product/libra/obj/SHARED_LIBRARIES/libmediandk.ndk.21_intermediates/libmediandk.so)
        ninja: build stopped: subcommand failed.
        12:41:28 ninja failed with: exit status 1

        碰上这个了….

        xg3个月前 (03-24)回复
        • 确定同步好了且无异常?

          晨晨3个月前 (03-24)回复
  2. #28

    我现在用的LOS14.1 如何才能做一个RR的7.1呢

    RR3个月前 (03-17)回复
  3. #27

    老哥,虚拟机中是否可以进行编译呢,性能够的话

    fuzhengqu3个月前 (03-14)回复
  4. #26

    大佬,按照你的教程,使用清华源下载的repo,但是在执行·repo init -u https://github.com/LineageOS/android.git -b staging/lineage-15.1· 这个命令的时候报错:repo:6: missing end of string。请问这是repo脚本有问题吗

    null_point4个月前 (03-02)回复
  5. #25

    大神你好!非常感谢你的教程,但我现在有个疑问,我按你教程跟官网wiki编译出来,但是我的机型是XT1085,默认编译官方的是国际版的X,我这国行版用不了,我要怎么编译成国行可以用的rom,对编译很了解,平常只编译过openwrt,求大神指导!

    fate4个月前 (02-24)回复
    • 没有研究过。现在应该不用改任何东西了。

      晨晨4个月前 (02-24)回复
  6. #24

    大神,新年好!我参照您的教程以及官方wiki编译的,但我有个疑问,我机型是XT1085,但lineageos不支持这个机型,只支持国际版的X,我想问我要怎么才能把rom编译成xt1085可刷可用啊,感觉国行真的坑啊

    fate4个月前 (02-23)回复
  7. #23

    按照作者的教程成功编译bacon的lineage14.1,不过我是用deepin15.5编译的,基本步骤和作者的一样。

    luojunjie4个月前 (02-11)回复
  8. #22

    机型的内核这些在github,该怎么编译

    Lin_ge5个月前 (01-30)回复
    • 问题情况不全,没法作答。

      晨晨5个月前 (01-30)回复
      • 我的机型没有开源,los官方也没有支持,但是GitHub上面有大神做的源码,该怎么编译los

        Lin_ge5个月前 (01-31)回复
        • 设备树的话,可从 CPU 一致的相近机型修改适配,这个要有很强的开发能力以及对 Android 有充分的了解;内核的话,找该机型的厂商要,一般都是(根据 GPL 协议厂商需强制开源)开源设备的内核的,如果没有那没办法。私库的话,从手机里边自己提取(自己找必须要的私库,需要较强开发能力)。

          晨晨5个月前 (02-02)回复
  9. #21

    楼主,,我要**的方式

    kkk9个月前 (09-29)回复
  10. #20

    官方没有适配我的机型,但我的机型已开源,应该怎么设置编译机型的 device tree、kernel 和专有文件???

    Resun9个月前 (09-27)回复
  11. #19

    我的手机是ghost(moto x 1st)
    为什么我编译出来的包(LineageOS 13.0)刷进去开不了机,开机时优化完app后,一直停在starting app界面。
    我使用官方的包提取过私有文件了。使用这个文件ghost文件夹中的extract-files.sh。
    求解答,编译过程中没有出现ERROR。

    IriKa10个月前 (08-13)回复
    • 用这里的私库:https://github.com/TheMuppets/proprietary_vendor_motorola

      晨晨5个月前 (02-02)回复
  12. #18

    我的手机是ghost(moto x 1st)
    为什么我编译出来的包刷进去开不了机,开机时优化完app后,一直停在starting app界面。
    我使用官方的包提取过私有文件了。使用这个文件ghost文件夹中的extract-files.sh。
    求解答,编译过程中没有出现ERROR。

    IriKa10个月前 (08-13)回复
  13. #17

    好教程,基本编译ROM的套路流程就这样了,晨大也只是抛个砖而已,其中细节还是得每个人自己去摸索!如果只是撸自己的手机,建议在local_manifests文件夹里建一个xml文件,如叫remove.xml,将用不上的项目都移除了,这样可以减少下载量,毕竟国内网络环境不理想!

    小日月1年前 (2017-05-22)回复
  14. #16

    想问一下【7.3 设置 ccche 提高编译效率。
    7.4.1 允许 jack 使用更多的内存】是只有第一次编译需要设置还是每次更新源码重新编译都要设置?

    何以解忧,唯有暴富1年前 (2017-05-03)回复
    • 使用 export 写在 .bashrc 中后不需要重复设置。

      晨晨1年前 (2017-05-07)回复
  15. #15

    感谢,按教程成功编译了ZUK Z1的RR7.1.2和6.0.1

    何以解忧,唯有暴富1年前 (2017-05-03)回复
    • 我现在用的LOS14.1 如何才能做一个RR的7.1呢

      RR3个月前 (03-17)回复
  16. #14

    写的已经很完善了,基本上没什么需要补充的了。
    这里有两个建议:
    1. screen可以用tmux代替试试
    2. repo下载不下来的话可以试试清华镜像提供的repo,也可以试下清华镜像提供的aosp镜像。

    Edison1年前 (2017-04-06)回复
  17. #13

    老大 ,有个不情之请,能不能教教如何编译github上的开源应用。
    虽然我知道可能比较难,但我还是想了解一下,上面一些开源应用只能看但想用啊!

    We2341年前 (2017-03-26)回复
    • 一般都是有文档的,不行的话可以发 issue 给该项目的开发者。

      晨晨1年前 (2017-03-26)回复
  18. #12

    对了,是official support机型

    patrickyoung1年前 (2017-03-24)回复
  19. #11

    编译rr,编译出来的整个包的system.new.dat是坏的,全程如上及参考lineageos/aosp/rr官方wiki进行,何解?提示了build successfully

    patrickyoung1年前 (2017-03-24)回复
    • 233333,这你要自己检查一下了。我没遇到这个情况。。。

      晨晨1年前 (2017-03-29)回复
      • 参见https://www.v2ex.com/t/350509的58楼及后续的回复(id:kmahyyg),方便帮忙看下吗?

        patrickyoung1年前 (2017-03-29)回复
        • 看样子没有任何问题,已经刷进去了。

          晨晨1年前 (2017-03-30)回复
          • 刷进去了,但是ls /system是空的。。。。。。recovery.log是twrp log

            Patrick young1年前 (2017-03-30)回复
            • 刷完后,system 分区会解除挂载,你需要在 TWRP 的 挂载菜单重新挂载 system 分区才能看到东西啊!

              晨晨1年前 (2017-03-31)回复
              • 重新启动也无法进入系统,表现为,启动,mi界面,弱振动1次,回到twrp.这说明system一直都是空的

                Patrick Young1年前 (2017-03-31)回复
                • 根本不能这样判断,弱振动只证明内核已经启动了,返回到 TWRP 只证明配置不正确。还有啊,你在 TWRP 中挂载一下 system 看看不就知道有没有东西了,干嘛要纠结这个问题。

                  晨晨1年前 (2017-03-31)
              • 挂载上了,仍然是空的

                Patrick young1年前 (2017-03-31)回复
                • 这个问题好奇怪啊,我也不知道问题出在哪。

                  晨晨1年前 (2017-04-01)
  20. #10

    请问32位ubuntu可以吗,还有如何为一个lineageOS官方不支持的机型编译源码呢

    fuzhengqu1年前 (2017-03-22)回复
    • 首先,32bit 系统 CPU 占用较高,内存只能识别 3GB,本身就不适合用来编译像 Android 源码这么大的工程。第二,即使内存只有 512MB,也可以装 64bit 操作系统,这和 Windows 不一样,Linux 系统开销比较小,通常最小系统安装完只占用 100MB 左右的内存,不建议在 32bit 系统上下太多功夫。编译 Android 推荐环境是 Intel 双核以上的 CPU,4 GB 及以上的内存。采用 64bit Ubuntu 操作系统。
      为不官方支持 lineageos 的设备编译,在大多数情况下,由于提问此问题的人水平有限,所以不建议提问者考虑如何自行适配 lineageos,可以去 xda 等论坛,寻找是否有适合自己机型的 device tree、vendor(也可自行提取)、kernel 源码,这些一般由持有该设备的开发者提供,将这些源码放入指定位置,编译即可,如有问题需自行 debug,如果没有这些源码,那么请直接放弃。一般来说,lineageos 不将自己所持设备加入官方支持有如下几点原因:1.该机型不够火,不足以受到开发者的青睐;2. 该机型正处于开发状态,bug 较多不够完善不可以加入 lineageos 官方支持。
      非官方的 lineageos 由于开发者较少,一般会有很多问题,不建议作为生产环境使用。

      晨晨1年前 (2017-03-22)回复
      • 十分感谢,回复的十分详细,我用的是韩版S3,也就是E210S,在国外论坛是有人做unofficial的14.1的,但是他们半年还不推出一个包,我实在等不及,想自己适配,github上此设备的源码已有,不知道如何去同步下来

        fuzhengqu1年前 (2017-03-24)回复
  21. #9

    能不能只同步我想要的机型的源,小水管下载太慢了

    Ana1年前 (2017-03-20)回复
    • 一般设备树 10M,内核 1G,私库 800M。这些都是小东西,要下的大部分是整体 Android 源码。

      晨晨1年前 (2017-03-20)回复
  22. #8

    还有在加入open jdk 7软件源后执行apt update出现”404 Not Found“,源失效了?

    Ana1年前 (2017-03-20)回复
    • 不建议使用网易源。

      晨晨1年前 (2017-03-20)回复
  23. #7

    同步源码大概需要多大的空间?我使用虚拟机的,所以想要知道要知道建多大的虚拟盘

    Ana1年前 (2017-03-20)回复
    • 分 100 GB(至少)。14.1 源码 55 G,编译文件 30 G。

      晨晨1年前 (2017-03-20)回复
  24. #6

    感谢大大!

    莪湜誰_斌4年前 (2014-12-14)回复
  25. #5

    太感谢了!

    插上风的翅膀4年前 (2014-11-25)回复
  26. #4

    酷安军团何在? 🙁

    酷安过来的某某4年前 (2014-11-20)回复
  27. #3

    实在是感谢

    佐佐的酷安4年前 (2014-11-15)回复
  28. #2

    😀

    小小麦4年前 (2014-11-14)回复
  29. #1

    沙发,谢谢楼主,今天绿色守护一有更新就在这里蹲着了。 😛

    John4年前 (2014-11-13)回复

如果您觉得文章有用,可以支持一下本站

支付宝扫一扫打赏

QQ 扫一扫打赏