Android 13 源码下载与编译

Posted 小周佩奇i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 13 源码下载与编译相关的知识,希望对你有一定的参考价值。

android 13 源码下载与编译

最近在研究Android源码定制相关的内容,刚好在B站上看高乐高大佬的课程,就跟着学习,也顺便整理一下资料写点博客,毕竟目前互联网上关于这方面的内容确实比较少,同时也感谢高乐高大佬的免费课程,干货满满。

接下来我们进入正题:

本文在Ubuntu 22.04 下进行,由于Google推荐使用Ubuntu进行Android系统编译与开发,因此默认阅读本文的同学电脑中已经安装了了Ubuntu系统,并拥有一定的Linux基础。

同时,本文所使用的的Ubuntu已经配置了清华的Ubuntu软件源,若一些软件下载比较慢的同学可以参考如下地址进行配置:

ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

一些可有可无的话

由于众所周知的原因,我们很难从Google的官方代码库中下载aosp,因此本文使用中科大的镜像,北方的同学可以使用清华的

建议编译以及开发aosp时在一个专用的文件夹里面进行,我是在用户根目录下创建了一个Android目录,但是这个目录在安装Android Studio的时候SDK也是下载在该目录的,路径如下:~/Android/Sdk,而aosp的目录是~/Android/aosp其实并不冲突,但是介意的同学可以另建一个目录进行

cd ~            # 进入到用户根目录
mkdir Android   # 创建Android 文件夹
cd Android      # 进入刚创建的文件夹

一、下载aosp

下载之前我们需要保证Ubuntu中安装了wget,没有下载的同学可以使用如下命令安装:

# sudo apt update # 没有进行软件源更新的可以调用
sudo apt install wget -y

接下来我们使用中科大的镜像下载aosp

# 这里我们添加 -c 参数表示断点续传
wget -c https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar

执行完该命令之后根据你的网速可能需要等待40分钟或更久(主要看你的网络情况,这个文件有70G,如果你的网速比较快的话可能下得比较快,反之越慢)

当下载完了之后我们对文件做一下md5码校验,以防没有下载完全或文件损坏等

md5sum aosp-latest.tar

我们拿运行的结果来跟https://mirrors.ustc.edu.cn/aosp-monthly/aosp-latest.tar.md5的内容做比对,若md5一致则表示文件没有问题,就可以进行下一步操作了

当文件下载无误之后我们就可以把aosp-latest.tar文件解压了

tar xvf aosp-latest.tar

由于这个文件比较大,因此可能需要等待20~30分钟,当然这跟你的硬盘性能有关。当文件解压完成之后我们就可以在该目录下看到有一个aosp文件夹了,如果我们这个时候进去会发现这个文件夹只有一个.repo文件夹,并没有任何代码,这是因为我们下载的仅仅是一个相当于一些配置文件的东西,我们还要进行代码同步,.repo文件夹的作用就与Git项目的.get文件夹类似

在等待的时候可以再开一个终端来参照下面的教程安装与配置一些需要的环境

二、同步Android 源码

在拉取Android源代码之前我们需要确认机器中安装了需要的环境

2.1 安装Git

首先我们安装与配置git,已经安装并配置好的同学可以跳过这步

sudo apt install git -y

当安装好了之后我们再调用如下命令配置Git

git config --global user.email xxx@qq.com
git config --global user.name "xxxxx"

2.2 安装 repo

接下来我们安装repo

mkdir ~/.repo        # 在用户根目录创建一个.repo的文件夹,用于下载repo
# 下载repo 到用户根目录下的.repo文件夹
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.repo/repo

# 给repo文件授予权限
chmod a+x ~/.repo/repo

# 将.repo 目录添加到环境变量中
echo "PATH=~/.repo:\\$PATH" >> ~/.bashrc
# 使.bashrc 生效
source ~/.bashrc 

安装了repo之后我们还要给repo配置国内源,否则进行代码同步的时候可能会出现异常

export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'

2.3 安装Python

由于repo是由一系列python脚本组成,因此我们还需要安装python环境,repo其实用的是python2 但是为了避免出现一些状况我们就把python3 也安装了

#Ubuntu中默认安装了python3,可以调用一下python3命令,如果有了的话可以跳过这步
sudo apt install python3 -y

sudo apt install python2 -y

如果安装好了之后我们调用一下  python2命令可以发现已经开启了python2终端,但是我们调用python命令的话还是提示没有找到该命令,因此我们需要添加一个软链接

sudo ln -s /usr/bin/python2 /usr/bin/python

注意如果执行python命令的时候提示的python版本是python3 也要执行一下这个命令才可以,但是在执行之前需要先执行如下命令删除掉之前设置的软链接

sudo rm -rf /usr/bin/python

如果这里成功了我们就可以运行python命令了

2.4 安装JDK

网上的一些教程是要我们安装openjdk 8 但是我在编译的时候提示了jvm版本过低的错,因此我们直接安装openjdk11 即可

sudo apt update                        # 更新Ubuntu软件源
sudo apt install openjdk-11-jdk -y     # 安装openjdk 11

2.5 安装编译依赖项

安装好了上面的软件那之后我们要再安装一些软件包来支持源码编译

sudo apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig libncurses5

2.6 同步Android 源码

当我们配置好了所需的环境之后我们就可以同步Android源代码了,这里我同步的是android-13.0.0_r24

cd aosp        # 进入源码目录

指定源码版本,建议指定前先查看aosp镜像有没有该版本

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24

如果我们看到repo has been initialized in /home/zhen/Android/aosp这个提示表示已经初始化完成,此时就可以进行下一步了

同步Android 源码

repo sync

由于Android源码比较庞大,所以这个步骤需要等待20分钟左右

三、源码编译

3.1 初始化编译环境

当Android源码同步完了之后,我们就可以开始编译Android源码了

首先我们要初始化编译环境

source build/envsetup.sh

执行这个命令没有任何报错即可进行下一步,值得注意的是,这个命令在每次我们重新打开一个终端进行编译等操作的时候都要执行一遍

3.2 清除编译内容

第一次编译的时候我们需要将之前编译的内容清除掉(按理说这步不用也可以,但是为了防止后面出现什么乱七八糟的问题所以就执行一下)

make clean

3.3 选择编译版本

接下来我们要先选择一个要编译的版本之后就可以进行编译了

这个部分我们可以执行lunch命令之后再选择你想要编译的版本

You're building on Linux

Lunch menu .. Here are the common combinations:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_barbet-userdebug
     4. aosp_bluejay-userdebug
     5. aosp_bluejay_car-userdebug
     6. aosp_bramble-userdebug
     7. aosp_bramble_car-userdebug
     8. aosp_car_arm-userdebug
     9. aosp_car_arm64-userdebug
     10. aosp_car_x86-userdebug
     ...
     65. rb5-userdebug
     66. sdk_car_arm-userdebug
     67. sdk_car_arm64-userdebug
     68. sdk_car_portrait_x86_64-userdebug
     69. sdk_car_x86-userdebug
     70. sdk_car_x86_64-userdebug
     71. sdk_pc_x86_64-userdebug
     72. silvermont-eng
     73. uml-userdebug
     74. yukawa-userdebug
     75. yukawa_sei510-userdebug

Which would you like? [aosp_arm-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): 

也可以在lunch命令后添加参数,添加参数有两种方式,我使用的是第二种方式

  1. 使用序号编译
lunch 1     # 与 lunch aosp_arm-eng 等价
  1. 使用版本名称编译使用序号编译
lunch sdk_phone_x86_64-userdebug

phone -> 编译的是手机的固件

x86_64 -> 编译的是x86架构 64位的系统

userdebug -> 这个是指编译的固件类型,可选参数有user、userdebug、eng,其中user是最终打包给用户的版本,用过MIUI的朋友可以把MIUI的正式版看做是这个版本;userdebug是给开发人员的版本,可以root但默认不带root,这个版本对应的就是MIUI的开发板、内测版本;eng是给工程师用的版本,开放所有权限,这个版本一般是工程师在做开发的时候使用的。

需要注意的是,从Android12 开始,如果需要编译虚拟机固件需要编译带sdk前缀的版本

3.4 开始编译

选择完了编译版本之后我们就可以开始进行编译了

make -j8

这个j6代表使用6的线程进行编译,这个参数看你的CPU参数与内存,即最大线程数不能超过CPU支持的最大线程数,但是如果你的内存比较小就得选择较小的线程数,我们可以在编译报了137错误的时候适当选择小一点的线程数或者增加交换空间大小,但是建议交换空间大小不超过内存的一半,比如你的内存是16G的就可以设置为8G,如果你的内存是32G的就可以设置为16G

交换空间的设置方法可以参考这篇博客:ubuntu调整交换空间 - 简书

编译这个部分的时间是最久的,可能得等上4个小时以上,当然如果你的CPU性能比较好时间就会少一点

3.5 验证是否编译成功

当我们编译完了之后就可以执行如下命令来启动虚拟机,以验证是否编译成功

emulator

四、错误解决

4.1 A new version of repo (XXX) is available.

这个错误表示repo有更新的版本,因此我们要将~/.repo目录下的repo文件替换为.repo/repo 下的repo文件

# 在aosp目录下执行
cp .repo/repo/repo ~/.repo/repo

然后再执行刚刚报这个错误的命令就看可以了

4.2 编译到一半终端闪退了

我有一台旧主机,i5-6500 - 16G内存的,我在上面编译就会出现这个问题,然后换到新主机上就没事,暂时不知道是内存小还是什么原因

参考资料

这里只是部分参考的文献,有一些文章因为我当时急于解决问题所有忘了记录了,后面就找不到了,因此就不贴出来了

高乐高521的个人空间-Android13 逆向 ROM定制ART定制入门系列-哔哩哔哩视频

jdk版本对应的java版本数字-青岛软件培训-Java培训-Python培训学校-万码学堂

Android系统源码查看 - 简书

AOSP 镜像使用帮助 — USTC Mirror Help 文档

AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

ubuntu调整交换空间 - 简书

Android系统源码下载与编译刷机--Nexus6实测

前言

此博文记录一下Android从系统源码下载到刷机的全过程。

(https://source.android.com/source/build-numbers.html 页面中列表信息找到自己设备对应的Android版本进行选择,博文中选择MOB301)

硬件:Google 亲儿子 Nexus6("shamu")
Android系统:选择了Android官网上的MOB301对应的android-6.0.1_r42
驱动:自然就是MOB301_Nexus6对应的驱动了
编译系统:Ubuntu14.0.4

PS: 小小啰嗦一下~
我们知道仅仅看代码,提高是比较有限的,而且理解起来也比较肤浅,往往过目就忘. 而自己写过的代码,往往会印象比较深刻,在写的时候也会比较容易理解流程. 所以我们在看代码的同时, 如果能修改代码, 在手机上跑起来并看到修改的效果,这无疑会加快看代码的效率和积极性. 所以这篇文章,就讲解一下如何自己编译Android M的源码,并且在Nexus 6上跑起来. 至于为何需要自己编译固件,而不是直接安装Google给出的工厂固件?原因是Google给出的工厂固件是User版本,是没法随心所欲Push东西进去的. 所以我们需要编译自己的Userdebug版本.
另外你需要知道AOSP,AOSP即Android Open Source Project 汉语意思是:谷歌开放源代码项目.我们通过Google官方下载的源代码,就是AOSP的代码, 其中是不包含Google开发的那些个应用的,各个厂商拿到的也是这个版本,在这个版本的基础上进行修改. 而Google发布的工厂固件则是包含全套Google服务的. 厂商如果想安装Google服务,就需要过Google的那一套认证,比较麻烦,而且价格不菲,鉴于Google在国内的尴尬地位,国内很多厂商都没有过这个认证.
因此有人会说刷出来的ROM和Google发布的user版本的ROM看起来界面不一致的原因就在于此。


正文

一开始请先清楚几个点:
1.手上的手机型号是什么?
2.Android官网上是否有支持该手机的系统源代码和驱动程序?

本文以Nexus 6为例,后面的内容不再重复。


Ubuntu编译环境配置

本文以Android系统编译为主,因此不写关于VirtualBox装Ubuntu14.04的相关内容(网上搜索下,一堆的资料)

装完了Ubuntu系统后,咱们在命令窗口下执行:

1.执行如下命令,下载编译相关的组件:

sudo apt-get install flex bison gperf build-essential curl zlib1g-dev g+±multilib g+±4.4-multilib libc6-dev-i386 lib32ncurses5-dev lib32z1 lib32ncurses5 lib32bz2-1.0 x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z1-dev mingw32 libxml2-utils gnupg zip xsltproc python-markdown wine tofrodos

2.java环境配置(1.7)
将Ubuntu切换到163的源下,下载安装openjdk-7相关的jre和jdk
sudo apt-get install 对应的openjdk组件名


Android系统源代码下载和驱动sh脚本下载

1.Android系统源代码下载(接下来这些操作最好都是基于翻墙的情况下进行)

这部分内容也可以参照Andorid官方网站的介绍说明(http://source.android.com/source/downloading.html)

(1).安装命令行方式下工作的文件传输工具curl.

sudo apt-get install curl

(2).开源的分布式版本控制系统git(Android项目使用git管理).

sudo apt-get install git

(3).安装Repo命令行工具(Repo是Google开发的基于git更好管理Android项目的工具)

mkdir ~/bin
PATH=~/bin:$PATH
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

(4).初始化Repo客户端

mkdir Android
cd Android
repo init -u https://android.googlesource.com/platform/manifest -b 你所要选择的android系统对应的Branch (MOB301对应android-6.0.1_r42)
则为:repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r42

Branch的列表在:http://source.android.com/source/build-numbers.html#source-code-tags-and-builds 网站中可以看到相关列表信息
这里写图片描述

(5).下载Android源代码

repo sync

执行完后进入漫长的等待,系统大概有20多个G要下载,所以可以晚上的时候放着下载(记得一定要处于翻墙可访问外网状态哟~)

完成后,如图所示就可以了
这里写图片描述

(PS:这个时候Android目录下是有个文件夹的.repo,这个文件夹大概占用了30G的空间,假设你后面不需要再更新系统,那么这个文件夹可以删除掉了)

这里写图片描述


在设备驱动页中找到相应的驱动程序sh脚本,并下载
Nexus对应驱动页:https://developers.google.com/android/nexus/drivers

这里写图片描述

将这三个压缩包下载后,解压缩得到三个sh文件。
将这三个sh文件copy到Android编译目录下。

这里写图片描述

执行这3个sh文件,会下载相关驱动文件到 vendor 目录

./extract-broadcom-shamu.sh
./extract-moto-shamu.sh
./extract-qcom-shamu.sh

过程中会让我们看一些声明信息,看完后输入I ACCEPT即可:
这里写图片描述


编译Android系统

(1).环境初始化

source build/envsetup.sh

执行完后,会将一些文件include进来:

panghu@panghu:~/Android$ source ./build/envsetup.sh 
including device/asus/deb/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash

(2)lunch选择要build的类型

lunch

执行该命令后,会列出当前可供选择的build type,对应选择自己需要的即可

panghu@panghu:~/Android$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_mips-eng
     4. aosp_mips64-eng
     5. aosp_x86-eng
     6. aosp_x86_64-eng
     7. aosp_deb-userdebug
     8. aosp_flo-userdebug
     9. full_fugu-userdebug
     10. aosp_fugu-userdebug
     11. mini_emulator_arm64-userdebug
     12. m_e_arm-userdebug
     13. mini_emulator_mips-userdebug
     14. mini_emulator_x86_64-userdebug
     15. mini_emulator_x86-userdebug
     16. aosp_flounder-userdebug
     17. aosp_angler-userdebug
     18. aosp_bullhead-userdebug
     19. aosp_hammerhead-userdebug
     20. aosp_hammerhead_fp-userdebug
     21. aosp_shamu-userdebug

Which would you like? [aosp_arm-eng] 21          

这里写图片描述

机型对照表
这里写图片描述

(3)开始编译

make -j8

等待编译结束…灰常灰常漫长.机器比较好的大概1-2小时,机器不好的,那个酸爽…!!!

编译结束后提示如下即可:
####make completed successfully ####


刷机

Nexus6关机状态下,长按音量下+电源,进入recovery模式

然后在源码根目录下(Android根目录下)执行下面命令:

fastboot -w flashall

如果这时候提示:< waiting for device > 的话,证明你的虚拟机VirtualBox没有识别到你的手机,可以在VirtualBox上菜单中 “设备” -> “分配USB设备” -> 选中你的手机对应的设备名就可以了。

panghu@panghu:~/Android$ fastboot -w flashall
< waiting for device >

target reported max download size of 536870912 bytes
Creating filesystem with parameters:
    Size: 28474998784
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8160
    Inode size: 256
    Journal blocks: 32768
    Label: 
    Blocks: 6951904
    Block groups: 213
    Reserved block group size: 1024
Created filesystem with 11/1738080 inodes and 153124/6951904 blocks
Creating filesystem with parameters:
    Size: 268435456
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 1024
    Label: 
    Blocks: 65536
    Block groups: 2
    Reserved block group size: 15
Created filesystem with 11/16384 inodes and 2089/65536 blocks
--------------------------------------------
Bootloader Version...: moto-apq8084-71.18
Baseband Version.....: D4.01-9625-05.34+FSG-9625-02.111
Serial Number........: ZY222WQN82
--------------------------------------------
checking product...
OKAY [  0.004s]
sending 'boot' (8201 KB)...
OKAY [  1.291s]
writing 'boot'...
OKAY [  0.153s]
sending 'recovery' (8917 KB)...
OKAY [  1.403s]
writing 'recovery'...
OKAY [  0.126s]
sending sparse 'system' (516549 KB)...
OKAY [ 84.029s]
writing 'system'...
OKAY [  7.818s]
sending sparse 'system' (137398 KB)...
OKAY [ 23.156s]
writing 'system'...
OKAY [  2.137s]
erasing 'userdata'...
OKAY [  2.898s]
sending 'userdata' (139061 KB)...
OKAY [ 21.777s]
writing 'userdata'...
OKAY [  2.672s]
erasing 'cache'...
OKAY [  0.045s]
sending 'cache' (6248 KB)...
OKAY [  0.983s]
writing 'cache'...
OKAY [  0.107s]
rebooting...

finished. total time: 149.323s

或者也可以一个个img刷入:

0、重启进入刷机模式
adb reboot bootloader

1、依次刷入其他镜像文件:
fastboot flash recovery recovery.img
fastboot flash boot boot.img
fastboot flash system system.img

2、强烈建议双清(注意备份数据):
fastboot flash cache cache.img
fastboot flash userdata userdata.img

3、再次重启:
fastboot reboot

结语

OK,到此为止,Android系统下载,编译,刷机都结束了,大家可以开始自己的Android系统定制之旅了。(PS:原生的弄完后,建议可以去试试弄CM的系统,CM做了一些优化,感觉比较不错!)

在这里插入图片描述

以上是关于Android 13 源码下载与编译的主要内容,如果未能解决你的问题,请参考以下文章

Android 系统开发CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

第8章 Android 4.0系统的下载与编译

Linux Mint 安装配置及搭建Android源码编译环境

Android系统源码下载与编译刷机--Nexus6实测

Rockchip Android13 GKI开发指南

Android源码的下载编译与导入到Android Studio