自己动手编译Android源码

准备

  • 设备:红米3s
  • 设备代号:land
  • Android版本:7.1.1
  • 源码提供:Lineage
  • PC配置:
    • 系统:Ubuntu16.04 x64
    • 至少12G RAM
    • 至少80GB 剩余硬盘空间
    • 良好的网络环境

1.下载并解压SDK

sdk中包含fastboot和adb
下载
https://dl.google.com/android/repository/platform-tools-latest-linux.zip
解压
unzip platform-tools-latest-linux.zip -d ~

添加到环境变量

gedit ~/.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-get install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libesd0-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-8-jdk
sudo apt install -y openjdk-8-jdk

3.配置源

创建repo存放目录
mkdir -p ~/bin

创建源码存放目录
mkdir -p ~/android/lineage

× 注:请确保该目录所在的磁盘有足够的空间(至少80G)

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

~/bin放入环境变量

gedit ~/.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

初始化repo

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

× 注:这里下载的是lineageOS的源码,cm-14.1是分支名。更多分支请浏览:https://github.com/LineageOS/android

4.下载源码

repo sync

5.配置源码

cd ~/android/lineage

加入vendor源

gedit .repo/local_manifests/roomservice.xml

加入:
<project name="TheMuppets/proprietary_vendor_xiaomi" path="vendor/xiaomi" remote="github" revision="cm-14.1" />
× 注:其中name是远程项目的路径;path是本地目录的路径;revision是分支名(具体分支请看:https://github.com/TheMuppets/proprietary_vendor_xiaomi

更新源码
repo sync

配置构建环境
source build/envsetup.sh

配置设备信息
breakfast land

6.配置构建工具

配置ccache

gedit ~/.bashrc

加入:

export USE_CCACHE=1

保存。

使改动生效:
source ~/.bashrc

执行:
ccache -M 50G
× 注:ccache默认在home目录,请确保home目录有足够的空间。如果想自定义ccache的目录,可以在~/.bashrc文件里加入export CCACHE_DIR=<路径>

配置jack
gedit ~/.bashrc
加入:
export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4G"

保存。

使改动生效:
source ~/.bashrc

7. 构建

构建整个源码

croot

brunch land

× 注:在源码目录执行cd $OUT进入编译好的ROM的存放目录。lineage-14.1-xxxxxxxx-UNOFFICIAL-land.zip为编译好的刷机包。

只构建某个模块

mmm <模块名>

例如构建frameworks中的base

mmm frameworks/base

打包成system.img

有时候我们只修改system模块里不需要编译的文件,没必要重新编译,只需要打包system.img
make snod

编译system

有时候我们只修改system里的代码,没必要编译整个Android源码,只需要编译system.img
make systemimage

编译Linux内核

有时候我们只修改内核里的代码,没必要编译整个Android源码,只需要编译boot.img
make bootimage

8.刷入手机(可选)

下载twrp
https://dl.twrp.me/land/

刷入trwp
在开机状态下,打开USB调试。而且设备要先解锁bootloader。

adb reboot bootloader

fastboot flash recovery twrp.img

fastboot reboot

刷入system.img

我们调试系统源码时,如果不想刷入整个ROM,可以只刷入system.img

fastboot flash system $OUT/system.img

× 注:$OUT指向system.img生成目录

刷入内核
我们调试内核源码时,如果不想刷入整个ROM,可以只刷入boot.img
fastboot flash boot $OUT/boot.img

刷入ROM

将编译好的刷机包,通过adb push命令将刷机包传输到手机存储。进入twrp界面,擦除system分区,data分区。选择手机存储中的刷机包,刷入!!!

9.常见问题

adb命令提示没有权限

lsusb

找到类似一行:
Bus 001 Device 005: ID 18d1:4ee7 Google Inc.

编辑51-android.rules:
sudo gedit /etc/udev/rules.d/51-android.rules

输入:
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="4ee7",MODE="0666",GROUP="plugdev"

×注:idVendor,idProduct分别为lsusb命令显示的ID

更改文件权限:

chmod a+r /etc/udev/rules.d/51-android.rules

提示Out of space? the tree size of...

在device目录下找到BoardConfig.mk文件,将其中BOARD_xxxx_PARTITION_SIZE字段后面的值调大点

10.参考

https://wiki.lineageos.org/devices/land/build
https://www.htcp.net/741.html
https://www.isthnew.com/archives/build-lineageos.html
http://blog.csdn.net/luoshengyang/article/details/6566662/

自己动手编译Android源码

上一篇:android studio学习(一)


下一篇:Android - 内存监控工具