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 源码之路的坑和教训,如果读者还经历过其他坑的话,欢迎评论区交流。本文到此结束

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式单片机中晶振的工作原理

晶振在单片机中是必不可少的元器件,只要用到CPU的地方就必定有晶振的存在,那么晶振是如何工作的呢? 什么是晶振 晶振一般指晶体振荡器,晶体振荡器是指从一块石英晶体上按一定方位角切下的薄片,简称为晶片。 石英晶体谐…

报错ValueError: Unknown CUDA arch (8.6) or GPU not supported

文章目录 问题描述解决方案参考文献 问题描述 报错 ValueError: Unknown CUDA arch (8.6) or GPU not supported 本人显卡为 RTX 3060,CUDA 为 10.2,PyTorch 为 1.5 解决方案 修改 C:\Users\Administrator\Envs\test\Lib\site-packages\torch\utils\c…

MVC框架学习

大一的时候写过一个mvc框架的跑酷游戏,但是那时候基础不扎实,没学明白也没听懂。现在深入的学习一下 以下内容参考:MVC 模式 | 菜鸟教程 (runoob.com) MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器&#xff…

单片机学习笔记---LED点阵屏显示图形动画

目录 LED点阵屏显示图形 LED点阵屏显示动画 最后补充 上一节我们讲了点阵屏的工作原理,这节开始代码演示! 前面我们已经说了74HC595模块也提供了8个LED,当我们不使用点阵屏的时候也可以单独使用74HC595,这8个LED可以用来测试7…

了解海外云手机的多种功能

随着社会的高度发展,海外云手机成为商家不可或缺的工具,为企业出海提供了便利的解决方案。然而,谈及海外云手机,很多人仍不了解其强大功能。究竟海外云手机有哪些功能,可以为我们做些什么呢? 由于国内电商竞…

ChatGPT 变懒最新解释!或和系统Prompt太长有关

大家好我是二狗。 ChatGPT变懒这件事又有了最新解释了。 这两天,推特用户Dylan Patel发文表示: 你想知道为什么 ChatGPT 和 6 个月前相比会如此糟糕吗? 那是因为ChatGPT系统Prompt是竟然包含1700 tokens,看看这个prompt里面有多…

波奇学Linux: 文件描述符

文件和操作系统的关系 操作系统控制进程,文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息,操作系统通过控制PCB的信息来控制文件的读写。 Q1:如何证明文件打开是在进程中进行? 编写c文件调用fopen来操作文件…

032-安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

032-安全开发-JavaEE应用&Servlet路由技术&JDBC&Mybatis数据库&生命周期 #知识点: 1、JavaEE-HTTP-Servlet技术 2、JavaEE-数据库-JDBC&Mybatis 演示案例: ➢JavaEE-HTTP-Servlet&路由&周期 ➢JavaEE-数据库-JDBC&Mybat…

2月3日作业

1.编程实现单向循环链表的头插&#xff0c;头删、尾插、尾删 尾插/头插&#xff0c;头删&#xff0c;尾删&#xff1a; 头文件&#xff1a; #ifndef __HEAD_H_ #define __HEAD_H_#include<stdio.h> #include<string.h> #include<stdlib.h>enum {FALSE-1,SU…

大模型是如何实现Function Call函数调用的?

▼最近直播超级多&#xff0c;预约保你有收获 近期直播&#xff1a;《Agent 企业级应用案例实战》 —1— 大模型如何实现函数调用&#xff1f; 大模型要实现精确的函数调用&#xff08;Function Call&#xff09;需要理解能力和逻辑能力&#xff0c;理解能力就是对用户的 Prom…

Ps:窗口排列

Ps菜单&#xff1a;窗口/排列 Window/Arrange Photoshop 的“窗口/排列” Arrange子菜单中提供了多种方式来组织和查看打开的文档窗口&#xff0c;这在处理多个文档或比较图像时非常有用。 ◆ ◆ ◆ 常用操作方法与技巧 1、同文档双窗口处理法 将同一个图像显示在两个窗口中&…

基于java+springboot+vue实现的仓库管理系统(文末源码+Lw)23-115

1 绪论 现在大家正处于互联网加的时代&#xff0c;对于物资信息的管理来说&#xff0c;传统的通过纸质文档记录信息的方式已经落后了&#xff0c;依靠手工管理物资信息&#xff0c;不仅花费较长的工作时间&#xff0c;在对记录各种信息的文档进行信息查询以及信息核对操作时&a…

【doghead】uv_loop_t的创建及线程执行

worker测试程序,类似mediasoup对uv的使用,是one loop per thread 。创建一个UVLoop 就可以创建一个uv_loop_t Transport 创建一个: 试验配置创建一个: UvLoop 封装了libuv的uv_loop_t ,作为共享指针提供 对uv_loop_t 创建并初始化

vue3 之 商城项目—二级分类

二级分类功能描述 配置二级路由 准备组件模版 <script setup></script><template><div class"container "><!-- 面包屑 --><div class"bread-container"><el-breadcrumb separator">"><el-bre…

初识NodeJS

本文主要基于极客时间《Nodejs开发实战》课程。 本篇&#xff08;一&#xff09;为课程的第二篇——技术预研篇。 什么是Nodejs? 来源官网&#xff1a; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#x…

计算机网络相关题目及答案(第八章)

第八章 习题&#xff1a; P19. 考虑下面对于某 SSL会话的一部分的Wireshark输出。 a. Wireshark分组112是由客户还是由服务器发送的? b.服务器的IP地址和端口号是什么? c.假定没有丢包和重传&#xff0c;由客户发送的下一个TCP报文段的序号将是什么? d. Wireshark分组…

(十七)springboot实战——spring securtity的授权流程源码解析

前言 本节内容是关于spring security安全框架授权流程的源码分析&#xff0c;spring security的授权流程主要是在FilterSecurityInterceptor过滤器中实现的。我们会通过源码层级的分析&#xff0c;了解清楚spring security的底层是如何实现用户授权的。 正文 1.配置一个请求…

【LeetCode每日一题】525连续数组 303区域和检索(前缀和的基本概念和3个简单案例)

前缀和 // 构造prefix let prefix [0] arr.forEach(num > {prefix.push(prefix.at(-1) num); })如果想要计算某个区间 i 到 j 这个子数组的和时&#xff0c;可以根据 prefix[j1] - prefix[i] 获得。 例题1&#xff1a;303.区域和检索 - 数组不可变 给定一个整数数组 num…

【stomp实战】websocket原理解析与简单使用

一、WebSocket 原理 WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术&#xff0c;属于应用层协议。它基于TCP传输协议&#xff0c;并复用HTTP的握手通道。浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接&#xff0c; 并…

有道ai写作,突破免费限制,无限制使用

预览效果 文末提供源码包及apk下载地址 有道ai写作python版 import hashlib import time import json import ssl import base64 import uuidfrom urllib.parse import quote import requests from requests_toolbelt.multipart.encoder import MultipartEncoder from Crypto…