一、编译LineageOS源码

准备

  • 设备:小米 MIX2
  • 设备代号:chiron
  • Android版本:9.0
  • PC配置:
    • 系统:Ubuntu18.04
    • 至少12G RAM
    • 至少200GB 剩余硬盘空间
    • 良好的网络环境

1.下载并解压SDK

sdk中包含fastboot和adb

下载

wget 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 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

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

安装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 lineage-16.0

× 注:这里的lineage-16.0是分支名,对应Android 9.0。更多分支请浏览:https://github.com/LineageOS/android

4.拉取源码

repo sync

5.配置源码

cd device/xiaomi

git clone https://github.com/LineageOS/android_device_xiaomi_chiron -b lineage-16.0 chiron

提取vendor信息

提取手机厂商的库。这一步将手机连接电脑,并保证手机能被adb

命令操控,还需要手机授予adb root权限。

adb shell su -c setenforce 0

cd chiron

./extract-files.sh

提取需要点时间,需耐心等待

拉取kernel

cd kernel/qcom

git clone https://github.com/LineageOS/android_kernel_qcom_msm8998 -b lineage-16.0 msm8998

配置构建环境

source build/envsetup.sh

配置设备信息

breakfast chiron

6.配置构建工具

配置ccache

gedit ~/.bashrc

加入:

export USE_CCACHE=1

使改动生效:

source ~/.bashrc

执行:

ccache -M 50G

来设置缓存大小

× 注:ccache默认在home目录,请确保home目录有足够的空间。如果想自定义ccache的目录,可以在~/.bashrc文件里加入export CCACHE_DIR=/path/to/.ccache。缓存大小根据自己硬盘大小设置,设置25G以上可以显著提高源码的构建速度。

配置jack

gedit ~/.bashrc

加入:

export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx8G"

使改动生效:

source ~/.bashrc

7. 构建

构建整个源码

croot

brunch chiron

× 注:构建成功后,在源码目录执行cd $OUT进入编译好的ROM的存放目录。lineage-16.0-xxxxxxxx-UNOFFICIAL-chiron.zip为编译好的刷机包。

只构建某个模块

mmm <模块名>

例如构建frameworks中的base

mmm frameworks/base

打包成system.img

有时候我们只修改system里的模块,没必要编译整个源码,就只打包system.img

make snod

编译system

make systemimage

8.刷入手机(可选)

下载twrp

https://dl.twrp.me/chiron/

刷入trwp

刷入recovery前,要先解锁手机的bootloader,如何解锁,各个厂商不太一样,这里就不阐述了。

adb reboot bootloader

fastboot flash recovery twrp.img

fastboot reboot

刷入system.img

我们调试源码时,如果不想刷入整个ROM,可以只刷入system.img。以下命令将system.img刷入system分区

fastboot flash system system.img

刷入ROM

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

9.常见问题

(1) 编译目标设备为emulatorx86时在编译时出错,提示yasm找不到。

安装yasm

sudo apt-get install yasm

(2) adb命令提示没有权限

lsusb

找到类似一行:

Bus 001 Device 005: ID 18d1:4ee7 Google Inc.

编辑51-android.rules:

sudo gedit /etc/udev/rules.d/51-android.rules

输入类似的内容:

# MIX2 normal
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="4ee7",MODE="0666",GROUP="plugdev"
# MIX2 fastboot
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="d00d",MODE="0666",GROUP="plugdev"

×注:idVendor,idProduct分别为lsusb命令显示的ID。开机状态和fastboot模式都需要添加权限,所以,需要增加两行。

更改文件权限:

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

二、模拟器使用LineageOS

将emulator所在的目录加入环境变量

在源码目录,cd $OUT

设置模拟器路径

# 设置模拟器目录
if [ -d "/android_source_path/prebuilts/android-emulator/linux-x86_64" ] ; then
PATH="/android_source_path/prebuilts/android-emulator/linux-x86_64:$PATH"
fi

设置OUT目录

export ANDROID_PRODUCT_OUT=/android_source_path/out/target/product/emulatorx86

使用编译好的镜像启动(arm):

emulator64-arm -kernel ./prebuilts/qemu-kernel/arm64/kernel-qemu -sysdir $ANDROID_PRODUCT_OUT -system $ANDROID_PRODUCT_OUT/system.img -data $ANDROID_PRODUCT_OUT/userdata.img -ramdisk $ANDROID_PRODUCT_OUT/ramdisk.img

使用编译好的镜像启动(x86):

emulator64-x86 -kernel ./prebuilts/qemu-kernel/x86/kernel-qemu -sysdir $ANDROID_PRODUCT_OUT -system $ANDROID_PRODUCT_OUT/system.img -data $ANDROID_PRODUCT_OUT/userdata.img -ramdisk $ANDROID_PRODUCT_OUT/ramdisk.img

参考

自己动手编译Android(LineageOS)源码的更多相关文章

  1. 【转】编译Android系统源码和内核源码

    原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...

  2. FW 编译Android系统源码和内核源码

    编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...

  3. MAC 下编译 ANDROID P 源码 提示 internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13"]

    MAC 下编译 ANDROID P 源码出现下面的问题: ninja: no work to do. [21/21] out/soong/.bootstrap/bin/soong_build out/ ...

  4. 编译Android系统源码和内核源码

    [日期:2016-01-11] 来源:Linux社区  作者:jiangwei [字体:大 中 小]     把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...

  5. 编译Android系统源码(高通平台)

    在Android源码根目录执行下面命令 source build/envsetup.sh choosecombo make –j4 其他命令(首先需要在android源码根目录执行source bui ...

  6. Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】

    本文转载自:大神 通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一 ...

  7. Android FrameWork 学习之Android 系统源码调试

    这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...

  8. Android之源码之模块编译和调试

    Android之源码之模块编译调试 (一) 进行源码模块修改进行编译的调试 1.首先是从git或者svn上拉一套完整的工程下来,然后全编一下,一般这个时间比较长,大概会得2,3个小时左右, 2,编译成 ...

  9. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

随机推荐

  1. PCA算法和python实现

    第十三章 利用PCA来简化数据 一.降维技术 当数据的特征很多的时候,我们把一个特征看做是一维的话,我们数据就有很高的维度.高维数据会带来计算困难等一系列的问题,因此我们需要进行降维.降维的好处有很多 ...

  2. Urlparse模块

    urlparse模块主要是把url拆分为6部分,并返回元组.并且可以把拆分后的部分再组成一个url.主要有函数有urljoin.urlsplit.urlunsplit.urlparse等. urlpa ...

  3. Vue.js与Jquery的比较 谁与争锋 js风暴

    普遍认为jQuery是适合web初学者的起步工具.许多人甚至在学习jQuery之前,他们已经学习了一些轻量JavaScript知识.为什么?部分是因为jQuery的流行,但主要是源于经验开发人员的一个 ...

  4. 在高分屏正确显示CHM文件

    今天下了白色相簿2推,发现里面的chm格式的帮助文档显示不正确,又没法在应用程序直接设置系统分辨率托管,google了一下找到了这个方法: 新建 HKEY_LOCAL_MACHINE\ SOFTWAR ...

  5. OpenApi开放平台架构实践

    背景 随着业务的发展,越来越多不同系统之间需要数据往来,我们和外部系统之间产生了数据接口的对接.当然,有我们提供给外部系统(工具)的,也有我们调用第三方的.而这里重点讲一下我们对外的接口. 目前,我们 ...

  6. 微信企业向用户银行卡付款API开发详解(PHP)

    最近在实现微信企业向用户银行卡付款时遇到了一些问题,发现官方文档说的太笼统,走了不少弯路,想要在此记录,希望可以帮到大家. 案例:企业付款到银行卡    微信接口链接:https://api.mch. ...

  7. Python 3.6 中文手册——前言

    1. 前言 如果你在电脑上做了很多工作,最终你会发现有一些任务你想要自动化.例如,你可能希望对大量的文本文件执行搜索和替换,或者以复杂的方式重命名并排列一堆照片文件.也许你想写一个小的自定义数据库,或 ...

  8. Git请求合并说明

    如今公司很多新项目都采取merge request方式来进行code review.非阻塞上线部署,因此掌握merge request很有必要,步骤如下: 1.现在本地用创建一个本地分支, git c ...

  9. http请求 405错误 方法不被允许 (Method not allowed)

    由于自己疏忽,导致请求错误405,然后前端数据传输没错,百度大都说跟post提交方式有关,改成get还是报错,检查才知道,controller中忘记写@requestMapping("/XX ...

  10. 从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性

    在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的 ...