0%

LineageOS源代码编译笔记

在研究安卓安全时,很多情况下我们需要修改安卓源代码(如动态调试时过掉反调试机制)。LineageOS是根据Android官方源码修改后的版本,对很多手机都适配,因此编译该版本的源码比直接编译AOSP的更加有意义。本文简要说明一下编译LineageOS的步骤。更详细的步骤说明请参考官方文档: https://wiki.lineageos.org/build_guides.html

首先说明一下我这的操作系统和需要编译的LineageOS版本
操作系统版本:

1
Linux anemone-VirtualBox 4.13.0-26-generic #29~16.04.2-Ubuntu SMP Tue Jan 9 22:00:44 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

编译的LineageOS版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=7.1.2
LINEAGE_VERSION=14.1-20180325-UNOFFICIAL-mako
TARGET_PRODUCT=lineage_mako
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=krait
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.13.0-26-generic-x86_64-with-Ubuntu-16.04-xenial
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=NJH47F
OUT_DIR=/media/anemone/lineage/lineageOS/out
WITH_SU=true
============================================

顺带可以看到我这里需要编译的Android版本是7.1.1, 目标设备是Nexus4手机。

搭建编译环境

安装jdk

1
2
sudo apt-get update
sudo apt-get install openjdk-8-jdk

安装编译时需要依赖的库

1
sudo apt-get install bc bison build-essential curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev openjdk-8-jdk lib32readline6-dev

下载源代码

安装repo工具

1
2
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo

为了方便可以将其拷贝到你的PATH里。

使用repo命令下载源代码(可能涉及到科学上网)

1
2
repo init -u git://github.com/LineageOS/android.git -b cm-14.1
repo sync -f --force-sync --no-clone-bundle

提取设备文件

虽然Android是开源的,但是有些设备的文件不是通用的(如不开源的驱动文件),有2种方法提取:1,从刷好相同版本的LineageOS设备中获取,2,从已经编译好的LineageOS卡刷包中获取。这里介绍第二种,假设我们已经下好的卡刷包为path/to/lineage-xxx.zip

1
2
3
4
5
6
7
8
mkdir ~/android/system_dump/
cd ~/android/system_dump/
unzip path/to/lineage-*.zip system.transfer.list system.new.dat
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/
./extract-files.sh ~/android/system_dump/

将system_dump文件下的文件复制到~/android/lineage/vendor/lge文件夹下。

编译

准备工作做完后就可以开始愉快的编译啦~~,不过在由于Android工程巨大,请确保编译的机器拥有不低于10G的内存(亲测虚拟机内存8G,swap 8G可以编译),一个速度足够快的硬盘(再来一个固态当缓冲就更好啦),当然还有一个好的CPU(我这用的是i7-4700HQ, 应该算比较差的编译环境了,整个编译过程需要3个小时)。

1
2
3
4
5
6
7
8
. build/envsetup.sh
export WITH_SU=true #自带root
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx10G" #设置编译内存
breakfast lineage_mako-userdebug #选择设备内核
export USE_CCACHE=1 #使用缓存
export CCACHE_DIR=/media/anemone/anemone_ssk/ccache #缓存地址
./prebuilts/misc/linux-x86/ccache/ccache -M 100G #使用100G作为缓存空间
brunch lineage_mako-userdebug