一、编译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. 使用AngularJS开发中的几个问题

    1.AngularJS的模板绑定机制好像和其$http服务也有一定关系,如果用jQuery Ajax的返回值赋给$scope的作用域变量,整个绑定显示的节奏慢一个事件,神器果然麻烦啊. 2.对hidd ...

  2. Ocelot中文文档-中间件注入和重写

    警告!请谨慎使用. 如果您在中间件管道中看到任何异常或奇怪的行为,并且正在使用以下任何一种行为.删除它们,然后重试! 当在Startup.cs中配置Ocelot的时候,可以添加或覆盖中间件.如下所示: ...

  3. 【数据可视化之Flask】快速设计和部署Flask网站

    Flask是Python应用于WEB开发的第三方开源框架,以设计简单高效著称.我也尝试过Django,相对于Flask显得更加全面同样也更加笨重,并且我也不需要它的后台管理功能,因此选择了Flask作 ...

  4. manifold tangent classifier

    The Manifold Tangent Classifier (MTC) Putting it all together, here is the high level summary of how ...

  5. KNN算法思想与实现

    第二章 k近邻 2.1 算法描述 (1)采用测量不同特征值之间的距离进行分类 优点:对异常点不敏感,精度高,无数据输入设定 缺点:空间,计算复杂度高 适合数据:标称与数值 (2)算法的工作原理: 基于 ...

  6. 终于等到你: 图形化开源爬虫Hawk 3发布!

    超级图形化爬虫Hawk已经发布两年半时间了,2015年升级到第二版,收到上千条用户反馈(tucao),100多个红包,总共666块五毛~一直想攒着这笔钱,去北境之王天通苑的龙德商场买最心爱的阿迪王! ...

  7. Scrapy爬虫框架第三讲(linux环境)

    下面我们来学习下Spider的具体使用: 我们已上节的百度阅读爬虫为例来进行分析: 1 # -*- coding: utf-8 -*- 2 import scrapy 3 from scrapy.li ...

  8. PAT1093: Count PAT's

    1093. Count PAT's (25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CAO, Peng The strin ...

  9. 【线程系列四】[转]监听器-java同步的基本思想

    转自:http://ifeve.com/think-in-java-monitor/ 如果你在大学学习过操作系统,你可能还记得监听器在操作系统中是很重要的概念.同样监听器在java同步机制中也有使用, ...

  10. HTML和CSS前端基础

    Html标题 <h1>这是一级标题</h1> <h2>这是二级标题</h2> <h3>这是三级标题</h3> Html段落.换行 ...