Window下载Android源码

article/2025/8/24 20:55:04

Android 10源码下载

想要研究Android 源码的同学可以用此方法进行下载。源码从清华大学开源软件镜像站(https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/)下载。

使用Linux的同学直接参照清华镜像站提供的使用帮助(https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/)即可,本文主要介绍在window平台下进行源码下载。

环境

操作系统:Window 10

Git :2.38.1

Node:v14.19.1

Node环境不是必须的,使用node是编写一个小程序实现自动下载Android源码的功能,也可以使用其他语言实现自动下载的功能。下面会详细介绍下载的逻辑。

初始化manifest仓库

我们克隆manifest仓库,这个仓库并不是安卓源码仓库,这个仓库很小,他只是列出了安卓源码仓库列表。

git clone https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest

在这里插入图片描述

克隆成功后,manifest目录内容如下:

在这里插入图片描述

选择分支

然后我们看下分支都有什么,每个分支都对应着Android的不同版本。有很多内容,滚动条滚到下方才能看到。

cd manifest
git tag

在这里插入图片描述

我选择了android-10.0.0_r47这个分支,他下载的就是android10源码的清单文件了。

在这里插入图片描述

成功之后,default.xml文件中记录的就是android10系统各个模块的路径了。

接下来,我们就要下载各个模块的源码了。

下载源码

在下载源码之前,我们先要看下default.xml文件中内容。
在这里插入图片描述

我们看到,已经切换到android-10.0.0_r47的分支了。

下面的每一个标签就代表一个模块。我们看下的属性:

  1. path:是文件路径,我在下载的时候就按照这个路径存储各模块的源代码
  2. name:git地址后缀,要加上清华镜像站的地址拼成完成的地址,这个完整的路径就是模块的git仓库地址。比如platform/build 最后要拼成https://aosp.tuna.tsinghua.edu.cn/platform/build.git

然后我们梳理一下自动下载源码的功能:

1.首先,读取default.xml的文件内容,得到一个包含所有project的集合

2.然后,遍历这个集合,根据path创建本地文件夹,根据name生成完整git路径,然后执行git clone。

下面就是我用JS+Node API实现的自动下载功能:

使用了两个JS库:

  • xml2js: 将xml文件内容转为js的对象,然后直接这个对象的属性进行操作就行。
  • mkdirp:Node 本身不支持创建多级目录,使用这个库可以实现创建多级目录的功能。
const fs = require('fs')
const xml2js = require('xml2js')
const { mkdirp } = require('mkdirp')
const { spawn } = require('child_process');//安卓源码下载路径,所有的模块都下载到这个文件夹下
const ANDROID_SRC_PATH = 'E:\\Source2023\\OS\\AndroidOS\\Android10\\'
//git.exe的路径 git设置了全局变量不用这个也可以
const GIT_PATH = 'D:\\software\\Git\\bin\\git.exe'
//清单文件的路径
const MANIFEST_PATH = 'E:\\Source2023\\OS\\AndroidOS\\manifest\\default.xml'
//清华镜像站地址,注意后面的斜杠,因为各project的path前面没有斜杠
const TSINGHUA_GIT_PATH = 'https://aosp.tuna.tsinghua.edu.cn/'//xml解析成js对象的实例
const parser = new xml2js.Parser()//任务checkout下标,标识当前下到第几个project
let projectIndexByCheckOut = 0;
//project集合
let projects = [];/*** 2.遍历集合,把每个project的path中的 / 转换成 \\* @param {*} projectArray xml文件中的project集合* @returns path路径转换后的集合*/
const getProjectArray = (projectArray) => {const result = []projectArray.forEach(item => {// console.log(item)//item.$ 代表的对象就是我们需要的,对象有个属性path// console.log(item.$)if (!!item.$) {//把path中的 / 转换成 \\item.$.path = item.$.path.replace(/\//g, '\\')result.push(item.$)}});return result
}/*** 3.下载源码* 这个方法就是执行git clone* 执行完一次git clone 才执行下一个源码的git clone。源码是一个一个下的。 * @param {*} project 当前要下载的project*/
const checkOutSrc = (project) => {const projectPath = `${ANDROID_SRC_PATH}${project.path}`const gitPath = `${TSINGHUA_GIT_PATH}${project.name}.git`console.log(`Git路径:${gitPath}`)console.log(`源码下载路径:${projectPath}`)if (!fs.existsSync(projectPath)) {mkdirp.sync(projectPath)}//这里执行的命令就是 git clone xxx xxxlet control = spawn(GIT_PATH, [`clone`, gitPath, projectPath])control.stdout.on('data', (data) => {console.log(`${data}`)})control.stderr.on('data', (data) => {console.log(`${data}`)})control.on('close', (code) => {console.log(`执行完成:${code}`)//判断还有没有需要下载的project,如果有继续下载projectIndexByCheckOut++if(projectIndexByCheckOut>=projects.length){return}checkOutSrc(projects[projectIndexByCheckOut])})
}/*** 1.解析xml文件,解析成功后,进行下载*/
const transXml = () => {//读取文件,data就是文件内容fs.readFile(MANIFEST_PATH, (err, data) => {if (err !== null) {//解析清单文件发生了异常return}//把data传给parser进行解析//通过这个方法就会把xml文件转换成js的对象//得到对象之后我们就从这个对象获取各project的pathparser.parseStringPromise(data).then(result => {if (!result) {//解析的对象为空return}// console.log(result)//如果要看解析后的js对象结构就把这个注释放开// const projectArray = result.manifest.project// console.log(projectArray)projects = getProjectArray(result.manifest.project)//集合长度大于0 就开始下载if(projects.length>0){projectIndexByCheckOut = 0checkOutSrc(projects[projectIndexByCheckOut])}})})
}transXml()
//安卓源码下载路径,所有的模块都下载到这个文件夹下
const ANDROID_SRC_PATH = 'E:\\Source2023\\OS\\AndroidOS\\Android10\\'//清单文件的路径
const MANIFEST_PATH = 'E:\\Source2023\\OS\\AndroidOS\\manifest\\default.xml'

这两个路径是自定义的,主要取决于你想把代码下载到哪个文件夹,修改这两个就可以。

然后经过漫的等待就可以了。

在这里插入图片描述

代码地址:https://gitee.com/i-only-like-meat/adas.git


http://chatgpt.dhexx.cn/article/5bpYDOHe.shtml

相关文章

下载安卓源码

安卓内核源码下载教程 准备环境如何选择你想要下载的版本ubuntu环境配置 准备环境 Ubuntu 18.04 安装 最好是用这个版本或者高于这个版本的,低版本的有一些环境问题可能会让你很难受我使用的是VMware Workstation 16 ProPixel 3 XL、Pixel 3、Pixel 2 XL、Pixel 2、Pixel XL、…

Android13源码下载及全编译流程

一、源码下载 1.1、配置要求 官方推荐配置请参考:https://source.android.google.cn/docs/setup/start/requirements?hlzh-cn,重点有如下几项: 1.1.1、硬件配置要求 1、内存至少 16GB,实测建议至少 32G。 2、磁盘至少 250GB&am…

Java 工厂设计模式

简介 工厂设计模式在java中有大量的应用,如spring框架,这种类型的设计模式属于创建型模式。在工厂设计模式中,创建逻辑不会对客户端暴露,可以通过一个对外接口创建所需对象。 工厂模式使用场景 需要频繁创建对象且这些对象多处…

简单工厂设计模式

简单工厂设计模式 刚开始学设计模式,犹如刚睁开眼看世界的孩子,满眼都是惊奇,原来代码的世界可以如此的精彩纷呈.当然这些都是前辈智慧的结晶.简单工厂设计模式是接触的第一个设计模式,看完后更多的是不懂和迷糊.不过相信慢慢会懂得其精髓的. 简单工厂设计模式是创建型(就是把对…

Java工厂设计模式详解

前言 工厂设计模式在开发过程中有大量的运用,不管是spring框架,还是诸多的中间件,都有着工厂设计模式的体现 比如,手机生产工厂,当提供了相关生产手机的原材料,工厂就可以按要求生产出手机 工厂模式介绍 …

Android工厂设计模式(简单工厂,工厂方法,抽象工厂,BitmapFactory简单工厂分析,Retrofit抽象工厂分析)

文章目录 创建型设计模式(简单工厂,工厂方法,抽象工厂)一.简单工厂模式引出简单工厂模式 二.工厂方法模式三.抽象工厂模式 Android源码中用到的工厂模式举例一.BitmapFactory 源码工厂模式详解(简单工厂)二.Retrofit的工厂模式(抽象工厂) 创建型设计模式…

工厂设计模式有什么用?

工厂方法是非常古老且常用的设计模式。原因主要是一个系统要运转起来一定会涉及到对象的实例化过程,如果对象的实例化分散在各种逻辑代码之间,那么就会非常零乱、难以维护,bug自然也多。 工厂方法的出现解决的就是对象创建的问题&#xff0c…

Java中的工厂设计模式

引出工厂模式 package www.java.test;interface Computer{void printComputer(); } class MacbookPro implements Computer{Overridepublic void printComputer() {System.out.println("This is a MacbookPro");} } class SurfaceBook implements Computer{Override…

Java工厂设计模式

工厂设计模式 一、面向对象的设计原则1.1 OCP(开闭原则,Open-Closed Principle)1.2 DIP(依赖倒转原则,Dependence Inversion Principle)1.3 LOD(迪米特法则,Law Of Demeter&#xff…

设计模式—工厂设计模式

工厂设计模式 1.概述2.简单工厂模式2.1 结构2.2 实现2.3 优缺点2.4 扩展 3.工厂方法模式3.1 概述3.2 结构3.3 实现3.4 优缺点 4.抽象工厂模式4.1 概述4.2 结构4.3 实现4.4 优缺点4.5 应用场景 5.扩展模式5.1 第一步:定义配置文件5.2 改写工厂类 6.JDK源码解析—Coll…

工厂设计模式 - 详解

介绍 工厂模式是Java中最常用的设计模式之一,这种类型的设计模式数据创建型模式。 主要就是负责创建对象的,当我们使用new创建对象的时候会导致对该对象的耦合性很严重,当我们需要修改的时候需要对所有new的对象进行修改,违反了软…

【iOS】—— 工厂设计模式

工厂设计模式 文章目录 工厂设计模式设计模式概念设计模式七大准则开闭原则单⼀职责原则里氏替换原则依赖倒转原则接口隔离原则迪米特法则合成复用原则 类族模式简单工厂模式优点缺点主要作用示例文件分类实现效果: 工厂方法模式优点缺点主要作用:示例&a…

【设计模式】工厂模式(Factory Pattern)

1. 概述 工厂模式(Factory Pattern)是最常用的设计模式之一,它属于创建类型的设计模式。它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接…

设计模式之工厂模式,史上最强,不服来辩!

设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,如果设计模式没学会,抽象能力肯定就不会太强。常见的设计模式有 23 种,今天我们只聊最简单的工厂模式。 工厂模式是属于创建型模式的,通过工厂获取一个一个的新对象。…

工厂设计模式

1、概念 工厂模式分三种:简单工厂模式、工厂方法模式、抽象工厂模式 简单工厂模式(Simple Factory Pattern):属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例&#xf…

设计模式之工厂模式(factory pattern)

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和…

sqlserver2008的SSMS连接sqlserver2016的时候提示‘索引超出了数组界限。’

解决:打sp3补丁。 http://www.microsoft.com/en-us/download/details.aspx?id44271

Matlab报错 :“位置 x 处的索引超出数组边界”

经常遇到“位置 x 索引超出数组边界”的报错,今天突然想到一个以前一直没有太留意的奇葩问题:这个报错里“位置x”指的是哪里?为什么一会是“位置3”,一会是“位置1”,有什么神秘的规矩吗? 善用搜索没发现…

.net reflector 反编译失败 索引超出了数组界限问题处理方法

.net reflector 反编译失败 索引超出了数组界限问题处理方法 时间:9个月前 作者:庞顺龙 浏览:177 [站内原创,转载请注明出处] 标签: Reflector .net reflector 反编译失败 索引超出了数组界限问题处理方法 de…

matlab索引超出数组边界且不提示数组边界的一种处理办法

问题如下。 相关代码如下: 问题原因如下: 将excel表另存为txt时选择的保存类型是Unicode文本(*.txt)。 处理办法。 将Unicode文本(*.txt)换成文本文件(制表符分隔)(*.txt)。 问题的表现如下: 利用matlab工作区发现…