Mac下Android源码(AOSP)编译环境搭建方法

2023-10-29

一、编译源码的背景环境

Android源码编译有什么困难

  1. AOSP 非常庞大,需要下载,但是他是Google家的,和大陆开发者之间隔着一个GFW
  2. 官方文档 推荐使用Ubuntu 14.04进行编译。我用的是MacOS,官网也给了Mac下的编译方式,不过看起来还是挺麻烦的。而且我怕搞乱我的电脑。

针对上面的两点,以前有这么两种解决方式,以前有这么几种解决方式

  1. 至于下载慢,可以使用国内镜像清华镜像科大镜像,好像现在google的开发者网站部分不用梯子就可以访问了[当前时间2017-04]
  2. 有人使用虚拟机,然后安装Ubuntu,然后编译源码。这方式也可以,但是Mac下三种虚拟机,免费的那个还不好用。而且编译本身就比较消耗资源,再装个虚拟机就更麻烦了

后来有人提出用Docker

而且这个人搞了一份Docker镜像出来 kylemanna/docker-aosp,后来有人针对Docker以及天朝的网络环境做了一部分修改,fork了一份国产的 tiann/docker-aosp。主要是修改了shell脚本中的下载源。但是这个东西在MAC OS上有bugissues 19所以我就没用成功。

有一点题外话需要说一下,这个Docker安装后会开机默认启动,默认启动倒是也没问题,有问题的是他不可以和Android虚拟机同时运行,就是AndroidStudio自带的那个虚拟机。

二、搭建Mac编译环境

修改文件描述符限制
~/.bash_profile中添加以下内容

#set the number of open files to be 1024 
ulimit -S -n 1024

开发环境要求

  1. Mac OS v10.10 (Yosemite) 或以上,安装了 Xcode 4.5.2或以上,安装了Command Line Tools。
  2. 安装JDK 7
  3. 安装了python 2.7
  4. GNU Make 3.81或3.82
  5. [Git](http://git

我本机环境

  1. Mac OS v10.12.4
  2. xcode v8.0
  3. git version 2.8.4 (Apple Git-73)
  4. GNU Make 3.81
  5. 为了编译不同版本的Android源码,同时安装了JDK7 & JDK8,通过配置.bash_profile 来切换
  6. Python 2.7.11
  7. 之前我电脑还安装了homebrew

磁盘分区

为什么在Mac上编译会很麻烦呢,因为Mac的文件系统默认不区分大小写,但是Android源码编译系统的要求区分大小写,这时候我们可以创建个区分大小写的磁盘空间。方法如下:

  1. 打开磁盘工具(在Launchpad中直接搜索就行)
  2. 如下图操作(磁盘命名为AOSP,磁盘大小为100G,磁盘格式一定要选择区分大小写) 首先选中Macintosh HD 然后Comand + N
    磁盘分区

这个磁盘分区的名字后面要用到,磁盘大小好像官网推荐70G,以防不够还是大点吧,格式一定要选区分大小写。这个磁盘分区还有另一种方式,我不知道这两种方式到底有什么区别。对应磁盘的分区使用,有人为了节省Mac上的硬盘,也为了防止搞坏系统,用了外接硬盘的方式然后操作这个外接硬盘的分区。

下载Android源码

下面是科大的源也可以用清华的参考文献我下载的是Android6.0的源码,最终编译的时候选择的是x86_64

  1. 下载 repo 工具:

    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
  2. 建立工作目录:

    cd /Volumes/AOSP/
    mkdir WORKING_DIRECTORY
    cd WORKING_DIRECTORY
  3. 初始化仓库

    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
    
    ## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
    
    
    ## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
    

    如果需要某个特定的 Android 版本(Android 版本列表),可以通过下面的方式指定版本号,如果不指定则代码下载当前最新的代码。

    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-6.0.1_r46

    注:在mac上运行这行可能会报错,GnuPG 这玩意不可用,解决方式看最后错解决

  4. 同步源码树(以后只需执行这条命令来同步)如果中途出现网络错误,可以停止后在执行下面的命令:

    repo sync

    然后就等着吧0_0

编译源码

  1. 清空缓存
    $ make clobber

    注:如果运行这行命令出错看文章最后错误处理

  2. 配置编译环境
    $ source build/envsetup.sh
  3. 选择编译目标
    $ lunch 这时候会列出一系列的选项然后选择一个如下:

    You're building on Darwin
    Lunch menu... pick a combo:
         1. aosp_arm-eng
         2. aosp_arm64-eng
         3. aosp_mips-eng
         4. aosp_mips64-eng
         5. aosp_x86-eng
         6. aosp_x86_64-eng
         7. full_fugu-userdebug
         8. aosp_fugu-userdebug
         9. mini_emulator_arm64-userdebug
         10. m_e_arm-userdebug
         11. m_e_mips-userdebug
         12. m_e_mips64-eng
         13. mini_emulator_x86-userdebug
         14. mini_emulator_x86_64-userdebug
         15. aosp_dragon-userdebug
         16. aosp_dragon-eng
         17. aosp_marlin-userdebug
         18. aosp_sailfish-userdebug
         19. aosp_flounder-userdebug
         20. aosp_angler-userdebug
         21. aosp_bullhead-userdebug
         22. hikey-userdebug
         23. hikey960-userdebug
         24. aosp_shamu-userdebug
    Which would you like? [aosp_arm-eng]

    然后直接输入上面选项的序号就好了这里,我选择第一个,至于上面那些名字的含义是啥看下面解释:

    官网说根据上面名字的后缀可以判断要编译那种类型的:

    • user: limited access; suited for production(有限的访问权限,一般用于发布版)
    • userdebug: 这个和user类似,但是可以获取root权限,并且能够调试
    • eng: 具有开发配置,并且有额外的调试工具(注:工程师模式engineer)

    lunch命令也可以直接这么用 $ lunch aosp_arm-eng

  4. 开始编译
    make -j16 这里指定的开启几个并行task来进行编译,官网建议j后面的数字根据你电脑的线程数量的1~2倍来设置,比如电脑是双核CPU,每个CPU为双核心四线程,那么就有8个线程。所以我配置的数量为16。
    然后就是漫长的等待ing…

启动模拟器

  1. $ source build/envsetup.sh
  2. $ lunch (选择刚才你设置的目标版本,我编译的是x86_64-eng的那个)
  3. $ emulator模拟器启动,这个命令有很多复杂用法,具体可参考官网。

烧录镜像到机器中

这个烧录过程我没有测试,官网是这么写的。

  1. 进入fastboot模式
    $ adb reboot bootloader
  2. 把img文件刷进去
    $ fastboot flashall -w 这个 -w 是为了wipes the /data partition擦除/data分区

    驱动下载

AndroidStudio中查看源码

在android源码中有这么一个目录development/tools/idegen。
顾名思义,是生成ide的project文件,主要是生成intellij的project文件,可用于AndroidStudio。

  1. 在整个Android源码全编成功之后,然后编译idegen模块,用以生成Android studio的工程配置文件,编译成功之后就生成了idegen.jar(out/host/darwin-x86/framework/idegen.jar),运行如下命令:
    $ mmm development/tools/idegen/

    注:如果刚才编译AOSP的那个命令行窗口关闭了,必须要在执行source build/envsetup.sh一次,用了初始化编译环境。

  2. 在源码根目录生成对应的android.ipr、android.iml IEDA工程配置文件。以便于AndroidStudio可以打开项目
    $ . development/tools/idegen/idegen.sh

  3. 打开Android studio,点击File –> Open,选择刚刚生成的android.ipr就好了。

三、错误处理

执行repo init的错误

错误1描述

warning: gpg (GnuPG) is not available.
warning: Installing it is strongly encouraged.

解决方法:
原因是GnuPG for osx没有安装,去https://www.gnupg.org/download/下载安装即可。
我用homebrew安装的brew install gnupg

执行make clobber的错误

错误1描述:
build/core/config.mk:660: error: Error: could not find jdk tools.jar at /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/../lib/tools.jar, please check if your JDK was installed correctly.
17:29:26 ckati failed with: exit status 1

解决方式:
~/.bash_profile添加如下代码

export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
export JAVA_HOME=$JAVA_8_HOME
##上面是jdk的配置,主要是添加下面这一行
export ANDROID_JAVA_HOME=$JAVA_HOME
错误2描述
build/core/combo/mac_version.mk:38: *****************************************************
build/core/combo/mac_version.mk:39: * Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk
build/core/combo/mac_version.mk:40: *****************************************************
build/core/combo/mac_version.mk:41: *** Stop..  Stop.

解决方法:
出现这个错误是因为xcode的版本不对,首先查看本机安装xcode的版本,

$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

然后修改build/core/combo/mac_version.mk这个文件中的下面这行,把本机的版本号添加到下面,我的是10.12 添加后如下:

mac_sdk_versions_supported :=  10.6 10.7 10.8 10.9 10.12
错误3描述:
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);
         ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/unistd.h:733:6: note: 'syscall' has been explicitly marked deprecated here
int      syscall(int, ...);
         ^
1 error generated.

解决方式:
这个错误3归根到底是因为错误2引起的,再归根下是xcode版本引起的,(为啥说在mac上编译麻烦,这个xcode版本会出这么多破事),没办法这个我们上面用的mac sdk 10.12 版本太高了,这个版本废弃了某些方法导致编译不可用,那就去下个低版本的吧传送门压缩包在这然后下载那个10.11。理论上来说,下载后把目录放到这个路径下/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/和这个MacOSX10.12.sdk目录平级就行了,然后把错误2中添加到build/core/combo/mac_version.mk中的那个10.12改成10.11就好了。但是这个东西貌似在下次xcode升级的时候会被删掉。
a oh so? 弄个软连接:
$ mkdir ~/lib
然后把下载的压缩包解压到~/lib

$ sudo ln -s ~/lib/MacOSX10.11.sdk /Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mac下Android源码(AOSP)编译环境搭建方法 的相关文章

随机推荐

  • Python实战:方差分析(ANOVA)

    Python实战 方差分析 ANOVA 方差分析是一种常用的统计方法 用于比较多个样本的平均值是否有差异 在Python中 我们可以使用scipy库来进行方差分析 假设我们有三组数据 分别为A B C组 每组数据有5个样本 我们要比较这三组
  • C++学习(四八四)anaconda常用命令

    安装tensorflow pip install tensorflow gpu 2 3 0 i https pypi tuna tsinghua edu cn simple pip install tensorflow 安装最新版tenso
  • POJ 2689 Prime Distance(素数区间筛法--经典题)

    大致题意 给定 L R 区间 找出区间内的每个素数 数据范围 1 lt L lt R lt 2 147 483 647 R L lt 1 000 000 R的数值太大 所以不能直接筛 0 R 的 要空间和时间优化 用到区间筛法 另外注意不能
  • 新型的编程语言:eC

    http www cnbeta com articles 61048 htm eC 是一位加拿大人jerome历时十二年开发的一门编译型编程语言 拥有C 项目的性能和Java的跨平台性以及Python的方便性 目前eC拥有自己的IDE 专用
  • android 优秀控件以及开源项目

    原文地址为http www trinea cn Android android open source projects view 作者Trinea 主要介绍那些不错个性化的View 包括ListView ActionBar Menu Vi
  • 设计模式课件

    设计模式 创建型设计模式的分类 定义 结构型设计模式的分类 定义 行为型设计模式的分类 定义 设计模式的分类 在23种设计模式中 每一种属于哪一种的设计模式 设计模式的应用场景 设计模式的图形 考察较少 创建型设计模式的分类 定义 中英文的
  • 【踩雷小记】pytorch用transforms同时旋转图像和标签

    对于transforms中带有概率参数的函数 例如 transforms RandomHorizontalFlip p 0 5 依概率p进行水平翻转 transforms RandomVerticalFlip p 0 5 依概率p进行垂直翻
  • linux I2C之RTC8025、fm24cl16

    说明 主设备I2C 0挂载两个从设备fm24cl16铁电和RTC rx8025t 内核 linux3 10 32 平台 nuc972 1 板级文件修改 arch arm much nuc970 dev c 1 1 i2c 0的platfor
  • HTML-网页-3D旋转相册-创意相册

    HTML 网页 3D旋转相册 代码
  • vue3跨页面锚点定位/页面跳转后使用锚点定位(vue2类似)

    实现效果 跨页面跳转后定位到页面相应位置 这个需求常在官网底部导航栏开发中遇到 vue3 ts开发官网底部导航为例 我的底部导航封装为了一个组件 所以会涉及到父子组件传参 不清楚的伙伴可以去查一下相关资料 注意 这里的跨页面锚点定位分为从一
  • DBUS接口

    我用 CSDN 这个app发现了有技术含量的博客 小伙伴们求同去 DBUS基础知识 非常全面 一起来围观吧 https blog csdn net f110300641 article details 106823611 utm sourc
  • UVa1347 Tour

    题目描述 这道题我想了很久都没有想到 看了lrj的题解才会做 首先可以想到转化成两个人向右走 关键在于状态的设计 设 f i j f i j 为走完了前 max i j max i j 的点 且两个人分别在i j的位置 且 i gt j i
  • LeetCode 336. Palindrome Pairs(回文对)

    原题网址 https leetcode com problems palindrome pairs Given a list of unique words Find all pairs of distinct indices i j in
  • Python爬虫完整代码模版

    以下是一个简单的Python爬虫完整代码模板 用于演示如何使用requests库和BeautifulSoup库爬取网页内容 import requests from bs4 import BeautifulSoup Step 1 发起HTT
  • Warning[Pa050]: non-native end of line sequence detected (this diagnostic is only issued once)

    今天在用IAR软件 给Zigbee程序写注释时 出现了这么一个警告 Warning Pa050 non native end of line sequence detected this diagnostic is only issued
  • OpenGL GLFW入门篇 - 画凸多边形

    效果图 主体代码 void DrawPolygon void glPushMatrix glLoadIdentity glTranslatef 0 0 0 0 0 f 蓝色 glColor3f 0 f 0 f 1 f glBegin GL
  • 递归函数斐波那契数列

    F 0 0 F 1 1 F n F n 1 F n 2 n 2 n N def fibonacci n 求斐波那契数列的第n个数字的值 if n 0 return 0 elif n 1 return 1 else return fibona
  • PHP表单(get,post)提交方式

    PHP 表单处理 PHP 超全局变量 GET 和 POST 用于收集表单数据 form data GET 是通过 URL 参数传递到当前脚本的变量数组 POST 是通过 HTTP POST 传递到当前脚本的变量数组 有一点很重要的事情值得注
  • 【CocosCreator入门】CocosCreator组件

    Cocos Creator是一款流行的游戏开发引擎 具有丰富的组件和工具 其中TiledMap组件可以帮助开发者快速创建 加载和渲染地图 目录 一 组件介绍 二 组件属性 三 脚本控制 3 1加载地图 3 2渲染地图 四 详细说明 五 关闭
  • Mac下Android源码(AOSP)编译环境搭建方法

    一 编译源码的背景环境 Android源码编译有什么困难 AOSP 非常庞大 需要下载 但是他是Google家的 和大陆开发者之间隔着一个GFW 官方文档 推荐使用Ubuntu 14 04进行编译 我用的是MacOS 官网也给了Mac下的编