自己动手编译Android(LineageOS)源码
一、编译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
刷入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
参考
- https://wiki.lineageos.org/devices/chiron/build
- https://www.htcp.net/741.html
- https://www.isthnew.com/archives/build-lineageos.html
- http://blog.csdn.net/luoshengyang/article/details/6566662/
自己动手编译Android(LineageOS)源码的更多相关文章
- 【转】编译Android系统源码和内核源码
原文网址:http://blog.csdn.net/jiangwei0910410003/article/details/37988637 好长时间没有写blog了,之所以没有写,主要还是工作上的事, ...
- FW 编译Android系统源码和内核源码
编译Android系统源码和内核源码 分类: Android2014-07-21 20:58 7287人阅读 评论(28) 收藏 举报 好长时间没有写blog了,之所以没有写,主要还是工作上的事,发现 ...
- 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/ ...
- 编译Android系统源码和内核源码
[日期:2016-01-11] 来源:Linux社区 作者:jiangwei [字体:大 中 小] 把我之前编译Android系统源码和内核源码的过程记录一下,因为这个过程真的是受益匪浅,看 ...
- 编译Android系统源码(高通平台)
在Android源码根目录执行下面命令 source build/envsetup.sh choosecombo make –j4 其他命令(首先需要在android源码根目录执行source bui ...
- Android系统篇之—-编写简单的驱动程序并且将其编译到内核源码中【转】
本文转载自:大神 通过之前的一篇文章,我们了解了 Android中的Binder机制和远程服务调用 在这篇文章中主要介绍了Android中的应用在调用一些系统服务的时候的原理,那么接下来就继续来介绍一 ...
- Android FrameWork 学习之Android 系统源码调试
这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...
- Android之源码之模块编译和调试
Android之源码之模块编译调试 (一) 进行源码模块修改进行编译的调试 1.首先是从git或者svn上拉一套完整的工程下来,然后全编一下,一般这个时间比较长,大概会得2,3个小时左右, 2,编译成 ...
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...
随机推荐
- Java的精确整数计算-Bigdecimal学习总结和工具类
随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...
- python中的类
以下内容是python tutorial的读书笔记: 一.命名空间的分层 二.local赋值语句,nonlocal和global的区别 local赋值语句,它是无法实现对于最里层的作用域的重新绑定的 ...
- 分布式任务调度平台XXL-JOB
<分布式任务调度平台XXL-JOB> 一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...
- oracle数据库语句积累
1.从一个表选出数据更新另一个表(后面的exists一定要加) update jqhdzt set shid = (select shid from v_plat_userjqinfo t where ...
- C#的一些小知识
一.Server.MapPath E:\MyProject\GisSystem\Json\jsonlist.aspx,GisSystem项目下有个Json文件夹,文件夹下有个jsonlist.aspx ...
- MapReduce的架构及原理
MapReduce是一种分布式计算模型,是Hadoop的主要组成之一,承担大批量数据的计算功能.MapReduce分为两个阶段:Map和Reduce. 一.MapReduce的架构演变 客户端向Job ...
- 如何通过CSS实现背景图片自动平铺或拉伸至整个屏幕(自适应大小)
默认情况下,通过HTML代码的BODY标签设置好背景图片<body background="x.jpg"> 后,图片会自动横向和纵向平铺.这就会产生一些美观上的问题. ...
- django-团队简介的网页
团队简介的网页,是使用Django完成的 关于Django的教程网址:http://www.runoob.com/django/django-tutorial.html 小组作业成果如下:
- Python_替换当前目录下文件类型
''' 将当前目录的所有扩展名为html的文件重命名为扩展名为htm的文件 方法一 ''' import os file_list=os.listdir('.') for filename in fi ...
- linux下redis数据库的简单使用
一.redis简介 Redis是一个key-value存储系统.和 Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持list ...