Android AOSP源码研究之万事开头难----经验教训记录
文章目录
- 1.概述
- 2.Android源下载
- 1.配置环境变量
- 2.安装curl
- 3.下载repo并授权
- 4.创建一个文件夹保存源码
- 5.设置repo的地址并配置为清华源
- 6.初始化仓库
- 7.指定我们需要下载的源码分支并初始化
- 2.1 使用移动硬盘存放Android源码的坑
- 2.2 解决方法
- 3.Android源码编译
- 4.Android源烧录
1.概述
做了四五年的android应用层开发后,想研究下底层源码的实现,所以想下载源码研究下,但是万事开头难,源码下载的过程非常坎坷,我使用的是双系统(ubantu 和windows),主机的固态只有1TB,而android的源码下载完一个版本也有几百个G。所以我想到了使用移动硬盘来保存下载的Android源码。也就是这个决定,让我折腾了两个多月。所以本文主要介绍整个下载源码编译到刷机的教训。
2.Android源下载
根据网上的教程,我做了如下的配置,准备下载源码,这里默认读者已经安装git 工具,未安装的可以百度安装下。很简单这里就不废话了,另外下载源码的脚本中用到了Pyton,所以需要配置好python环境,python有两个版本python2和python3,我建议读者可以都安装,百度上有一种可以同时安装python2和python3的方法,然后可以自动切换,两个python的版本都安装的原因是我们下载源码的时候需要使用python3,而编译android源码的时候有时候需要使用python2,比如android10 的源码就是这样的,安装好了可切换的python环境后是这样的:

1.配置环境变量
kdir ~/bin
echo "PATH=~/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc
2.安装curl
sudo apt-get install curl
3.下载repo并授权
因为android的源码特别大,所以是使用repo工具管理,不理解repo工具的可以去android官网或者百度了解,这里不做讲解。
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
4.创建一个文件夹保存源码
在这里我下载的是android9.0的源码,其实下载那个版本的都一样,只要把后面的分支名字改了就可以,而这些分支名字的获取地址为:android代号、标记、build号
打开上面的地址后,如下:

上图中选中的地方就是我下载源码对应版本的分支名称,我们只需要复制它放到后面下载命令中就可以了
然后我们新建一个目录准备开始下载源码

5.设置repo的地址并配置为清华源
由于一些特殊原因,在咱们国家无法直接访问国外的网,所以需要我们使用国内镜像,清华镜像或者中科大的镜像都可以下载android源码,如果有VPN 可以翻墙的小伙伴也可以直接下载源码,具体的下载方法就是把下面的地址换成google官方的android源码地址即可,在我们新建的存放源码的目录下打开命令行执行下面的命令
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
6.初始化仓库
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
7.指定我们需要下载的源码分支并初始化
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r46
上面命令中的android-9.0.0_r46 就是第4步中获取到的分支名
运行上面的命令成功后如下
最后执行命令:
repo sync
开始同步代码,同步可能需要很长的时间而且中间还可能会出错,出错的原因大多数都是网络,一直同步代码就行了,具体的坑,请看下面的内容,下载成功后的结果如下所示:

2.1 使用移动硬盘存放Android源码的坑
我开始下载源码选择移动硬盘是想着可以将源码携带着随时都能看,而且还解放了我的主机的存储空间,想法非常的丰满,但是现实很骨感,当然归根结底也是因为我穷,如果一开始我直接就将电脑的所有配置拉满,应该不会这么坎坷。我使用移动硬盘,将其格式化成NTFS格式,然后去下载源码,下载的过程很长,刚开始的时候,下载老是报错,因为一下载源码,就会在本地被莫名奇妙的修改文件,导致老是和线上的代码冲突报错,最后我发现了一招可以解决这个报错,就是把所有本地的修改强制回退一个版本,然后再拉,就成功了。命令如下所示:
repo forall -c "git add -A" && repo forall -c "git reset HEAD^^^ --hard" && repo sync
这一通操作下来,终于显示代码下载成功了,我以为我的快乐已经到达了顶峰,可是现实给了我一逼兜。当我准备编译源码的时候发现无法编译,因为我拉的源码不全,罪魁祸首就是文件系统的问题,由于移动硬盘使用的是NTFS 文件系统,导致在Ubantu中有部分文件无法识别,也就是无法创建,所以下载的文件会有缺失,由于是编译的时候出错,我打开了blueprint目录,在这个目录下使用git命令回退版本拉取最新代码时发现报错,错误大概意思就是无法创建文件名为*号的文件夹。然后我在另一个Ubantu本机目录下载blueprint,然后对比android源码目录中的发现确实少了好几个目录,所以导致了编译不成功。自此移动硬盘存放android源码并且编译的这条路被彻底堵死。所以想这么干的小伙伴可以停止你的想法了。
2.2 解决方法
既然无法使用移动硬盘,我们就只能是使用Ubantu的系统的存错来存放android源码,但是我们的系统固态硬盘只有1TB,所以解决办法就是扩容,为此我花巨资买了一个固态硬盘安装上后,下载代码贼快,编译也是一把过,就是一个字,爽,再提一句,主机下载代码最好连接网线,不要用无线网卡,会很慢
3.Android源码编译
源码下载完后就是编译,编译网上会有一堆教程,这里就给大家简单介绍下注意点,网上的有些教程会让你扩大交换空间就是执行
sudo fallocate -l 1G /swapfile
这个命令切记不要随便用,如果你的系统空间本来就紧张的话使用这个命令会导致你系统重启的时候一直卡在启动页,连恢复模式都进不了
编译源码需要安装依赖,百度网上一堆,这里随便列一个吧
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
sudo apt-get install libssl-dev
安装JDK
sudo apt-get install openjdk-8-jdk
编译源码还需要对应的Python环境,这里我们配置好可切换的python后切换即可,例如如果是android10,使用python2,我的办法就是先编译源码,如果python脚本报错,我就切换另外一个python环境。
编译代码之前还需要我们去下载对应的驱动二进制文件android 对应驱动二进制文件,下载完后会得到两个可执行的bash脚本,然后我们将其复制到源码目录,执行生成vendor目录。
如上图所示,就是图中选中的两个文件。执行完后我们准备编译源码
编译的命令如下:
//1.设置环境变量
source build/envsetup.sh
//2.使用lunch命令选择对应的源码配置
lunch
// 3.开始编译
make -j8 // 可以是-j4 或不带参数
然后接下来就是漫长的等待编译完成。
如果想要清理上次的编译产物我们可以执行命令
make clobber
然后删除生成的out目录就可以了
4.Android源烧录
编译完源码后就是烧录进手机了,我们要想往手机中烧录代码必须要求手机可以进行oem解锁,解锁完后使用命令进入bootloader模式
adb reboot bootloader
然后进入我们编译的结果目录

上图是我编译android10源码后生成的目录,其他版本的源码结构也差不多哦,这里我使用的是模拟器的方式,因为我买的google pixel一代太垃圾刷了后时好时坏的,我的目的是了解这个过程,所以我就使用了模拟器。不过使用真机刷机一定要注意:不然手机就成砖了,就是千万不要在刷机的过程中使用fastboot命令锁oem 千万不要,千万不要,因为开启oem是需要你的手机能开机进入系统设置的,万一你刷机不成功,又无法今日系统,然后你的手机oem还锁了,那就没救了。所以要刷机的小伙伴注意了。只要oem不锁,随便刷,刷坏了可以去找对应的原厂镜像包刷来恢复。这里给出google pixel 和nexnus的原厂镜像包地址:google pixel 和nexnus的原厂镜像包地址
使用模拟器的方式编译源码的时候我们可以直接运行命令emulator,就可以打开模拟器啦

这些就是我的下载AOSP 源码之路的坑和教训,如果读者还经历过其他坑的话,欢迎评论区交流。本文到此结束
相关文章:
Android AOSP源码研究之万事开头难----经验教训记录
文章目录 1.概述2.Android源下载1.配置环境变量2.安装curl3.下载repo并授权4.创建一个文件夹保存源码5.设置repo的地址并配置为清华源6.初始化仓库7.指定我们需要下载的源码分支并初始化 2.1 使用移动硬盘存放Android源码的坑2.2 解决方法 3.Android源码编译4.Android源烧录 1.…...
动态数据源
一、部署 1、导入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.1.0</version></dependency>2、编写yml 配置文件 spring:datasource:dyna…...
2024.1.29力扣每日一题——自由之路
2024.1.29 题目来源我的题解方法一 动态规划 题目来源 力扣每日一题;题序:514 我的题解 方法一 动态规划 定义 dp[i][j] 表示从前往后拼写出 key的第 i个字符, ring 的第 j个字符与 12:00 方向对齐的最少步数(下标均从 0 开始&…...
Qt应用软件【协议篇】UDP示例
UDP协议简介 UDP(用户数据报协议)是一种无连接的网络协议,提供了简单但是不可靠的消息传输服务。与TCP不同,UDP不保证数据包的顺序、重复性或者可达性,但它在速度和效率上具有优势,特别适合那些对实时性要求高的应用,如视频流、在线游戏等。 Qt中的UDP编程 在Qt中,U…...
MyBatis之动态代理实现增删改查以及MyBatis-config.xml中读取DB信息文件和SQL中JavaBean别名配置
MyBatis之环境搭建以及实现增删改查 前言实现步骤1. 编写MyBatis-config.xml配置文件2. 编写Mapper.xml文件(增删改查SQL文)3. 定义PeronMapper接口4. 编写测试类1. 执行步骤2. 代码实例3. 运行log 开发环境构造图总结 前言 上一篇文章,我们…...
百面嵌入式专栏(面试题)内存管理相关面试题1.0
沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍内存管理相关面试题 。 一、内存管理相关面试题 page数据结构中的_refcount和_mapcount有什么区别?匿名页面和高速缓存页面有什么区别?page数据结构中有一个锁,我们称为页锁,请问trylock_page()和loc…...
SpringMVC 1.请求参数检查 2.全局异常处理 3.请求参数封装为Pojo
ErrorEnum.java // 枚举所有的错误 package com.example.demo.enums;import lombok.Getter;public enum ErrorEnum {SYSTEM_ERROR(-1, "系统错误"),PARAM_ERROR(-2, "参数错误"),OK(0, "成功"),;Getterprivate final int code;Getterprivate fi…...
7机器人位姿的数学描述与坐标变
由上次刚体的空间转动直接切换为机器人相关术语。 1.机器人位姿的数学描述与坐标变换 1.1位姿描述 {B}相对于{A}的姿态描述用3x3矩阵表示为: 式中为三个单位正交主矢量,分别表示刚体坐标系{B}的三个坐标轴XBYBZB在参考系{A}中的方位,∠XBXA表…...
基于ESP8266 开发板(MCU)遥控小车
遥控小车 遥控界面 【项目源码】 第一版ESP8266 https://github.com/liyinchigithub/esp8266_car_webServerhttps://github.com/liyinchigithub/esp8266_car_webServer 第二版ESP32 GitHub - liyinchigithub/esp32-wroom-car: 嵌入式单片机 ESP32 Arduino 遥控小车&a…...
【C生万物】C语言数据类型、变量和运算符
📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…...
CTF--Web安全--SQL注入之‘绕过方法’
一、什么是绕过注入 众所周知,SQL注入是利用源码中的漏洞进行注入的,但是有攻击手段,就会有防御手段。很多题目和网站会在源码中设置反SQL注入的机制。SQL注入中常用的命令,符号,甚至空格,会在反SQL机制中…...
线程池常用的阻塞队列
新任务来的时候,会先判断当前运行的线程数量是否达到核心线程数,如果达到的话,新任务就会被存放在队列中。 不同的线程池会选用不同的阻塞队列,我们可以结合内置线程池来分析。 ● 容量为 Integer.MAX_VALUE 的 LinkedBlockingQue…...
【Java EE】----SpringBoot的日志文件
1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用: 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为:(1-6级别从低到高) trace:微量&#…...
【网络安全】2024年暗网威胁分析及发展预测
暗网因其非法活动而臭名昭著,现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心,为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势,近日,卡巴斯基的安全研究…...
SpringMVC-组件解析
一、引子 我们在上一篇文章Spring MVC-基本概念中,为读者解释了如何使用SpringMVC框架,将承接客户端请求的工作从原生的Servlet转移到我们熟知的Controller中。那么我们不禁会好奇,SpringMVC框架到底做了什么,是怎么把请求分发给…...
ubuntu22.04@laptop OpenCV Get Started: 002_reading_writing_videos
ubuntu22.04laptop OpenCV Get Started: 002_reading_writing_videos 1. 源由2. Read/Display/Write应用Demo3 video_read_from_file3.1 C应用Demo3.2 Python应用Demo3.3 重点过程分析3.3.1 读取视频文件3.3.2 读取文件信息3.3.3 帧读取&显示 4 video_read_from_image_sequ…...
Elasticsearch(ES) 简述请求操作索引下文档 增删查改操作
上文 Elasticsearch(ES) 创建带有分词器规则的索引 带着大家创建了一个带有分词功能的索引 老规矩 我们启动一下ES服务 本文 我们就来说说 关于文档的操作 我们先来添加一个文档 就像数据库加一条数据一样 这里 并不需要指定什么表结构和数据结构 它的文档结构是无模式的 添…...
Chrome扩展开发纪要
1. 开发人员模式 以Edge(Chromium)为例, 可在管理扩展页, 在左侧开发人员模式打开, 只有此项开启后才能加载未压缩的扩展, 虽然也可以打包扩展, 但是浏览器会检测, 未上线的crx包是无法被安装的. 所以不打算上架的crx只能使用 加载解压缩的扩展 安装 2. 创建扩展 2.1 建立文…...
LeetCode-第28题-找出字符串中第一个匹配项的下标
1.题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 2.样例描述 3.思路描述 可以让字符串 …...
分享90个行业PPT,总有一款适合您
分享90个行业PPT,总有一款适合您 90个行业PPT下载链接:https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
