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 - 蓝奏云 学习知识费力气,收集整理更不易…...
Deep Lake:统一多模态AI数据存储与向量检索的实践指南
1. 项目概述:Deep Lake,一个为AI而生的数据湖 如果你正在构建一个需要处理图像、文本、音频、PDF,甚至医学影像DICOM文件的大模型应用,或者你在训练一个需要高效加载海量数据的深度学习模型,那么你很可能正被数据管理…...
KG与LLM:大模型时代的智能规划
这些文章给出的“推荐思路”可以浓缩成一句话 先用 Planner 产出 subgoal dependency acceptance criteria。再让 Router 判断每个子任务该走 向量RAG、KG、数据库还是工具。对需要关系、多跳、时序、因果的问题,用 KG / event graph 做结构化检索,而…...
观测云 4 月产品升级报告 | 统一目录、Obsy AI 全新上线,基础设施、场景、监控告警、管理多项能力升级
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
Dify工作流构建指南:从业务需求到可运行AI应用的全流程解析
1. 项目概述:从业务需求到可运行工作流的全栈构建器如果你正在使用 Dify 这类低代码 AI 应用开发平台,大概率遇到过这样的困境:脑子里有一个清晰的业务想法,比如“我想做一个能自动处理客服工单并生成摘要的机器人”,但…...
疫情如何重塑GPU市场:从游戏硬件到数字基础设施的演变
1. 市场预期的“扭曲”:疫情如何重塑GPU行业逻辑如果你在2020年初问任何一位半导体行业的分析师,他们对当年第二季度GPU(图形处理器)市场的预测,大概率会得到一个基于历史季节性规律的保守或平稳的答案。然而ÿ…...
DeepSeek Serverless冷启动优化实录:从1200ms到47ms的7次迭代,附Go/Rust双语言Runtime调优参数表
更多请点击: https://intelliparadigm.com 第一章:DeepSeek Serverless冷启动优化全景概览 DeepSeek Serverless 平台在 AI 模型推理场景中面临显著的冷启动延迟挑战,尤其当模型权重加载、CUDA 上下文初始化与 Python 运行时预热叠加时&…...
“为什么我的NotebookLM Agent总在胡说?”——20年NLP老兵手把手调试LLM引用可信度的5个黄金检查点
更多请点击: https://intelliparadigm.com 第一章:NotebookLM Agent研究辅助 核心能力与适用场景 NotebookLM Agent 是 Google 推出的基于私有文档理解的 AI 助手,专为研究者设计。它支持上传 PDF、TXT、Markdown 等格式的研究资料…...
中文知识管理利器:本地化部署与向量检索实践指南
1. 项目概述:一个面向中文用户的知识管理利器 最近在折腾个人知识库,发现了一个挺有意思的开源项目,叫 RomeoSY/zh-knowledge-manager 。乍一看名字,你可能觉得这又是一个“知识管理”工具,市面上不是有 Notion、Ob…...
牛逼!119K star,微软开源神器,一款功能超强大的markdown 文档转换工具!
不知道大家跟豆包、DeepSeek、ChatGPT这些AI对话的时候,有没有注意到——AI返回给你的内容,复制到Word、PPT里,前面经常有一堆 #、*、- 这样的符号?很多新手小白看到这些"乱码"就懵了,以为是复制出了问题。其…...
口碑好的芯片老化座哪家专业
在芯片制造与测试领域,芯片老化座是一个至关重要的设备。它能够模拟芯片在长期使用中的各种环境条件,提前发现潜在问题,确保芯片在实际应用中的稳定性和可靠性。那么,口碑好的芯片老化座哪家专业呢?今天我们就来详细探…...
