mac系统android编译源码

Posted by Suzeyu on 2016-07-12

= =!! 太痛苦, 放弃保智商….

操作环境

  • mac系统: OS X EI Captian 10.11.5
  • 下载源码: Android 6.0.1

结果: mac环境配置环境, 虚拟机可以启动, 真机使用构建的镜像没有试验. 源码导入ok,调试没做.

首先丢出链接: Google官方源码构建教程
(自备梯子).

我就直接记录我的操作步骤,不说明原因,因为我也不会!

step_1

首先mac文件系统模式是不区分大小写, 但是git托管不是. 所以创建一个大小写敏感的磁盘镜像

$ sudo hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 80g ~/android.dmg

tip: 这里推荐80g的大小, 首先源码就40多G, 编译之后72G(如果只想看看源码那就50G够了,但是如果想调试,刷机,模拟步骤最好80G,有人说如果可以删除AOSP根目录下的.repo文件夹,可以省出27G,至于有没有影响请自行测试).

step_2

把刚刚创建的镜像挂起. 可以直接在~/根目录下双击刚刚创建的android.dmg.sparseimage,也可以如下

$ sudo hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android

step_3

设置文件的限制.官网提示设置。Mac 系统下默认只能同时打开 1024 个文件,而在进行 Android 源码编译时有可能会超出这个限制,因此需要解除这个限制。在~/.bash_profile中添加以下内容:

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

step_4

安装必须的关联工具

  • Xcode 点我下载有的帖子说Xcode版本不能太高, 但博主这里没有出现问题.
  • MacPorts 点我下载主要安装make , git 和 GPG

    $ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

step_5

安装repo, 因为android源码托管就是在git利用repo来辅助管理的

# 这两个命令是创建一个bin目录,并把这个bin目录加到全局变量里面
$ mkdir ~/bin
$ PATH=~/bin:$PATH
# 这里下载repo 并改变其权限方便后面调用
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

step_6

把我们的下载的源码包放入到最开始创建的磁盘镜像中.

我的下载步骤是这样的.利用国内的镜像下载,下一个大的初识包25G左右,感觉比较省事,开始步骤说明

  1. 进入到~/bin文件夹中打开repo文件 修改开始的https://android.googlesource.com/使用 https://aosp.tuna.tsinghua.edu.cn/代替.
  2. cd到创建的磁盘镜像中

    wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
    # 说明: 如果掉网了没关系 加上-c支持断点续传 如下
    wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
    # 下载完毕之后开始解压.命令如下
    $ tar xf aosp-latest.tar
    $ cd AOSP # 解压得到的 AOSP 工程目录
    # 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录. 命令如下
    $repo sync # 正常同步一遍即可得到完整目录

step_7

这时候源码都有了, 准备编译

这里需要注意如果你是zsh那么你需要切换之前的bash终端

$ chsh -s /bin/bash #切换终端模式

然后可以重新打开终端进入原来的路径继续下面的步骤

$ source build/envsetup.sh
$ lunch aosp_arm-eng #aosp_xxx xxx为各个版本的各种适用场景,官网有说明
$ make -j4 #j后面的数据是线程的处理数, 看你的电脑是几核的,对应1到2倍

这个过程有2个小时吧. 有过一次错误.

ninja: build stopped: subcommand failed.make: *** [ninja_wrapper] Error 1 解决方案

AOSP/prebuilts/sdk/tools中的jack-admin文件start-server)函数下面(443行)

isServerRunning
RUNNING=$?
if [ "$RUNNING" = 0 ]; then
echo "Server is already running"
else
#JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME" #原有的隐藏
JACK_SERVER_COMMAND="java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS-Xmx2048M -cp $LAUNCHER_JAR $LAUNCHER_NAME" #新增的
echo "Launching Jack server" $JACK_SERVER_COMMAND

参考地址: 点我

step_8

开始运行了

这里我只是运行了模拟器,起来了.真机因为没有nexus5或者6的机器我就没有去试.

运行模拟器

$ emulator

稍等一会吧,有个五到十分钟,不知道是不是我之前生成的镜像是arm模式的原因..

如果是刷机的话

如果有真机并且连接到了电脑,准备刷机的话,输入以下命令:

$ adb reboot bootloader

进入刷机模式后,输入下面的指令:

$ fastboot -w flashall

我走了上面的第一步报了一个

build/core/config.mk:608: *** 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.

解决方案: $ export ANDROID_JAVA_HOME=$(/usr/libexec/java_home -v 1.7) 参考链接

step_9

最后就是导入源码了

$ mmm development/tools/idegen/
$ development/tools/idegen/idegen.sh

上面第一条命令是按模块编译我们只需要编译idegen模块即可,不需要整个android的. 如果这条提示common not found 那么重新执行一遍$ source build/envsetup.sh 再执行 mmm的命令

第二条就是生成我们as的需要的工程配置文件在AOSP的根目录下会生成android.ipr和android.iml. 我们在之后as中通过Fileopen打开android.ipr就行.

注意哦, index导入的时间很长,你可以干点别的去.

源码调试没有搞. 可以参考以下链接

  1. 自己动手调试源码
  2. 参考流程