Pixel4 安卓源码及内核修改编译教程 | 基于Android12 AOSP

之前整理了 Pixel4上的源码过程,下载的话大家可以去镜像网站下载,可以节约很多时间。
实验设备:Ubuntu18.04 32G+2T Pixel4

文章目录

  • 一、安卓源码下载
    • 1.准备下载环境
      • (1)安装Python 3.9
      • (2)安装git
      • (3)安装curl
      • (4)配置环境变量 安装repo
    • 2.下载源代码
      • (1)创建目录
      • (2)初始化仓库
      • (3)同步
      • (4)拉取repo shell脚本
  • 二、安卓源码编译
    • 1.安装jdk
    • 2.使用 ubuntu 14+,需要安装以下依赖包
    • 3.安装libncurses5
    • 4.构建编译环境依赖
    • 5.下载编译驱动
    • 6.开始编译
    • 7.刷机
      • (1)fastboot 安装
      • (2)安装kvm
      • (3)进入reboot-bootloader模式
      • (4)配置ANDROID_PRODUCT_OUT环境
      • (5)刷机
  • 三、内核构建&编译刷机
    • 1.下载相应分支的源代码
    • 2.内核编译
      • (1)改变Touch路径
      • (2)编译内核
      • (3)刷入设备
      • (3)重启
  • 四、参考资料
    • AOSP
    • 刷机

一、安卓源码下载

1.准备下载环境

(1)安装Python 3.9

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.9
sudo apt-get install python

(2)安装git

sudo apt-get upgrade
sudo apt-get install git
git config --global user.email "xxxxxxx@gmail.com"
git config --global user.name "xxxxx"

(3)安装curl

sudo apt-get install curl

(4)配置环境变量 安装repo

mkdir ~/bin
PATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo打开bin文件夹下的repo将
REPO_URL = 'https://gerrit.googlesource.com/git-repo'
改为
REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

如果替换了还不行?可尝试以下方案之一:

curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo

可选项,给repo换个源,把该执行放到~/.bashrc环境变量中

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

2.下载源代码

(1)创建目录

mkdir android12.0.0
cd android12.0.0

(2)初始化仓库

重开终端 PATH 会失效,可以在使用时直接改成绝对路径 python3 ~/bin/repo xxx

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest

其他镜像地址供参考,不要全copy输入一遍,参考用的!

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

以下是分支仓库(拉取特定TAG用的!!!)
版本号要对应!!!版本号要对应!!!版本号要对应!!!

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r11

网络不行就试试其他镜像地址,不要直接照搬,对照修改,下面3种方案:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-12.0.0_r9
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b  android-12.0.0_r3
python3 ~/bin/repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r28

可以登录以下网页查看自己手机对应的版本号【魔法】
https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds

如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:

REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

(3)同步

repo sync -j$(nproc)

(4)拉取repo shell脚本

touch repo.sh       # 1. 创建 repo.sh 文件
vim repo.sh         # 2. 复制下面的脚本内容到 repo.sh 里面
chmod a+x repo.sh   #3. 修改权限
./repo.sh            # 4. 运行脚本,万事大吉
#!/bin/bash
python3 ~/bin/repo sync -j4
while [ $? -ne 0 ]
do
echo "======sync failed ,re-sync again======"
sleep 3
python3 ~/bin/repo sync -j4
done

二、安卓源码编译

准备编译环境

1.安装jdk

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

2.使用 ubuntu 14+,需要安装以下依赖包

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

3.安装libncurses5

sudo apt install libncurses5

4.构建编译环境依赖

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt-get install libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache libncurses5

5.下载编译驱动

https://developers.google.cn/android/drivers#flamesp1a.210812.016.a1
去以上网站找对所下载安卓源代码版本所对应的驱动下图buildID要对应

如果只是运行模拟器忽略这一步。Pixel4手机需要下载驱动编译脚本–脚本链接,下载机器对应的驱动编译脚本文件并解压,得到extract-google_devices-flame.sh和extract-qcom-flame.sh,放到源码的根目录执行(会让输入 I ACCEPT,回车别按的太快,之后ctrl+c 跳过),执行后会得到vender目录
执行以下命令,不同机型命令不一

./ extract-qcom-flame.sh  
./extract-google_devices-flame.sh

6.开始编译

cd #(源代码文件名)
source build/envsetup.sh  (每次关闭 Shell 之后都需要重新执行配置环境)
make clobber
lunch

输入#后的数字(找到pixel4对应 aosp-flame -userdebug 输入对应数字)

make -j$(nproc)

7.刷机

准备刷机环境

(1)fastboot 安装

sudo apt-get install  android-tools-fastboot

(2)安装kvm

sudo apt-get install qemu-kvm

开始刷机

(3)进入reboot-bootloader模式

(无反应可先进入adb reboot bootloader)

fastboot reboot-bootloader

(4)配置ANDROID_PRODUCT_OUT环境

export ANDROID_PRODUCT_OUT=/绝对路径/out/target/product/flame(注意要用自己的路径替代)

(5)刷机

fastboot flashall -w

三、内核构建&编译刷机

1.下载相应分支的源代码

mkdir android-kernel && cd android-kernel 
python3 ~/bin/repo init -u https://aosp.tuna.tsinghua.edu.cn/kernel/manifest -b android-msm-coral-4.14-android12
repo sync -j$(nproc)

2.内核编译

(1)改变Touch路径

将 /kernel/private/msm-google-modules/touch/fts/flame目录下的文件剪切到/kernel/private/msm-google-modules/touch/fts/目录下删除flame

sudo apt-get install libssl-dev

(2)编译内核

在内核主目录下

./build/build.sh

(3)刷入设备

1、永久刷入设备【参考刷AOSP】出错不能恢复默认内核,不推荐:
在编译好的安卓源码⽬录下有⼀个out⽂件夹,将⽬录out/target/product/flame⽬录下的 *.img和kernel删除

rm *.img kernel 

然后备份安卓源码的⽬录device/google/coral-kernel下的Image.lz4,⽤内核源码中的 Image.lz4进⾏替换
回到安卓⽬录后进⾏:

source build/envsetup.sh 
make -j$(nproc)

2、【推荐】快速刷入内核

adb reboot bootloader
fastboot boot /home/wangheng/kernel12/kernel12/out/android-msm-pixel-4.14/private/msm-google/arch/arm64/boot/Image.lz4-dtb

(3)重启

fastboot reboot

四、参考资料

AOSP

1、http://liuwangshu.cn/batcoder/aosp/2-download-aosp.html
2、https://blog.csdn.net/y738587653/article/details/119983521?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link
3、http://liuwangshu.cn/batcoder/aosp/3-compiling-aosp.html
4、https://blog.csdn.net/weixin_45767368/article/details/105962606#t1
5、https://blog.csdn.net/grackergao/article/details/120984766
6、https://www.cnblogs.com/palance/p/5187103.html

刷机

1、https://blog.csdn.net/y738587653/article/details/119983521
2、https://www.droidwin.com/fix-failed-remote-partition-should-be-flashed-in-fastbootd/#Fix_1_Use_the_latest_ADB_Fastboot_Binaires
3、https://jingyan.baidu.com/article/5552ef47a15249518ffbc9ec.html
4、https://developer.android.com/studio/releases/platform-tools

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeeper+kafka

目录 Kafka概述 一、为什么需要消息队列(MQ) 二、使用消息队列的好处 三、消息队列的两种模式 四、Kafka 定义 五、Kafka 简介 六、Kafka 的特性 七、Kafka 系统架构 分区的原因 八、部署kafka 集群 1.下载安装包 2.安装 Kafka 3.修改…

风控安全产品系统设计的一些思考

背景 本篇文章会从系统架构设计的角度,分享在对业务安全风控相关基础安全产品进行系统设计时遇到的问题难点及其解决方案。 内容包括三部分:(1)风控业务架构;(2)基础安全产品的职责&#xff1…

Python“牵手”1688商品详情页数据采集方法,1688API接口申请指南

1688详情接口 API 是开放平台提供的一种 API 接口,它可以帮助开发者获取商品的详细信息,包括商品的标题、描述、图片等信息。在电商平台的开发中,详情接口API是非常常用的 API,因此本文将详细介绍详情接口 API 的使用。 一、1688…

mysql8查看执行sql历史日志、慢sql历史日志,配置开启sql历史日志general_log、慢sql历史日志slow_query_log

0.本博客sql总结 -- 1.查看参数 -- 1.1.sql日志和慢sql日志输出方式(TABLE/FILE)。global参数 SHOW GLOBAL VARIABLES LIKE log_output; -- 1.2.sql日志开关。global参数 SHOW GLOBAL VARIABLES LIKE general_log%; -- 1.3.慢sql日志开关。global参数 SHOW GLOBAL VARIABLE…

AWS Amplify 部署node版本18报错修复

Amplify env:Amazon Linux:2 Build Error : Specified Node 18 but GLIBC_2.27 or GLIBC_2.28 not found on build 一、原因 报错原因是因为默认情况下,AWS Amplify 使用 Amazon Linux:2 作为其构建镜像,并自带 GLIBC 2.26。不过,…

UNIX 入门

与 UNIX 建立连接启动会话登录命令提示符修改口令退出系统 简单的 UNIX 命令命令格式ls 命令who 命令虚拟终端 tty伪终端 ptywho am i 命令 cal 命令help 命令man 命令 shell 概述shell 命令更换 shell临时更改 shell永久更改 shell 登录过程 与 UNIX 建立连接 启动会话 要启…

RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中,交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题,可以使用备份交换机。 为处理在消息队列中到达TTL的过期消息,可采用死信交换机进行消息转存。 通过上述描述可知&…

P1049 [NOIP2001 普及组] 装箱问题(背包)(内附封面)

[NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V,同时有 n n n 个物品,每个物品有一个体积。 现在从 n n n 个物品中,任取若干个装入箱内(也可以不取),使箱子的剩余空间最小。输出这个最…

数据库作业(一)

建立一张表: 表里面有多个字段,每一个字段对应一种数据类型 注意:表名,字段名都要起的有意义 1、首先mysql -uroot -p 进入MySQL 2、选择一个数据库并使用 3、创建一张表定义多个字段使用所有数据类型,数字&…

2. 内存分区模型

一、内存分区模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值&a…

【SQL应知应会】索引(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 索引 • MySQL版 前言一、索引1.简介1.1 索引的优点…

Dockerfile部署golang,docker-compose

使用go镜像打包,运行在容器内 redis和mysql用外部的 项目目录结构 w1go项目: Dockerfile # 这种方式是docker项目加上 本地的mysql和redis环境 # go打包的容器 FROM golang:alpine AS builder# 为我们镜像设置一些必要的环境变量 ENV GO111MODULEon …

音视频技术开发周刊 | 305

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 大神回归学界:何恺明宣布加入 MIT 「作为一位 FAIR 研究科学家,我将于 2024 年加入麻省理工学院(MIT)电气工程与计算机科学…

国联易安网页防篡改保护系统“渠道招募”启动啦!

作为业内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全的领军企业,国联易安网页防篡改保护系统基于“高效同步”、“安全传输”两项技术,具备了独特的“五重防护”新特性,支持网页的全自动发布、网页监控、报警和自…

P1993 小 K 的农场(差分约束)(内附封面)

小 K 的农场 题目描述 小 K 在 MC 里面建立很多很多的农场,总共 n n n 个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m m m 个),以下列三种形式描述:…

Win7之MS12-020死亡蓝屏

一,何为死亡蓝屏 1,简介 死亡蓝屏利用RDP协议,基于3389远程桌面端口对目标主机进行攻击,使目标机系统瘫痪导致蓝屏,严重影响着计算机的正常使用。 2,条件 1>目标操作系统未开启防火墙和杀毒软件等 2&g…

API接口用例生成器

一、前言 随着自动化测试技术的普及,已经有很多公司或项目,多多少少都会进行自动化测试。 目前本部门的自动化测试以接口自动化为主,接口用例采用 Excel 进行维护,按照既定的接口用例编写规则,对于功能测试人员来说只…

element表格+表单+表单验证结合运用

目录​​​​​​​ 一、结果展示 二、实现代码 一、结果展示 1、图片 2、描述 table中放form表单,放输入框或下拉框或多选框等; 点击添加按钮,首先验证表单,如果存在没填的就验证提醒,都填了就向下添加一行表单表…

GATK BaseRecalibratorSpark 过程中因Too many open files终止

Error: GATK BaseRecalibratorSpark 过程中因Too many open files终止 执行命令: nohup time ./gatk --java-options "-Xmx16G" BaseRecalibratorSpark -R ../../alignment/hg38/hg38.fa -I ../../alignment/bam/P368T.sorted.markdup.bam …

JDK动态代理原理

本文主要讲解下JDK动态代理的实现原理&#xff0c;其基本使用如下&#xff1a; // 实例化自定义调用处理器实例 InvocationHandler handler new MyInvocationHandler(...); // 获取代理对象方式一 Class<?> proxyClass Proxy.getProxyClass(Foo.class.getClassLoade…