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://www.mzph.cn/news/675453.shtml

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

相关文章

Python:批量url链接保存为PDF

我的数据是先把url链接获取到存入excel中,后续对excel做的处理,各位也可以直接在程序中做处理,下面就是针对excel中的链接做批量处理 excel内容格式如下(涉及具体数据做了隐藏) 标题文件链接文件日期网页标题1http://…

学习笔记——ENM模拟

学习笔记——ENM模拟 文章目录 前言一、文献一1. 材料与方法1.1. 大致概念1.2. 生态模型的构建1.2.1. 数据来源:1.2.2. 数据处理:1.2.3. 模型参数优化: 1.3. 适生情况预测1.3.1. 预测模型构建1.3.2. 适生区划分 1.4. 模型的评估与验证 2. 结果…

【Web】Spring rce CVE-2022-22965漏洞复现学习笔记

目录 原理概览 漏洞简述 Tomcat AccessLogValve 和 access_log 例题: 原理概览 spring框架在传参的时候会与对应实体类自动参数绑定,通过“.”还可以访问对应实体类的引用类型变量。使用getClass方法,通过反射机制最终获取tomcat的日志配置成员属性…

LeetCode第1688题 - 比赛中的配对次数

题目 解答 方案一&#xff1a;暴力求解的方案 class Solution {public int numberOfMatches(int n) {if (n < 2) {return 0;}int total 0;int count 0;while (count ! 1 || n ! 1) {if ((n & 1) 0) {count n / 2;n count;} else {count (n - 1) / 2;n count …

内网渗透靶场02----Weblogic反序列化+域渗透

网络拓扑&#xff1a; 攻击机&#xff1a; Kali: 192.168.111.129 Win10: 192.168.111.128 靶场基本配置&#xff1a;web服务器双网卡机器&#xff1a; 192.168.111.80&#xff08;模拟外网&#xff09;10.10.10.80&#xff08;模拟内网&#xff09;域成员机器 WIN7PC192.168.…

todolist的五种写法(原生、vue2、vue3、react类组件,react函数组件)

1. js、vue2、vue3、react类组件、react函数组件的特性 1.1 JavaScript&#xff08;JS&#xff09;特性 弱类型&#xff1a;JavaScript是一种弱类型语言&#xff0c;变量的类型可以在运行时动态改变。基于原型的面向对象&#xff1a;JavaScript使用原型链来实现面向对象编程。…

第59讲订单数据下拉实现

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;/*** 订单查询 type值 0 全部订单 1待付款 2 待收货 3 退款/退货* param type* return*/RequestMapping("/list")public R list(Integer type,Integer page,Integer pageSize){System.out.pri…

【C#】Xasset加载资源模块

分享一下之前接Xasset的模块Code【仅用于业务参考】 using System; using System.Collections.Generic; using System.IO; using Common; using Cysharp.Threading.Tasks; using UnityEngine; using xasset; using xasset.example; using Logger xasset.Logger; using Object…

Vue-57、Vue技术路由的参数如何传递

query参数传递 1、传递参数 <!-- 跳转路由并携带query参数&#xff0c;to的字符串写法--> <router-link :to"/home/message/detail?id${p.id}&title${p.title}"> {{p.title}} </router-link><!-- 跳转路由…

ElasticSearch 8.x 使用 High Level Client 以 HTTPS 方式链接,SSL 证书、主机名验证器 各是什么,如何忽略

ElasticSearch 1、ElasticSearch学习随笔之基础介绍 2、ElasticSearch学习随笔之简单操作 3、ElasticSearch学习随笔之java api 操作 4、ElasticSearch学习随笔之SpringBoot Starter 操作 5、ElasticSearch学习随笔之嵌套操作 6、ElasticSearch学习随笔之分词算法 7、ElasticS…

人工智能之线性优化和非线性优化

如果目标函数或者约束函数中存在非线性函数,此类问题称为非线性优化。 线性优化 在一组线性的等式或不等式约束下,求一个线性函数的最小值,此类问题的数学模型如下: m i n c x s . t . { A x ≤ b x ≥ 0 min\quad cx \\ \\ s.t. \begin{cases} Ax\leq b \\ \\ x\geq0 \…

基金是什么

一、基金是什么&#xff1f; 买基金就是委托别人帮我们投资&#xff0c;替我们买卖股票债券。 二、为什么委托别人&#xff1f; 因为我们不懂投资方面的知识&#xff0c;或者我们没有时间来做投资&#xff0c;那么就可以找专业人士帮我们投资。就像家长帮小孩报辅导班&#…

[幻灯片]分析设计高阶-02-领域建模结构部分Part1

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 如何选择UMLChina服务 UMLChina公众号精选&#xff08;20240207更新&#xff09;

四、机器学习基础概念介绍

四、机器学习基础概念介绍 1_机器学习基础概念机器学习分类1.1 有监督学习1.2 无监督学习 2_有监督机器学习—常见评估方法数据集的划分2.1 留出法2.2 校验验证法&#xff08;重点方法&#xff09;简单交叉验证K折交叉验证&#xff08;单独流出测试集&#xff09;&#xff08;常…

大数据思考:面对海量数据时,选择哪种模式才是更适合自己的?

如果您从事科技行业或者您不在这个行业&#xff0c;也许您已经听说过很多关于 AI 的信息。 我所说的不仅仅是多年来我们都喜欢的科幻小说中“天网正在接管地球”式的人工智能&#xff0c;而是人工智能和机器学习已经逐渐成为我们日常生活中的实际应用 . 大数据是人工智能与机器…

PCIE 参考时钟架构

一、PCIe架构组件 首先先看下PCIE架构组件&#xff0c;下图中主要包括&#xff1a; ROOT COMPLEX (RC) (CPU); PCIE PCI/PCI-X Bridge; PCIE SWITCH; PCIE ENDPOINT (EP) (pcie设备); BUFFER; 各个器件的时钟来源都是由100MHz经过Buffer后提供。一个PCIE树上最多可以有256…

Android Studio中打开文件管理器

文章目录 一、前言二、操作步骤 一、前言 在Android Studio中有时候需要查看手机的文件目录或者复制文件&#xff0c;但是有时候文件管理器找不到在哪&#xff0c;这里记录该操作流程 二、操作步骤 第一步: 第二步: 第三步:

云游戏发行需要哪些条件

云游戏是一种创新性的游戏服务模式&#xff0c;将游戏运算和渲染等处理任务移至云端服务器&#xff0c;通过互联网实时传输画面和操作指令&#xff0c;使玩家能够在低端终端设备上也能流畅玩游戏。要做云游戏发行&#xff0c;需要考虑一系列条件&#xff0c;包括技术、基础设施…

Qt未来市场洞察

跨平台开发&#xff1a;Qt作为一种跨平台的开发框架&#xff0c;具有良好的适应性和灵活性&#xff0c;未来将继续受到广泛应用。随着多设备和多平台应用的增加&#xff0c;Qt的前景在跨平台开发领域将更加广阔。 物联网应用&#xff1a;由于Qt对嵌入式系统和物联网应用的良好支…

Ubuntu 18.04上安装cuDNN 8.9.6.50:一站式指南

Content 一、前言二、准备工作三、安装步骤1. 启用本地仓库2. 导入CUDA GPG密钥3. 更新仓库元数据4. 安装运行时库5. 安装开发者库6. 安装代码示例7. 另外一种安装办法 四、验证安装1. 验证cuDNN版本2. 测试示例代码 五、总结 一、前言 在深度学习领域&#xff0c;高效的计算资…