赞
踩
在开始学习 Android Framework 的知识前,准备好相关的源码环境是非常有必要的。可以选择直接在 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 的安装很简单,直接下一步、下一步就可以了。所以后面主要介绍下 Ubuntu 的安装和配置。
注:此时不需要选择 ISO Image,这样就是手动安装了,手动安装可以选择系统语言。
接下来会进入系统的安装流程,语言可以选择中文,输入用户名和密码,根据提示直接一步步安装即可。
注意:进入系统的引导安装页面后,屏幕的分辨率很低,可能会导致显示不完整的情况,例如没有显示出下一步的按钮。此时可以用快捷键 Win + 鼠标左键拖动安装页面,将显示不全的页面展示出来。
sudo ./VBoxLinuxAdditions.run
并回车,即可安装增强工具sf_xxx
的目录,该目录就是共享的目录。如果点击查看该目录出现权限问题,可以使用 sudo adduser [username] vboxsf
命令将当前用户添加到 vboxsf
用户组(注意替换为你设置的用户名)。注意:在完成配置后,最好重启下系统,从而让配置生效。
Android 项目很大,是一个超级项目。所以为了更好的管理代码,Android 官方做了一个叫做 Repo 的工具,用来在 Android 环境中更好的使用 Git 来管理代码。因此我们要获取 Android 源码,首先需要准备好该工具。
在终端中运行以下命令来安装 Repo 工具:
sudo apt-get update
sudo apt-get install repo
检查是否安装成功:
repo version
如果出现和以下类似的输出,则说明安装成功:
airsaid@airsaid-VirtualBox:~$ repo version
<repo not installed>
repo launcher version 2.17
(from /usr/bin/repo)
由于众多周知的原因,如果不适用镜像的话会出现网络问题,下载速度也不理想。因此可以选择用清华大学或其他组织提供的镜像地址来解决问题。这里以清华大学的镜像为例:
sudo apt-get install curl
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod +x ~/bin/repo
~/.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'
source ~/.bashrc
让其立即生效。mkdir <dir_name>
cd <dir_name>
git config --global user.name YourName
git config --global user.email you@example.com
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
如果需要指定版本,可以使用 -b 选项指定分支(该链接中包含所有的分支信息:source.android.com/docs/setup/…):
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r47
repo sync
如果需要加快同步速度,可以传递 -c
(当前分支)和 -jthreadcount
标志:
repo sync -c -j4
以 Android 10 源码为例,下载完大小大约为 100G 左右。
在编译的过程中需要用到一些工具,所以提前安装好它们避免编译失败:
sudo apt install m4 libncurses5 python-is-python3
envsetup.sh
脚本用于初始化环境,其中记录着编译过程中所需的各种函数实现,例如 lunch、m、mm、mmm
等等。在下载好的源码目录下通过一下命令执行该脚本:
source ./build/envsetup.sh
或者也可以使用以下命令:
. ./build/envsetup.sh
注意:每次重新打开终端后都需要再次执行该命令。另外,使用 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
编译成功后,终端会显示 build completed successfully
。同时,在源码根目录下的 /home/airsaid/aosp/out/target/product/<product_name>
目录中会出现编译后的产物。其中比较重要的有以下三个镜像文件:
init.c
进行解析并 mount
挂载到 /system
目录下。init.c
进行解析并 mount
挂载到 /data
目录下。init.rc
。在编译的过程中可能会遇到以下问题,可以按照对应的解决方法来解决:
/usr/bin/python
文件或目录:/bin/bash: device/generic/goldfish/tools/mk_combined_img.py:/usr/bin/python:解释器错误: 没有那个文件或目录
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
复制代码
解决方法:通过修改 _JAVA_OPTIONS
环境变量配置,指定更大的内存。将下面的代码添加到 .bashrc
文件:
export _JAVA_OPTIONS=-Xmx4096m
cd /d D:\virtualbox\
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
VBoxManage modifyhd 279063de-8822-48c2-97d9-67964fb90b18 --resize 51200
gparted
分区工具:sudo apt-get install gparted
注意:如果出现
Unable to resize read-only file system
可以参照该文章进行解决:blog.csdn.net/ningmengzhi…
作者:Airsaid
链接:https://juejin.cn/post/7168809689990299678
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。