Android AOSP源码研究之万事开头难----经验教训记录

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.配置环境变量

python 复制代码
kdir ~/bin
echo "PATH=~/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc

2.安装curl

python 复制代码
sudo apt-get install curl

3.下载repo并授权

因为android的源码特别大,所以是使用repo工具管理,不理解repo工具的可以去android官网或者百度了解,这里不做讲解。

python 复制代码
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源码地址即可,在我们新建的存放源码的目录下打开命令行执行下面的命令

python 复制代码
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

6.初始化仓库

python 复制代码
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

7.指定我们需要下载的源码分支并初始化

python 复制代码
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-9.0.0_r46

上面命令中的android-9.0.0_r46 就是第4步中获取到的分支名 运行上面的命令成功后如下 最后执行命令:

python 复制代码
repo sync

开始同步代码,同步可能需要很长的时间而且中间还可能会出错,出错的原因大多数都是网络,一直同步代码就行了,具体的坑,请看下面的内容,下载成功后的结果如下所示:

2.1 使用移动硬盘存放Android源码的坑

我开始下载源码选择移动硬盘是想着可以将源码携带着随时都能看,而且还解放了我的主机的存储空间,想法非常的丰满,但是现实很骨感,当然归根结底也是因为我穷,如果一开始我直接就将电脑的所有配置拉满,应该不会这么坎坷。我使用移动硬盘,将其格式化成NTFS格式,然后去下载源码,下载的过程很长,刚开始的时候,下载老是报错,因为一下载源码,就会在本地被莫名奇妙的修改文件,导致老是和线上的代码冲突报错,最后我发现了一招可以解决这个报错,就是把所有本地的修改强制回退一个版本,然后再拉,就成功了。命令如下所示:

python 复制代码
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源码编译

源码下载完后就是编译,编译网上会有一堆教程,这里就给大家简单介绍下注意点,网上的有些教程会让你扩大交换空间就是执行

python 复制代码
sudo fallocate -l 1G /swapfile

这个命令切记不要随便用,如果你的系统空间本来就紧张的话使用这个命令会导致你系统重启的时候一直卡在启动页,连恢复模式都进不了 编译源码需要安装依赖,百度网上一堆,这里随便列一个吧

python 复制代码
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

python 复制代码
sudo apt-get install openjdk-8-jdk

编译源码还需要对应的Python环境,这里我们配置好可切换的python后切换即可,例如如果是android10,使用python2,我的办法就是先编译源码,如果python脚本报错,我就切换另外一个python环境。 编译代码之前还需要我们去下载对应的驱动二进制文件android 对应驱动二进制文件,下载完后会得到两个可执行的bash脚本,然后我们将其复制到源码目录,执行生成vendor目录。 如上图所示,就是图中选中的两个文件。执行完后我们准备编译源码

编译的命令如下:

python 复制代码
//1.设置环境变量
source  build/envsetup.sh
//2.使用lunch命令选择对应的源码配置
lunch
// 3.开始编译
make -j8 // 可以是-j4 或不带参数

然后接下来就是漫长的等待编译完成。

如果想要清理上次的编译产物我们可以执行命令

python 复制代码
make clobber

然后删除生成的out目录就可以了

4.Android源烧录

编译完源码后就是烧录进手机了,我们要想往手机中烧录代码必须要求手机可以进行oem解锁,解锁完后使用命令进入bootloader模式

python 复制代码
adb reboot bootloader

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

相关推荐
叽哥2 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走2 小时前
创建自定义语音录制View
android·前端
用户2018792831672 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831672 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker4 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong4 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil5 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin
程序员码歌12 小时前
【零代码AI编程实战】AI灯塔导航-总结篇
android·前端·后端
书弋江山13 小时前
flutter 跨平台编码库 protobuf 工具使用
android·flutter
来来走走15 小时前
Flutter开发 webview_flutter的基本使用
android·flutter