Mac系统下编译Android系统源代码
前言
我们知道,Android OS是基于Linux内核的移动操作系统,主要分成了
- Application
- ApplicationFramework(Java)
- System Libraries(Native C/C++)/Android Runtime
- HAL(Hardware Abstraction Layer)
- Linux Kernel
这几个部分。
作为一个Android Developer,熟练使用Android系统API是必不可少的(Application),但是在进阶的道路上,揭开API的『面具』,直面API背后的Android FW/Linux Kernel同样是一条必经之路。
今天就介绍一下,如何在Mac OSX上进行Android系统源代码的编译。
正文
AOSP 是Google领导的Android系统开源项目,旨在为开发者创建定制的Android堆栈版本提供源代码以及相关信息。AOSP的相关简介可以在这里查看。
下面就分步进行Android系统源码的编译:
1. 创建区分大小写的磁盘映像
AOSP项目使用git进行版本控制,mac默认的磁盘对大小写是非敏感的,在这类文件系统中,可能导致git的一些命令失效(比如:git status),因此需要创建出一个Case-sensitive的磁盘映像来存储AOSP项目代码。
-
创建磁盘空间:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/ android.dmg
执行完成后,会在用户根目录(命令行cd ~)创建出一个未挂载的磁盘映像android.dmg(也可能是android.dmg.sparseimage)
-
调整磁盘大小:
创建完成后,可对磁盘空间的大小进行调整hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
这里如果想要完整编译master分支,resize的大小建议120G左右,否则空间不足会导致编译重置,并且mac存储空间中会多一部分无法删除的占用。
双击用户目录的android.dmg.sparseimage即可挂载磁盘空间。
2. 安装JDK
需注意,AOSP项目必须基于Open JDK的版本。
3. 安装Xcode
-
从App store下载xcode安装,完成后执行
$ xcode-select --install
Note:这里最好再运行一下
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
以防后面的步骤出现warning:
Warning: Xcode appears to be installed but xcodebuild is unusable; some ports will likely fail to build.
4. 安装MacPorts
-
根据自己的系统来选择 MacPorts的下载地址
-
编辑.bash_profile文件(如果没有此文件,vi会自动创建)
vi ~/.bash_profile
-
复制
export PATH=/opt/local/bin:$PATH
到.bash_profile文件中。 -
激活MacPorts命令:
source ~/.bash_profile
5. 通过MacPorts安装Make、Git、GPG
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
同时,由于mac中允许同时打开的文件描述符数较低,复制以下文本至.bash_profile文件中:
ulimit -S -n 1024
6. 下载源代码
可以参阅 [官方教程]
-
确保主目录下有一个
bin/
目录,在.bash_profile中添加:mkdir ~/bin PATH=~/bin:$PAT
激活:
source ~/.bash_profile
-
下载repo
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo
关于repo的介绍,看这里。
-
初始化repo
挂载的磁盘目录一般在/Volumes文件夹下,cd /Volumes
进去后,找到挂载的磁盘名,cd进入磁盘目录后:repo init -u https://android.googlesource.com/platform/manifest
-
开始下载源码
repo sync
Note:这里下载的为AOSP master分支的代码,也就是当前最新的Android版本。如需repo特定分支,请使用:
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
你可以从这里查看源代码的各版本分支。
如需使用本地镜像或者需要验证git,请参阅官方教程。
7. 编译
编译过程在经历了多个Android版本之后变得更加简单明了。可以参考 [官方教程]
-
设置环境
source build/envsetup.sh
-
cd到源代码目录后:
make -j17
GNU Make 可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。
Note:此博文仅编译代码用于查看系统代码。如需要设备调试或者需要修改代码,请参阅郭霖的博客。
8. 在AndroidStudio中查看源码
关于AndroidStuido的下载以及介绍,请移步 Android Studio官方网站。
-
编译完成后,cd到源代码目录,如
/Volumes/android/source
,执行:mmm development/tools/idegen/
-
idegen完成后,执行:
sh ./development/tools/idegen/idegen.sh
-
以上两步完成以后,打开AndroidStudio -> File -> Open -> 源代码目录 -> android.ipr,即可在AndroidStuido中查看Android源代码。
写在后面
网上其实有很多编译源码的教程,但是大多都是比较老旧的版本,亲测下来最新的master分支已经解决了很多遗留的编译问题。
整个过程并没有很复杂,最难以应对的就是mac昂贵的硬盘空间了,256G的HD结结实实折腾了几次才最终编译完成。
遇到问题多看官方文档才是最正确的姿势。
原文地址:https://www.cnblogs.com/y1011/p/11805026.html
- 扬言毁灭人类的索菲亚再一次挑战了人类
- SQL Server 存储过程生成insert语句
- silverlight 背景透明
- .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(33)-MVC 表单验证
- 如何利用深度学习识别千万张图片?
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(31)-MVC使用RDL报表
- 43 Hot Flex and ActionScript 3.0 APIs, tips and tools for Autumn 2008
- 异步数据存储
- 谈谈基于SQL Server 的Exception Handling[中篇]
- C# AD(Active Directory)域信息同步,组织单位、用户等信息查询
- 如何仅使用TensorFlow C+来训练深度神经网络
- 捕获silverlight滚轮事件
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring MVC 学习
- RSeQC判断链特异性(strand-specific)
- bigWigMerge合并bigwig文件
- WPF桌面开发集成Nginx服务器
- chrome浏览器拦截(block)特定网站某些请求的方法
- 聊一聊:一道 Promise 链式调用的题目
- linux编译运行c++程序
- Python的运算符 (下)
- 深入理解JVM(③)Java的锁优化
- Spring 基于 Java 的配置 - 如何不用Beans.xml照样描述bean之间的依赖关系
- Spring 中的事件处理
- Vim安装插件管理器Vundle
- Ubuntu下为vim安装YouCompleteMe插件
- 单机部署k8s
- VIM个性化配置(一)