@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

http://blog.bihe0832.com/macOS-AOSP.html


背景

背景简介

最近因为项目需要,要研究Android系统中应用安装的详细过程。在这种场景下,最好的办法就是Read the Fucking Source Code。之前都是在线看,这次因为看的内容比较多,而且看的比较细,因此打算在本地checkout一份。这篇文章就主要记录本人使用macOS(Sierra 10.12.1)在本地checkout出AOSP(7.1.1)并编译导入Android Studio的完整过程

参考内容

关于如果checkout源码,其实网上已经有很详细的内容,个人在checkout的过程中主要参考了以下内容,也可直接按照他们的建议尝试:

checkout时推荐使用清华大学的镜像,checkout过程中有交替切换测试,发现清华大学的镜像会比VPN的效果相对好一点(也可能是个人的VPN不够快)。

系统环境

在完成下面的准备工作相关的内容以后,本机的系统环境如下

  • macOS Sierra 10.12.1
  • JDK 1.8.0_77
  • Xcode 8.2.1
  • 本地源码地址:/Volumes/Document/android (对应分区存储空间450G)
  • shell:bash

准备工作

创建分区

由于macOS默认的文件系统是大小写不敏感的,如果不做处理,编译过程会引起下面的异常

Checking build tools versions...
build/core/main.mk:159: ************************************************************
build/core/main.mk:160: You are building on a case-insensitive filesystem.
build/core/main.mk:161: Please move your source tree to a case-sensitive filesystem.
build/core/main.mk:162: ************************************************************
build/core/main.mk:163: *** Case-insensitive filesystems not supported.
make: *** [out/build-aosp_arm.ninja] Error 1

为了避免该异常,我们要首先在macOS里面创建一个支持大小写敏感的文件系统。具体的方法可以参考下面两篇文章:

本人选择checkout的源码是android-7.1.1_r6,下载完占用空间22.12 GB,编译完占用空间 67.4G,因此建议分区的时候,Android源码至少使用 80G

创建目录

在新的分区磁盘创建你放保存源码的目录,例如我直接放在新建分区(Document)根目录的android文件夹。

$ mkdir /Volumes/Document/android

然后进入对应目录继续开始接下来的工作

$ cd /Volumes/Document/android

切换shell

由于Android的相关编译只能是使用bash,因此如果是使用zsh等其余的shell,请先切换shell到bash。切换方法

  • 用如下命令切换shell:

      $ chsh -s /bin/bash

  • 重启终端。只有重启终端shell切换才会生效。可以使用下面的命令检查当前的shell:

      $ echo $0
    -bash

安装软件

下面的软件是在编译源码过程中需要使用到的软件,建议提前下载好。最好是按照下面的顺序来下载,部分软件间有一定的依赖关系。

Xcode

MacOSX-SDK

  • 使用场景:在编译源码是使用,macOS10.12.SDK弃用了编译源码需要的syscall,因此需要单独下载更早版本的macOS的SDK
  • 下载地址:https://github.com/phracker/MacOSX-SDKs
  • 暂时下载准备好即可,会在后文中具体介绍怎么使用。另外由于整个github项目也不大,可以直接全部下载下来,这样比较方便。

JDK

MacPorts

其他软件

  • 使用场景:用来下载其余编译源码需要的软件,可以使用MacPorts来安装
  • 安装方法:在MacPorts安装好以后运行下面的命令即可安装gmake等编译工具

      $ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

  • 备注:
    1. 如果这里报错port: command not found,说找不到port命令,就需要在命令行运行下面的命令:

       $ export PATH=/opt/local/bin:$PATH

    • 如果在这里报错Port gmake not found,那就在安装之前需要先执行下面的命令。

        $ sudo port -d sync

      然后就可以再执行上面的命令安装相关的工具了

概览

在上述内容都安装完毕以后,本机的系统环境如下:

  • macOS Sierra 10.12.1
  • JDK 1.8.0_77
  • Xcode 8.2.1
  • shell:bash

下载

下载Repo

Repo is a tool that makes it easier to work with Git in the context of Android.简单理解,Repo就是一个方便你checkout Android相关源码的工具。官方、清华和中科大镜像都提供了对应的Repo的下载。

备注:下载Repo之前,官方提示需要创建一个bin文件,并且将路径写入到path中,下面是官方给出的操作步骤

$ mkdir ~/bin
$ PATH=~/bin:$PATH

我没有设置环境变量,直接跳转到上一步创建的目录下,然后在命令行中输入下面的命令,下载Repo,并且修改属性。建议直接你使用的镜像提供的Repo。本人是直接下载了官方提供的镜像。

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ./repo
$ chmod a+x ~/bin/repo

下面是官方给出的三个版本的Repo的sha。

  • For version 1.21, the SHA-1 checksum for repo is b8bd1804f432ecf1bab730949c82b93b0fc5fede

  • For version 1.22, the SHA-1 checksum for repo is da0514e484f74648a890c0467d61ca415379f791

  • For version 1.23, the SHA-1 checksum for repo is ac9d646f6d699f6822a6bc787d3e7338ae7ab6ed

初始化Repo

继续在根目录,初始化Repo,主要是设置你使用的镜像以及想要checkout的Android的版本。例如使用官方的镜像,下载android-7.1.1_r6的源码,运行下面的命令

$ repo init -u https://android.googlesource.com/platform/manifest -b  android-7.1.1_r6

如果是使用清华的镜像,运行

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r6

关于源码和tag的对应关系,可以在官网查看,Source Code Tags and Builds:https://source.android.com/source/build-numbers.html#source-code-tags-and-builds

下载源码

完成上面的初始化任务以后,就可以开始调用下面的命令来下载源码,repo同步是支持断点续传。因此如果下载过程中终端以后,继续执行下面的命令就可以接着下载,并不会从头开始:

$ repo sync -j4

命令最后的j4的意思是同时发起四个并发请求,之所以选择4是因为清华的镜像的并发请求的限制的上限就是4个。

由于下载时间太长,中途可能会出现链接断开的情况,尤其是很多人会选择半夜下载,如果链接断开了没能继续就白白浪费了一个晚上,湫水长天的博客里面提供了一个自己写的简单的shell脚本可以参考,本人略做了修改。

#!/bin/bash
repo sync -j4
while [ $? = 1 ]; do
echo "================sync failed, re-sync again ====="
sleep 3
repo sync
done

将上面的代码保存成repo_sync.sh,放在下载源码的根目录,例如我的/Volumes/Document/android,然后在命令行运行

/bin/bash ./get_android.sh

源码的下载时间会非常长,因此建议选择晚上下载。由于macOS默认的节能设置,为了防止mac在长时间无操作以后休眠,因此建议修改macOS中关于节能相关的配置。修改路径为:系统偏好设置-》节能。下图为本人修改后的效果:

编译

当源码全部下载完成以后,就进入了源码编译环节。

编译前准备

切换shell

在准备工作中已经提醒,为防止有人遗忘,再次提示一次。由于Android的相关编译只能是使用bash,因此如果是使用zsh等其余的shell,请先切换shell到bash。切换方法:

  • 用如下命令切换shell:

      $ chsh -s /bin/bash

  • 重启终端。只有重启终端shell切换才会生效。

设置文件描述符限制

在macOS中,默认限制的同时打开的文件数量很少,不能满足编译过程中的高并发需要,因此需要在shell中运行命令:

$ ulimit -S -n 1024

编译源码

环境设置

在源码根目录(/Volumes/Document/android)下调用下面的命令:

$ source build/envsetup.sh

选择设备

在命令行输入下面的命令选择打算编译的源码类型

$ 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. aosp_shamu-userdebug
Which would you like? [aosp_arm-eng]

根据后缀可以判断出使用的场景如下:

类型 用途
user 权限少,用于刷机使用
userdebug 和“user”类似,但可以root,并且可以调试
eng 具有开发配置,并且有额外的调试工具

根据需要选择对应的类型,比如我选择 “1”

Which would you like? [aosp_arm-eng] 1
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=7.1.1
TARGET_PRODUCT=aosp_arm
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-16.1.0-x86_64-i386-64bit
HOST_CROSS_OS=
HOST_CROSS_ARCH=
HOST_CROSS_2ND_ARCH=
HOST_BUILD_TYPE=release
BUILD_ID=NMF26Q
OUT_DIR=out
============================================

开始编译

为了加快编译的速度,我们最好并发来编译,首先查看下本机CPU的内核数与线程数:

$ sysctl machdep.cpu
machdep.cpu.tsc_ccc.denominator: 0
machdep.cpu.tsc_ccc.numerator: 0
machdep.cpu.thread_count: 8
machdep.cpu.core_count: 4

可以看到线程数为8,因此我们执行下面的命令开始源码相关的编译

$ make -j16

参数-jN中的数字N,即为根据电脑线程数量设置的并发值,一般为线程数的1~2倍。之后就会开启漫长的一到两个小时的编译过程。编译过程可能出错,出错以后继续运行命令编辑即可。

编译结束以后,会显示下面的日志

#### make completed successfully (01:28:02 (hh:mm:ss)) ####

编译异常解决

在启动编译的过程中,比较常见的遇到的问题主要有:

  • 文件分区不支持大小写

    • 错误现象

        Checking build tools versions...
      build/core/main.mk:159: ************************************************************
      build/core/main.mk:160: You are building on a case-insensitive filesystem.
      build/core/main.mk:161: Please move your source tree to a case-sensitive filesystem.
      build/core/main.mk:162: ************************************************************
      build/core/main.mk:163: *** Case-insensitive filesystems not supported.
      make: *** [out/build-aosp_arm.ninja] Error 1

    • 解决方案

      查看文章最开始准备工作中关于macOS分区配置的说明

  • could not find jdk tools.jar

    • 错误现象

        $ make -j16
      build/core/config.mk:600: *** Error: could not find jdk tools.jar at /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/../lib/tools.jar, please check if your JDK was installed correctly. Stop.

    • 解决方案

      主要是因为环境变量没有设置ANDROID_JAVA_HOME 导致的,添加对应的环境变量即可,输入下面的命令:

        export ANDROID_JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

  • ‘syscall’ is deprecated:

    • 错误现象:

      编译过程中直接报错,看编译报类似下文的错误:

        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);

    • 解决方案

      这是因为最新的macOS的调整引起的,个人下载的最新版的源码也没有解决这个问题,最终采用的方法是使用更早版本的macOS的SDK,下载地址参考前面准备工作中的说明。解压(也会用时比较久)zip包以后将MacOSX10.11.sdk拷贝到/Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs。为了避免下次升级的时候再被删除,建议拷贝到自定义目录,然后建立软链接。例如我放在~/lib目录下,再给它创建一个软链接:

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

    • 参考博客:解决macOSX10.12.SDK下编译Android Open Source Project出错的问题:http://palanceli.com/2016/09/25/2016/0925AOSPOnMac/

  • Jack server installation not found:

    • 错误现象:

        FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar  2>&1 || (exit 0) ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE || exit 47; prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA || exit 47 )"
      Unsupported curl, please use a curl not based on SecureTransport
      Jack server installation not found
      Unsupported curl, please use a curl not based on SecureTransport
      Unsupported curl, please use a curl not based on SecureTransport
      ……
      make: *** [ninja_wrapper] Error 1

    • 解决方案

      这是因为Jack需要基于OpenSSL的CURL,系统默认的并不是,因此选择用Homebrew重新安装一个。在命令行敲命令:

        $ brew install curl --with-openssl 

      安装好以后执行下面的命令修改环境变量,覆盖系统自带版本:

        $ export PATH=$(brew --prefix curl)/bin:$PATH

导入

至此源码已经编译OK,为了方便导入到Android Studio,我们还需要做一些准备工作。具体如下:

生成IDEA工程配置文件

首先是要编译idegen模块,在shell中执行如下命令:

$ mmm development/tools/idegen/

如果在编译时得到了类似下面的错误信息

-bash: mmm: command not found

只需要在源码目录下执行下面的明明后重试即可

$ source build/envsetup.sh

在编译结束以后会有下面的提示:

#### make completed successfully (46 seconds) ####

此时继续运行下面的命令生成对应的android.iprandroid.iml IDEA工程配置文件

$ development/tools/idegen/idegen.sh
Read excludes: 17ms
Traversed tree: 218013ms

17s以后就完成了编译,在源码根目录下生成android.iprandroid.iml

导入源码

启动Android Studio,然后选择打开一个已存在的Android Studio工程,选择源码根目录的android.ipr,经过漫长(我首次导入用了20分钟)的加载过程以后,Android 源码就已经成功的加载到了Android Studio中。

OK,至此我们就完成了在macOS(Sierra 10.12.1)上checkout出AOSP(7.1.1)并编译导入Android Studio的完整过程。

其他

  1. 整个过程会非常长,耗时耗力,而且上面所有步骤间有互相依赖,建议严格按照顺序执行。
  2. 个人在第一次分区时忘记修改文件系统为大小写敏感,重新分区时选择把下载的内容拷贝出去,重新分区,拷贝回来的方法,结果在编译时各种报错,最后选择删除根目录下除repo、get_android.sh、.repo以外的其余所有文件后重新运行repo init 和repo sync后重新checkout,再次编译就没有任何异常。因此一定记得要建立正确的文件分区并选择正确的文件系统类型。
  3. 下载编译的时间都会很久,建议选择晚上进行。

macOS(Sierra 10.12)上Android源码(AOSP)的下载、编译与导入到Android Studio的更多相关文章

  1. 【转】如何在VMware上安装macOS Sierra 10.12

    本文主要介绍目前网络上比较流行的使用预安装镜像安装macOS 10.12的方法,并以9月20号发布的最新GM版本16A323为例. 安装方案 破解VMware 创建虚拟机,加载预安装镜像 初始化mac ...

  2. macOS Sierra(10.12.6), odoo(11.0), Python(3.5.4)配置

    欣闻odoo11支持python3环境了,赶紧在mac平台尝试一下: 前期设置,参考另篇文章:macOS Sierra 10.12.6 odoo 10.0 开发环境配置 因为odoo11尚未正式发布, ...

  3. macOS Sierra 10.12.6 odoo 10.0 开发环境配置

    参考了网上的一些教程,将最终过程记录一下,其中需要的一些程序,我已经放到百度网盘: https://pan.baidu.com/s/1boKHSTL 1.抹盘安装macOS Sierra 10.12. ...

  4. 黑苹果macOS Sierra 10.12 安装教程(venue11 pro测试)

    黑苹果macOS Sierra 10.12 安装教程(venue11 pro测试) 2017-03-12 03:46:24 by SemiconductorKING PS:刚刚装好黑苹果,来记录一篇折 ...

  5. 【Ruby】【环境搭建】macOS Sierra 10.12.6 + Xcode 8 + gpg 2.2.8 + rvm 1.29.3 + Ruby 2.4.0 + RubyMine 2018.1.4

      按出场顺序: macOS Sierra 10.12.6  +  Xcode 8 + gpg 2.2.8 + rvm 1.29.3 +  Ruby 2.4.0 + RubyMine 2018.1.4 ...

  6. macOS Sierra 10.12.4 (16E195) - Clover [ 20170403 ]

    原文:https://user.qzone.qq.com/753313822/blog/1424460141?_t_=0.48652242555134495 建议使用 1920 * 1080 屏幕分辨 ...

  7. 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)

    原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...

  8. Atitit.反编译apk android源码以及防止反编译apk

    Atitit.反编译apk android源码以及防止反编译apk 1.1. Tool  apk逆向助手1 1.2. 二.使用dex2jar + jd-gui 得到apk的java源码1 1.3. 用 ...

  9. 在macOS Sierra 10.12搭建PHP开发环境

    macOS Sierra 11.12 已经帮我们预装了 Ruby.PHP(5.6).Perl.Python 等常用的脚本语言,以及 Apache HTTP 服务器.由于 nginx 既能作为 HTTP ...

  10. APK 的前世今生:从 Android 源码到 apk 的编译打包流程

    最近想要研究热修复的原理,并自己实现一套简单的热修复框架(音视频的坑刚挖好就又挖另一个坑了2333),已经在看书入门 c++,方便后续查看业内一些知名热修复框架的源码,另外在涉及编译期/运行时修改代码 ...

随机推荐

  1. Chunky Monkey-freecodecamp算法题目

    Chunky Monkey(猴子吃香蕉, 分割数组) 要求 把一个数组arr按照指定的数组大小size分割成若干个数组块. 思路 利用size值和while语句确定切割数组的次数(定义temp将siz ...

  2. NOIP2013 乌龟棋

    描述 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点 ...

  3. PAT 乙级 1088

    题目 题目链接:PAT 乙级 1088 题解 比较简单的一道题,下面来简单说说思路: 因为甲确定是一个两位数,因此通过简单的暴力循环求解甲的值,又根据题设条件“把甲的能力值的 2 个数字调换位置就是乙 ...

  4. 【思维题】TCO14 Round 2C InverseRMQ

    全网好像就只有劼和manchery写了博客的样子……:正解可能是最大流?但是仔细特判也能过 题目描述 RMQ问题即区间最值问题是一个有趣的问题. 在这个问题中,对于一个长度为 n 的排列,query( ...

  5. C#基础-判断语句

    switch语句 Console.WriteLine("请输入月份"); string strInput = Console.ReadLine(); switch(strInput ...

  6. 装逼图片旋转合成demo

    测试背景 bg.jpg 测试图片 a.jpg 结果示例 代码demo <?php $bgImgFileName = 'bg.jpg'; $a = 'a.jpg'; // 初始化 $src = i ...

  7. poj-2488 a knight's journey(搜索题)

    Time limit1000 ms Memory limit65536 kB Background The knight is getting bored of seeing the same bla ...

  8. 搜索引擎elasticsearch常用指令演示

    目录 交互方式 常用操作示例 添加文档 删除文档 修改文档 查询 简单查询 高级多条件查询 交互方式 操作ES有3种方式: kibana控制台(Dev Tools) Http + json api接口 ...

  9. luogu2153 [SDOI2009]晨跑

    要想限制流量,总要想着拆点. #include <iostream> #include <cstring> #include <cstdio> #include & ...

  10. ORACLE 分区表 相关视图

    1. 显示当前用户可访问的所有分区表信息﹕ ALL_PART_TABLES 2. 显示当前用户所有分区表的信息﹕ USER_PART_TABLES 3. 显示表分区信息 显示数据库所有分区表的详细分区 ...