作为一个Android开发者没有编译过Android源码怎么能行,如果还没编译过那就赶紧看看下面的内容。
先介绍一下Android源码有关的一些网址:
源码官网:https://source.android.com/
搭建编译环境:https://source.android.com/source/initializing.html
下载源代码:https://source.android.com/source/downloading.html
编译 Android:https://source.android.com/setup/build/building
Android镜像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
一、设置 Mac OS 编译环境
创建区分大小写的磁盘映像
Mac OS 默认会在不区分大小写的文件系统中运行。Git 并不支持此类文件系统,而且此类文件系统会导致某些 Git 命令(例如 git status)的行为出现异常。因此,建议在区分大小写的文件系统中对 AOSP 源文件进行操作。
1、shell命令创建
可以通过 shell 使用以下命令创建磁盘映像:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 200g ~/android.dmg
这将创建一个 .dmg(也可能是 .dmg.sparseimage)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。
如果以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:
hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
- 要载磁盘映像,请运行以下命令:
hdiutil attach ~/android.dmg -mountpoint /Volumes/android
- 要卸载磁盘映像,请运行以下命令:
hdiutil detach /Volumes/android
装载 android 存储卷后,您将在其中开展所有工作。您可以像对待外接式存储盘一样将其弹出(卸载)。
2、磁盘工具创建
设置文件描述符数量上限
在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。
要提高此上限,请将下列行添加到 ~/.bash_profile 中:
# set the number of open files to be 1024
ulimit -S -n 1024
二、下载Android源码
1、安装 Repo
Repo 是一款工具,可让您在 Android 环境中更轻松地使用 Git
1.要安装 Repo,请执行以下操作:
确保主目录下有一个 bin/ 目录,并且该目录包含在路径中:
mkdir ~/bin
PATH=~/bin:$PATH
2.下载 Repo 工具,并确保它可执行:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
2、初始化 Repo 客户端
运行 repo init 以获取最新版本的 Repo 及其最近的所有错误更正内容。您必须为清单指定一个网址,该网址用于指定 Android 源代码中包含的各个代码库将位于工作目录中的什么位置。
repo init -u https://android.googlesource.com/platform/manifest
要对“master”以外的分支进行校验,请使用 -b
来指定相应分支。要查看分支列表,请参阅源代码标记和版本。
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r42
三、下载 Android 源代码
要将 Android 源代码树从默认清单中指定的代码库下载到工作目录,请运行以下命令:
repo sync
四、编译 Android
1、设置环境
使用 envsetup.sh 脚本初始化环境。
source build/envsetup.sh
或
. build/envsetup.sh
2、选择目标
使用 lunch 选择要编译的目标。确切的配置可作为参数进行传递。例如,以下命令表示针对模拟器进行完整编译,并且启用所有调试功能.
lunch aosp_arm-eng
如果在没有参数的情况下运行,则 lunch
会提示您从菜单中选择目标。要了解所有现有设备的编译配置,请参阅选择设备编译系统一文。
所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一
user
权限受限;适用于生产环境
userdebug
与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng
具有额外调试工具的开发配置
五、编译代码
请使用 make
进行所有编译。make
可以使用 -jN 参数处理并行任务。如果您未提供 -j 参数,编译系统便会自动选择其认为对您的系统最佳的并行任务计数。
编译完成后out/target/product/generic 目录生成了三个重要的镜像文件: system.img、userdata.img、ramdisk.img:
system.img
:系统镜像,里面包含了Android系统主要的目录和文件,通过init.c进行解析并mount挂载到/system目录下。
userdata.img
:用户镜像,是Android系统中存放用户数据的,通过init.c进行解析并mount挂载到/data目录下。
ramdisk.img
:根文件系统镜像,包含一些启动Android系统的重要文件,比如init.rc。
六、启动模拟器
source build/envsetup.sh
lunch aosp_x86_64-eng
emulator -partition-size 2562 -memory 2048
七、Android源码导入Android Studio
1、由于Android太大了,所以我们需要给IDE更多的内存:
在Help > Edit Custom VM 中添加:
-Xms1g
-Xmx5g
这两个参数的意思是初始堆内存为1G,最大堆内存为5G,
2、AndroidStudio的类大小配置,在Help -> Edit custom properties中添加:
idea.max.intellisense.filesize=100000
这个参数是定义AS默认的类大小的,默认值是2500,会导致太大的Java文件不能被识别,把这个数调大了之后,就可以导入更大的Java文件。
配置完成后重启IDE
3、源码导入
首先我们还是要执行一遍上述的source build/envsetup.sh 命令和 lunch 命令,当然,如果终端没有关闭的话,可以省略这一步,
然后执行
mmm development/tools/idegen
编译生成idegen.jar,生成完idegen.jar之后,就可以使用命令来扫描生成ipr文件了:
sudo ./development/tools/idegen/idegen.sh
此时在根目录下,就已经生成了android.ipr、android.iml,可以将整个源代码导入AS。
(可选)设置模块过滤
有些不想导入AS的模块,可以通过在android.iml中加入excludeFolder,达到过滤效果。
<excludeFolder url="file://$MODULE_DIR$/.repo"/>
<excludeFolder url="file://$MODULE_DIR$/abi"/>
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
<excludeFolder url="file://$MODULE_DIR$/art"/>
<excludeFolder url="file://$MODULE_DIR$/bionic"/>
<excludeFolder url="file://$MODULE_DIR$/bootable"/>
<excludeFolder url="file://$MODULE_DIR$/out"/>
<excludeFolder url="file://$MODULE_DIR$/pdk"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilts"/>
<excludeFolder url="file://$MODULE_DIR$/sdk"/>
<excludeFolder url="file://$MODULE_DIR$/system"/>
<excludeFolder url="file://$MODULE_DIR$/tools"/>
<excludeFolder url="file://$MODULE_DIR$/trusty"/>
<excludeFolder url="file://$MODULE_DIR$/vendor"/>
...
八、编译中遇到的问题
ninja: build stopped: subcommand failed.
14:03:54 ninja failed with: exit status 1
https://github.com/phracker/MacOSX-SDKs/releases
下载sdk 12.0版本,解压,然后copy到
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs