1. 要求

1.1 硬件

  • 160g可用磁盘空间。

笔者编译的是Android 9.0源码,下载下来后将近40g,编译后153g,所以至少需要160g可用磁盘空间。

看网上有别人下载编译7.1.1版本的源码,编译下来需要67g,则可用磁盘空间至少需要分配80g。

注:在编译过程中,如果由于磁盘空间不足导致编译失败,可重新调整磁盘大小,然后接着之前的进度继续编译,所以此处看个人编译的版本,但至少要保证可用磁盘不能太小。

1.2 软件

1.2.1 编译的Android版本与需要的Mac OS版本
  • Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具
  • Android 5.x (Lollipop) :Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具
  • Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat) :Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的开发者工具)
  • Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich) :Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK
1.2.2 JDK
  • Android 7.0 (Nougat) - Android 8.0 (O) :jdk 8u45 或更高版本
  • Android 5.x (Lollipop) - Android 6.0 (Marshmallow) :jdk-7u71-macosx-x64.dmg
  • Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat) :Java JDK 6

2. 准备工作

2.1 创建分区大小写的磁盘映像

Mac OS默认会在不区分大小写的文件系统中运行,但由于Git并不支持此类文件系统,所以需要在Mac OS上建立一个区分大小写的磁盘分区。我们这里使用命令行来创建,一是比较方便,二是后期可扩展。

在终端输入以下命令来创建一个160g大小的磁盘映像:

$ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 160g ~/android.dmg
复制代码

会在当前用户目录下生成一个android.dmg.sparseimage文件,可简单理解为该文件是编译源码所需要的驱动盘。

建议在分区时size指定为160g,但如果后期不够,可以通过该命令来调整分区大小,例如下面命令调整为200g:

$ hdiutil resize -size 200g ~/android.dmg.sparseimage
复制代码

注意:调整分区大小的命令,需要在该分区磁盘映像已卸载的情况下才能生效。

2.2 添加装载和卸载磁盘分区的命令和函数

为了方便装载和卸载该分区磁盘映像,我们可以向~/.bash_profile文件中添加如下函数:

# mount the android file image
mountAndroid() { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
复制代码

需要装载分区磁盘映像时,执行如下命令即可,装载路径为/Volumes/android

$ mountAndroid
复制代码

同样,卸载的函数如下,我们也将它添加到~/.bash_profile文件中:

# unmount the android file image
umountAndroid() { hdiutil detach /Volumes/android; }
复制代码

执行如下命令,便可卸载该分区磁盘映像:

$ umountAndroid
复制代码

2.3 安装Xcode和其它软件包

  1. 安装Xcode命令行工具:
$ xcode-select --install
复制代码
  1. 安装Xcode,直接在AppStore里安装即可。

  2. 安装MacPorts或Homebrew,MacPorts和Homebrew是软件包管理工具,可用来直接在终端里安装、更新和卸载软件包。建议二者都安装,笔者在通过MacPorts安装gnupg时死活装不上,最后通过Homebrew安装成功:

  3. ~/.bash_profile文件中导入路径,就可以使用port或brew命令来管理软件包了:

 export PATH=/opt/local/bin:$PATHexport PATH=/usr/local/bin:$PATH
复制代码
  1. 安装gmake、libsdl、git和gnupg
  • 如果是使用MacPorts,则执行如下命令:
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
复制代码
  • 如果是使用Homebrew,则执行如下命令:
$ brew install gmake libsdl git gnupg2
复制代码

2.4 下载Mac OS SDK

由于新版本的Mac OS更新(我这里是10.14.4 Mojave版本),导致Android源码在编译时可能报如下错误:

system/core/libcutils/threads.c:38:10: error: 'syscall' is deprecated: first deprecated in OS X 10.12 - syscall(2) is unsupported; please switch to a supported interface. For SYS_kdebug_trace use kdebug_signpost(). [-Werror,-Wdeprecated-declarations]return syscall(SYS_thread_selfid);
复制代码

所以需要下载旧版本的Mac OS SDK,建议下载MacOSX10.11.sdk.tar.xz 版本,解压到自定义目录,然后建立软链接。例如我放在~/lib目录下,再给它创建一个软链接,可以避免下次Mac OS或Xcode升级的时候被删除:

$ sudo ln -s ~/lib/MacOSX10.11.sdk /Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
复制代码

2.3 设置文件描述符数量上限

在 Mac OS 中,可同时打开的文件描述符的默认数量上限太低,在高度并行的编译流程中,可能会超出此上限。要提高此上限,请将下列行添加到 ~/.bash_profile 中:

# set the number of open files to be 1024
ulimit -S -n 1024
复制代码

至此,一切准备工作就绪,接下来就是下载源码的过程了。

3. 下载源码

3.1 说明

这里参考Google 教程。由于墙的原因,即使我们作为技术人员能翻过去,但使用起来可能还是有各种各样的问题,所以这里我们可以通过清华大学镜像站来下载。

3.2 下载安装Repo工具

由于Android源码庞大复杂,所以Google专门开发了Repo来管理Android源码库,这里不多作介绍,有兴趣可自行阅读repo工具介绍。

按照官方建议,首先在主目录下有一个 bin/ 目录,并且将该目录包含在路径中:

$ mkdir ~/bin
$ PATH=~/bin:$PATH
复制代码

然后下载Repo工具,并确保它可执行:

$ curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
$ chmod a+x ~/bin/repo
复制代码

3.3 初始化 Repo 客户端

在2.2小节中,我们通过mountAndroid命令装载了我们分区后的磁盘映像,其装载路径为/Volumes/android,所以我们需要在该目录下进行初始化:

切换到该目录下,并且创建一个aosp的工作目录:

$ cd /Volumes/android/
$ mkdir aosp
$ cd aosp
复制代码

现在,我们的源码根目录全路径为/Volumes/android/aosp

Repo的运行过程中会尝试访问官方的git源更新自己,如果想使用清华的镜像源进行更新,可以将如下内容复制到你的~/.bashrc(没有该文件则创建一个)里:

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

然后配置git,需要姓名和邮箱:

$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
复制代码

运行repo init来初始化master分支:

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

要对master以外的分支进行校验,请使用 -b 来指定相应分支。要查看分支列表,请参阅源代码标记和版本,笔者这里指定的是android-9.0.0_r35分支:

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

3.4 下载 Android 源代码树

在终端输入以下命令来下载源码:

$ repo sync
复制代码

由于下载源码过程比较长,所以最好将你的Mac“系统偏好设置” -> “节能”里勾选上“防止进入睡眠”,如下图所示:

接下来就是漫长的等待过程了,30多g,带宽如果还可以的话,差不多不到两小时就下载完成了,会提示:

Syncing work tree: 100%(xxx/xxx), done.
复制代码

4. 编译

编译命令还是在下载源码的目录下输入,即/Volumes/android/aosp

4.1 切换bash

由于Android编译只能使用bash,所以你如果使用zsh等其它的shell,需要切换至bash,切换命令如下:

$ chsh -s /bin/bash
复制代码

然后重启终端才能生效。

4.2 环境设置

使用envsetup.sh脚本初始化环境:

$ source build/envsetup.sh
复制代码

4.3 选择编译目标

输入lunch,会提示如下:

$ lunch You're building on DarwinLunch menu... pick a combo:1. aosp_arm-eng2. aosp_arm64-eng3. aosp_mips-eng4. aosp_mips64-eng5. aosp_x86-eng6. aosp_x86_64-eng7. aosp_car_arm-userdebug8. aosp_car_arm64-userdebug9. aosp_car_x86-userdebug10. aosp_car_x86_64-userdebug11. mini_emulator_arm64-userdebug12. m_e_arm-userdebug13. m_e_mips-userdebug14. m_e_mips64-eng15. mini_emulator_x86-userdebug16. mini_emulator_x86_64-userdebug17. uml-userdebug18. aosp_crosshatch-userdebug19. aosp_blueline-userdebug20. aosp_cf_x86_auto-userdebug21. aosp_cf_x86_phone-userdebug22. aosp_cf_x86_tablet-userdebug23. aosp_cf_x86_tablet_3g-userdebug24. aosp_cf_x86_tv-userdebug25. aosp_cf_x86_wear-userdebug26. aosp_cf_x86_64_auto-userdebug27. aosp_cf_x86_64_phone-userdebug28. aosp_cf_x86_64_tablet-userdebug29. aosp_cf_x86_64_tablet_3g-userdebug30. aosp_cf_x86_64_tv-userdebug31. aosp_cf_x86_64_wear-userdebug32. cf_x86_auto-userdebug33. cf_x86_phone-userdebug34. cf_x86_tablet-userdebug35. cf_x86_tablet_3g-userdebug36. cf_x86_tv-userdebug37. cf_x86_wear-userdebug38. cf_x86_64_phone-userdebug39. cf_x86_64_tablet-userdebug40. cf_x86_64_tablet_3g-userdebug41. cf_x86_64_tv-userdebug42. cf_x86_64_wear-userdebug43. aosp_marlin-userdebug44. aosp_marlin_svelte-userdebug45. aosp_sailfish-userdebug46. aosp_walleye-userdebug47. aosp_walleye_test-userdebug48. aosp_taimen-userdebug49. hikey-userdebug50. hikey64_only-userdebug51. hikey960-userdebugWhich would you like? [aosp_arm-eng]
复制代码

这里列出了所有的可编译的目标。所有编译目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号,BUILDTYPE 是以下类型之一,表示在什么环境下运行:

编译类型 使用情况
user 权限受限;适用于生产环境
userdebug 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型
eng 具有额外调试工具的开发配置

比如aosp_arm-engBUILDaosp_armBUILDTYPEengaosp代表Android开源项目,arm表示系统是运行在arm架构的处理器上,更多见官方文档。

如果你有Pixel或Nexus真机,选择对应的编译目标即可,否则我们就选模拟器,即5.aosp_x86-eng。在上面的Which would you like? [aosp_arm-eng]后面输入5即可。也直接选择:

$ lunch 5
复制代码

$ lunch aosp_x86-eng
复制代码

4.4 编译代码

在编译之前,通过输入以下命令,可以查看你的Mac的CPU核数:

$ sysctl -n machdep.cpu.core_count
4
复制代码

上面输出的CPU核数为4,则可以启动4个线程来编译源码:

$ make -j4
复制代码

接下来就是漫长的编译过程,一般需要2~3个小时,如果看到下面的提示,则表示已经编译完成:

#### build completed successfully (02:15:52 (hh:mm:ss)) ####
复制代码

4.5 运行模拟器

在编译完成后,终端里输入以下命令,便可使用模拟器来运行编译的版本:

$ emulator
复制代码

5. Android Studio导入源码

5.1 编译idegen模块

编译完成之后,运行以下命令,编译idegen模块:

$ mmm development/tools/idegen/
复制代码

idegen模块编译完成后会有如下提示:

#### make completed successfully (46 seconds) ####
复制代码

此时继续运行下面的命令,会在aosp根目录生成对应的android.iprandroid.iml IDEA工程配置文件

$ development/tools/idegen/idegen.shRead excludes: 17ms
Traversed tree: 218013ms
复制代码

5.2 导入源码

启动Android Studio,选择一个已存在的Android Studio项目,然后选中aosp根目录下的android.ipr文件,如果提示需要你convert,确认convert就行。首次导入大概需要20~30分钟:

导入成功后,在Project Structure中,选择Modules,删除所有的依赖,只保留下图所示。这样在查看源码跳转的时候,不会进入android.jar,会直接跳转至本项目的文件中。

现在你可以自由地阅读源码了,enjoy it!

参考

Google官方Android源码编译教程 清华大学开源软件镜像站 - Android 镜像使用帮助 macOS(Sierra 10.12)上Android源码(AOSP)的下载、编译与导入到Android Studio Android AOSP基础(二)AOSP源码下载 Android AOSP基础(三)Android系统源码的整编和单编 使用Android Studio导入源码

转载于:https://juejin.im/post/5cc5165fe51d456e781f2082

手把手教你在Mac OS下载、编译及导入Android源码相关推荐

  1. 手把手教你调试构建一个Vue/小程序商城项目源码

    下面将详细的介绍weiphp5.0商城项目的调试打包上线的流程: 安装NodeJs/NPM 安装CNPM(可忽略) 运行项目 打包上线项目 1. 安装NodeJs 推荐到NodeJS的官网下载安装包 ...

  2. 高通android开源代码下载,高通平台Android源码bootloader分析之sbl1(三)

    前两篇博文分析了启动流程.代码流程.cdt,接下来就分析另外几个需要格外关注的部分. ##log系统 sbl1中的log系统也是sbl1部分调试会经常接触得部分高通平台在sbl中做的log系统并不是很 ...

  3. android源码编译jar,在android源码编译中导入第三方jar包

    源码编译,我们可以只留下app的src,res目录和androidmanifest.xml文件,在app的根目录添加一个android.mk文件,还有我们需要导入的jar包,我这里是libjsoup- ...

  4. mac平台反编译apk,获取源码,androidmanifest和资源文件

    "提供一个反编译apk的工具" 在window上反编译apk是比较容易的事情,但是在mac上就需要稍微费力一些,这里为了方便大家,特意提供了一个python脚本,实现快速反编译ap ...

  5. 用SVN下载编译Spring3.2.4源码导入eclipse

    想学习研究下Spring源码,就在网上搜索一堆资料,别人的东西在自己的电脑上总是有问题.总结下自己的使用方法,以便备忘. 前提:导入eclipse成功,导入不了myeclipse. 1.准备条件: ( ...

  6. paddle 标注_一看就会,手把手教你编程,批量文章标注拼音(附源码)

    文/IT可达鸭 图/IT可达鸭.网络 前言 是不是学了Python之后,苦于没有项目练手?是不是看了很多关于编程视频,等到自己动手时,却怎么也做不出一个项目? 工作在一线的老程序员告诉你,别慌,让我手 ...

  7. 手把手教你使用LabVIEW OpenCV dnn实现图像分类(含源码)

    文章目录 前言 一.什么是图像分类? 1.图像分类的概念 2.MobileNet简介 二.使用python实现图像分类(py_to_py_ssd_mobilenet.py) 1.获取预训练模型 2.使 ...

  8. 手把手教 | 使用Bert预训练模型文本分类(内附源码)

    作者:GjZero 标签:Bert, 中文分类, 句子向量 本文约1500字,建议阅读8分钟. 本文从实践入手,带领大家进行Bert的中文文本分类和作为句子向量进行使用的教程. Bert介绍 Bert ...

  9. 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译

    本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:http://item.jd.com/12212640.html 试读地址:http:/ ...

最新文章

  1. 默的各种写法图片_SEO标题写法?
  2. 解决jupyter中无自己创建的虚拟环境
  3. Android开发之sdcard读写数据(源代码分享)
  4. SQL SERVER 2008 字段值合并
  5. javascript --- 堆栈内存与闭包的作用
  6. winform什么时候会调用closed事件_async/await 给程序带来了什么?
  7. VAE【变分自编码器】
  8. day18__文件操作
  9. 汽车常识全面介绍 - 悬挂系统
  10. SQL Server超时诊断和调优
  11. matlab中mod(10 3),matlab的rem()和mod()函数
  12. 怎样理解电脑评分_电脑可以理解我们的情绪吗?
  13. python模板语言_3 个 Python语言 模板库比较
  14. (老机福音,重装后恢复软件设置)Ghost_XP_战神 V11 老机版
  15. 相关系数excel_怎样征服老板?教你用excel找到数据之间隐藏信息
  16. ASP.NET4.0尚未在Web服务器上注册
  17. 解读应聘阿里的注意事项
  18. ETL——实现Kettle作业定时任务
  19. Unrecognised input. Possibly missing opening ‘{‘
  20. 微信iOS 8.0.8正式版重磅更新啦,这些新功能超好用!!

热门文章

  1. gulp与grunt对比
  2. 第6章 数据存储全方案,详解持久化技术
  3. 轮廓处理函数详细(转)
  4. 信息发布webpart——网页编辑器应用攻略
  5. step1 . day3 C语言基础
  6. Entity Framework数据库初始化四种策略
  7. 如何学习Linux性能优化?
  8. 【CSS】自定义checkbox样式
  9. BZOJ3572 [Hnoi2014]世界树 【虚树 + 树形dp】
  10. 制作系统盘,重装新系统。