在开始学习 Android 的知识前的准备

在开始学习 Android Framework 的知识前,准备好相关的源码环境是非常有必要的。可以选择直接在 https://cs.android.com/ 网站在线看,但是跳转这些还是不如在 IDE 下来的方便。或者也可以下载好指定版本的源码,并通过 IDE 来查看,但是这样无法编译源码,所以也就无法修改源码后编译查看效果。

所以这篇文章主要是为了后续编译 Android 源码来做准备的,由于编译源码最好是在 Linux 环境下进行(因为 Android 官方就是在 Linux 环境下编译的,为了省事),但是我的设备是 Windows,所以为了在不影响原系统的情况下,可以通过安装虚拟机并在虚拟机中安装 Linux 系统。或者有一种更方便的方式是安装 Docker,在 Docker 下安装别人已经准备好的 Linux 环境,但是后者在这篇文章中就不介绍了。

当前文章所使用的环境和版本信息:

使用设备:Windows 10 64 位 x86 系统
VirtualBox:7.0.2 版本
Ubuntu:22.04.1 LTS 版本

准备工作
下载并安装 VirtualBox 虚拟机软件:https://www.virtualbox.org/wiki/Downloads
下载 Linux 的 Ubuntu 发行版:https://cn.ubuntu.com/download/desktop
VirtualBox 的安装很简单,直接下一步、下一步就可以了。所以后面主要介绍下 Ubuntu 的安装和配置。

安装 Ubuntu
打开 VirtualBox,点击“新建”按钮,并填写虚拟机的名称:

注:此时不需要选择 ISO Image,这样就是手动安装了,手动安装可以选择系统语言。

分配内存和线程数(建议分配最少 4G 内存):

分配磁盘大小(建议最少 200G 起):

点击完成。
接下来会进入系统的安装流程,语言可以选择中文,输入用户名和密码,根据提示直接一步步安装即可。

注意:进入系统的引导安装页面后,屏幕的分辨率很低,可能会导致显示不完整的情况,例如没有显示出下一步的按钮。此时可以用快捷键 Win + 鼠标左键拖动安装页面,将显示不全的页面展示出来。

配置 Ubuntu
修改分辨率:由于默认的分辨率太低,看起来不是很舒服,所以可以进入设置页面调整分辨率到合适的大小。
安装增强工具:从而可以使用共享目录、共享粘贴板和拖放功能。
点击“设备”-> “安装增强工具”,此时文件系统中会出现 VBox_GAs_xxx 目录
进入该目录,并右键选择在当前目录打开终端
在终端中输入:sudo ./VBoxLinuxAdditions.run并回车,即可安装增强工具
开启共享目录:在“设备”-> “共享文件夹”中可以添加要共享的文件夹。注意:只需要勾选“自动挂载”和“固定分配”。当重启系统后,就可以在文件系统中看到 sf_xxx的目录,该目录就是共享的目录。如果点击查看该目录出现权限问题,可以使用 sudo adduser [username] vboxsf命令将当前用户添加到 vboxsf用户组(注意替换为你设置的用户名)。
设置“共享粘贴板”和“拖放”为双向。
配置网络代理:即便我们在 Windows 系统上安装好了 FQ 软件,但是在 Ubuntu 系统中还是无法访问外网的。所以我们需要配置好代理,从而在后续下载 Android 源码时更方便。例如(IP 地址为 Windows 系统上的 IP,端口为 FQ 软件上设置的端口):

注意:在完成配置后,最好重启下系统,从而让配置生效。

准备源码环境
安装 Repo
Android 项目很大,是一个超级项目。所以为了更好的管理代码,Android 官方做了一个叫做 Repo 的工具,用来在 Android 环境中更好的使用 Git 来管理代码。因此我们要获取 Android 源码,首先需要准备好该工具。

在终端中运行以下命令来安装 Repo 工具:

sudo apt-get update
sudo apt-get install repo
1
2
检查是否安装成功:

repo version
1
如果出现和以下类似的输出,则说明安装成功:

airsaid@airsaid-VirtualBox:~$ repo version

repo launcher version 2.17

(from /usr/bin/repo)
1
2
3
4
5
6
7
初始化 Repo
由于众多周知的原因,如果不适用镜像的话会出现网络问题,下载速度也不理想。因此可以选择用清华大学或其他组织提供的镜像地址来解决问题。这里以清华大学的镜像为例:

安装 curl 工具:
sudo apt-get install curl
1
下载 repo 到 bin 目录并设置权限:
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod +x ~/bin/repo
1
2
3
repo 的运行过程中会尝试访问官方的 Git 源更新自己,如果想使用镜像源进行更新,可以将如下内容复制到你的 ~/.bashrc里(使用 sudo nano ~/.bashrc命令进入 nano 编辑器修改):

https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/

export PATH=~/bin:$PATH
export REPO_URL=‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo’
1
2
3
使用 source ~/.bashrc让其立即生效。
下载源码
创建一个目录用来存放源码:
mkdir <dir_name>
cd <dir_name>
1
2
使用真实用户名和邮件地址配置 Git:
git config --global user.name YourName
git config --global user.email you@example.com
1
2
初始化 repo:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
1
如果需要指定版本,可以使用 -b 选项指定分支(该链接中包含所有的分支信息:https://source.android.com/docs/setup/about/build-numbers#source-code-tags-and-builds):

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r47
1
同步源码:
repo sync
1
如果需要加快同步速度,可以传递 -c(当前分支)和 -jthreadcount 标志:

repo sync -c -j4
1
以 Android 10 源码为例,下载完大小大约为 100G 左右。

编译源码
安装所需工具
在编译的过程中需要用到一些工具,所以提前安装好它们避免编译失败:

sudo apt install m4 libncurses5 python-is-python3
1
执行 envsetup 脚本
envsetup.sh脚本用于初始化环境,其中记录着编译过程中所需的各种函数实现,例如 lunch、m、mm、mmm等等。在下载好的源码目录下通过一下命令执行该脚本:

source ./build/envsetup.sh
1
或者也可以使用以下命令:

. ./build/envsetup.sh
1
注意:每次重新打开终端后都需要再次执行该命令。另外,使用 hmm 可查看可用命令的完整列表。

选择编译目标
通过 lunch <product_name>-<build_variant>命令可以选择要构建的目标。其中 product_name指定要构建的产品,build_variant指定要构建的变体。

所有构建目标都采用 BUILD-BUILDTYPE形式,其中 BUILD是指代特定功能组合的代号。 BUILDTYPE是以下之一:

BUILD TYPE 备注
user 编译出的系统有权限限制,适用于生产环境
userdebug 编译出的系统有 root 权限,调试首选
eng 优先考虑开发生产力,带有附加调试工具并关闭了优化
如果不知道该如何选择目标产品,可以只使用 lunch 命令列出可用的产品列表。例如:

airsaid@airsaid-VirtualBox:~/aosp$ lunch

You’re building on Linux

Lunch menu… pick a combo:

  1. aosp_arm-eng
  2. aosp_arm64-eng
  3. aosp_blueline-userdebug
  4. aosp_bonito-userdebug
  5. aosp_car_arm-userdebug
  6. aosp_car_arm64-userdebug
  7. aosp_car_x86-userdebug
  8. aosp_car_x86_64-userdebug
  9. aosp_cf_arm64_phone-userdebug
  10. aosp_cf_x86_64_phone-userdebug

此时可以直接输入对应的序号来选择,后续也可以直接通过产品名来直接选择,例如: lunch aosp_arm-eng。

执行编译命令
编译指令根据使用场景不同有好几种,下表中列出了这些编译指令:

编译指令 备注
m 在源码树的根目录执行编译
mm 编译当前路径下所有模块,但不包含依赖
mmm [module_path] 编译指定路径下所有模块,但不包含依赖
mma 编译当前路径下所有模块​
地下城与勇士发布网​,并包含依赖
mmma [module_path] 编译指定路径下所有模块,并包含依赖
make [module_name] 当不指定参数时则表示编译整个 Android 源码(包含依赖)
注:m、mm、mmm、mma、mmma 这些命令都是通过 make 方式来完成的。

一般首次的情况下会使用 make指令来编译,相当于进行一次全量编译。为了加快编译速度,可以使用 -j参数指定线程数,例如:

make -j8
1
编译成功后,终端会显示 build completed successfully。同时,在源码根目录下的 /home/airsaid/aosp/out/target/product/<product_name>目录中会出现编译后的产物。其中比较重要的有以下三个镜像文件:

system.img:系统镜像。里面包含了 Android 系统主要的目录和文件,通过 init.c进行解析并 mount挂载到 /system目录下。
userdata.img:用户镜像。是 Android 系统中存放用户数据的,通过 init.c进行解析并 mount挂载到 /data目录下。
ramdisk.img:根文件系统镜像。包含一些启动 Android 系统的重要文件,例如 init.rc。
在编译的过程中可能会遇到以下问题,可以按照对应的解决方法来解决:

找不到 /usr/bin/python文件或目录:
/bin/bash: device/generic/goldfish/tools/mk_combined_img.py:/usr/bin/python:解释器错误: 没有那个文件或目录
1
python 脚本语法错误(由于源码中部分 python 脚本用到了 python2 的语法导致的):
File “/home/airsaid/aosp/device/generic/goldfish/tools/mk_combined_img.py”, line 48

print "'%s' cannot be converted to int" % (line[2])

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

SyntaxError: Missing parentheses in call to ‘print’. Did you mean print(…)?

解决方法:没有安装 python2 则先安装,并建立软连接将 python 指向 python2:

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

内存溢出:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
1
解决方法:通过修改 _JAVA_OPTIONS环境变量配置,指定更大的内存。将下面的代码添加到 .bashrc文件:

export _JAVA_OPTIONS=-Xmx4096m
1
其他
为 VirtualBox 中的 Ubuntu 扩容
在关闭虚拟机的前提下,通过 cmd 进入 VirtualBox 的安装目录,例如:
cd /d D:\virtualbox
1
查看 VirtualBox 的虚拟硬盘,并记下 UUID 信息:
D:\virtualbox>VBoxManage list hdds
UUID: 279063de-8822-48c2-97d9-67964fb90b18
Parent UUID: base
State: created
Type: normal (base)
Location: G:\VirtualBoxVMs\Ubuntu\Ubuntu.vdi
Storage format: VDI
Capacity: 225280 MBytes
Encryption: disabled

根据指定 UUID 修改对应虚拟机的容量大小,例如下面的示例中重新分配了 51200 MB(50G):
VBoxManage modifyhd 279063de-8822-48c2-97d9-67964fb90b18 --resize 51200
1
打开虚拟机,安装 gparted分区工具:
sudo apt-get install gparted
1
打开分区工具,并将多出来的磁盘分到对应磁盘上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值