不忘初心
追求纯净

Ubuntu 16.04 LTS 下编译 LineageOS 源码

0x01 介绍

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

硬件设施最低要求

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

当然 CPU 差点没事,只不过是浪费时间与电费而已。

操作系统

Ubuntu 16.04 64bit

0x02 安装依赖组件

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

0x03 安装 JDK

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

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

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

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

  1. sudo apt install software-properties-common
  2. sudo add-apt-repository ppa:openjdk-r/ppa
  3. sudo apt update
  4. sudo apt install -y openjdk-7-jdk

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

sudo apt install -y openjdk-8-jdk

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

0x04 设置 repo

Google 可能无法下载。建议爬墙访问。

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

0x05 设置 git 用户名和邮箱

示例如下:

git config --global user.email "[email protected]"

git config --global user.name "Your Name"

双引号中的 “[email protected]” 填写您的 github 所使用的邮箱。注意格式。

双引号中的 “Your Name” 填写您的 github 用户名。

0x06 下载源码

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

6.1 新建源码目录:

mkdir -p ~/android/los/cm-14.1

cd ~/android/los/cm-14.1

6.2 初始化源码:

(假如想使用 CM 13.0,则将 cm-14.1 改为 cm-13.0)

  1. repo init -u https://github.com/LineageOS/android.git -b cm-14.1

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

6.3 正式同步源码:

<1> 使用如下命令:

在过程中可能会提示 clone 失败的信息,可以添加参数 --no-clone-bundle 到命令末尾。

  1. repo sync -j4

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

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

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

假如在服务器上编译,建议使用 screen 开启一个新的窗口,避免 ssh 掉线后导致同步终止。

假如 ssh 断掉,使用 screen -r 窗口名 即可恢复这个窗口。在 ssh 断掉的时候,这个窗口始终会保持程序的运行。

安装 screen:

  1. sudo apt install screen -y

开启窗口:

  1. screen -S sync

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

  1. chmod a+x repo.sh
  2. bash repo.sh

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

下载完毕后,会提示 Syncing work tree,同步完毕后会退出这个脚本。

0x07 编译源码

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

mkdir ~/android/los/cm-14.1/.repo/local_manifests

vim clark.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <manifest>
  3. <project name="LineageOS/android_device_motorola_clark" path="device/motorola/clark" remote="github" />
  4. <project name="LineageOS/android_device_qcom_common" path="device/qcom/common" remote="github" />
  5. <project name="LineageOS/android_kernel_motorola_msm8992" path="kernel/motorola/msm8992" remote="github" />
  6. <project name="LineageOS/android_hardware_sony_thermanager" path="hardware/sony/thermanager" remote="github" />
  7. <project name="TheMuppets/proprietary_vendor_motorola" path="vendor/motorola" remote="github" />
  8. </manifest>

7.2 再次 repo sync。

  1. repo sync

7.3 设置 ccche 提高编译效率。

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

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

7.4.1 允许 jack 使用更多的内存

  1. export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m"

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

7.4.2 重启 jack:

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

7.5 开启自带的 Root 权限

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

  1. export WITH_SU=true

7.6 设置编译变量

  1. . ./build/envsetup.sh

7.7 开始编译

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

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

假如只需要编译 recovery,则:

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

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

0x08 编译完成

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

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

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

  1. make clean

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

0x09 其他

9.1 使用高通 LLVM

貌似高通的 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

  1. 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 中添加下面几行代码:

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

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

赞(0)
未经允许不得转载:云库网 » Ubuntu 16.04 LTS 下编译 LineageOS 源码

评论 1

评论前必须登录!

 

  1. #1
    Google Chrome 49.0.2623.75 Google Chrome 49.0.2623.75 Windows 10 x64 Edition Windows 10 x64 Edition

    很有用的教程 先收藏

    8311433年前 (2017-09-05)