本文转载自:http://wl9739.github.io/2016/05/09/Android%E6%BA%90%E7%A0%81%E7%9A%84%E4%B8%8B%E8%BD%BD%E3%80%81%E7%BC%96%E8%AF%91%E4%B8%8E%E5%AF%BC%E5%85%A5%E5%88%B0Android-Studio/

如果只是为了看Android源码的话,有一个很方便的方法,用Android studio打开一个项目,双击shift,然后输入你想查看的类名,比如ListView,再敲一下回车,就OK了。那么,为什么要大费周章地下载源码然后编译导入呢?因为

生命不息,折腾不止

哈哈,开个玩笑。

首先要注意一点,Android源码只能在Linux和Mac OS系统上进行编译,如果你使用的是Windows系统,可以在Linux虚拟机中进行编译。

如果你使用的是Mac OS,那么可以参考官网的这一篇文章来进行环境配置:Setting up a Mac OS build environment

如果是用的Linux系统,则可以参考这里:Setting up a Linux build environment

由于我使用的是Mac OS系统,所以下面所有的方法适合于Mac。

下载Android源码

创建一块大小写敏感的磁盘分区

由于Mac OS默认的是大小写不敏感的文件系统,而一些git的命令(比如git status)在这种系统中会有一些行为异常。所以我们要创建一个大小写敏感的分区,在Mac下,分区有两种方式:

可以使用Mac自带的磁盘工具进行分区,注意选择的格式是:OS X扩展(区分大小写,日志式),建议大小为80G(下载源码需要36G,编译完后一共占用75G)。

官方推荐的做法是使用命令行:

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

该命令会创建一个后缀为.dmg.dmg.sparseimage的文件。

如果在下载编译过程中需要将分区扩容,可以使用如下命令:

1
$ hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

安装jdk。

按照Software requirements的要求,jdk版本必须为jdk-7u71-macosx-x64,如果电脑里面安装的是jdk8,则需重新下载安装。

为了方便,我在~/.bash_profile文件中做了配置,方便jdk版本切换

1
2
3
export JAVA_7_PATH=/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home
export JAVA_8_PATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home
export JAVA_HOME=$JAVA_7_PATTH

安装其他软件

然后需要下载MacPorts,安装完成之后调用下面的命令来下载安装其他需要的软件:

1
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

如果这里报错了,说找不到port命令,就需要在~/.bash_profile中添加一行:export PATH=/opt/local/bin:$PATH

当然,还需要安装Xcode。官网上要求Mac OS系统中需要使用的Xcode的版本很低,但实际证明,我电脑上使用的新版Xcode同样可以正常运行。

设置文件描述符限制

在Mac OS中,默认限制的同时打开的文件数量很少,不能满足编译过程中的高并发需要,因此,在~/.bash_profile中添加下面的命令:

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

编译源码

下载Repo

下载Repo之前,需要创建一个bin文件,并且将路径写入到path中:

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

然后在命令行中输入下面的命令,下载Repo,并且修改属性:

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

可以将Repo中的下载地址改为清华大学tuna镜像源,这样就不用挂着VPN下载了。编辑Repo,修改REPO_URL后的地址:

1
REPO_URL = 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo'

下载源码

现在,进入到我们创建的额分区,创建一个文件夹作为源码的根文件,进入根目录后,调用下面的方法,执行repo init:

1
$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r17

完成之后,调用下面的命令来下载源码:

1
$ repo sync

由于下载源码的时间太长,中途可能会出现链接断开的情况,虽然repo同步是支持断点续传,但是不知道什么时候会断开,这一点很麻烦,所以可以写一个shell脚本来开启同步:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#FileName get_android.sh
PATH=~/bin:$PATH
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r17
repo sync
while [ $? = 1 ]; do
echo "================sync failed, re-sync again ====="
sleep 3
repo sync
done

将上面的代码保存成get_android.sh,放在下载的源码的根目录下,输入下面的指令开始下载:

1
$ ./get_android.sh

完成后可以删除.repo/文件:

1
$ rm -rf .repo/

编译源码

兼容处理

如果你和我一样,使用的是Mac OS 的EI Capitan系统,在编译之前,需要做一些兼容性处理。

打开build/core/combo/mac_version.mk文件,在mac_sdk_versions_supported变量后添加版本号10.11:

1
mac_sdk_versions_supported := 10.6 10.7 10.8 10.9 10.11

然后在源码根目录下调用下面的命令:

1
$ source build/envsetup.sh

或者为了少输入几个字母,你也可以用下面的命令代替:

1
$ . build/envsetup.sh

选择设备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ $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. aosp_deb-userdebug
8. aosp_flo-userdebug
9. full_fugu-userdebug
10. aosp_fugu-userdebug
11. mini_emulator_arm64-userdebug
12. m_e_arm-userdebug
13. mini_emulator_mips-userdebug
14. mini_emulator_x86-userdebug
15. mini_emulator_x86_64-userdebug
16. aosp_flounder-userdebug
17. aosp_angler-userdebug
18. aosp_bullhead-userdebug
19. aosp_hammerhead-userdebug
20. aosp_hammerhead_fp-userdebug
21. aosp_shamu-userdebug

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

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

然后选择需要的类型,比如5。

安装驱动

这里下载所需的驱动,下载完后解压,会发现三个.sh文件,依次执行。如果不安装驱动的话,机器(真机和模拟器)运行时只能停留在启动界面。

编译

使用下面的命令开始编译源码:

1
$ make -j16

参数-jN中的数字N,根据你电脑的线程数量的1~2倍来设置,比如我的电脑是双核CPU,每个CPU为双核心四线程,那么就有8个线程。所以我配置的数量为16。

编译过程中可能会失败,不过不用担心,再次编译的时候会接着编译,而不会从头开始编译。

运行

刷机

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

1
$ adb reboot bootloader

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

1
$ fastboot -w flashall

运行模拟器

运行模拟器很简单,输入下面的命令即可:

1
$ emulator

导入到Android Studio

在导入到Android Studio之前,还需要进行一些处理。首先是要编译idegen模块,使用如下命令:

1
$ mmm development/tools/idegen/

m、mm、mmm命令可以让你只编译单独模块,而不用费大量的时间比编译整个Android系统。

如果你的shell和我一样使用的是zsh,而不是bash,使用mmm就会得到错误信息。因为oh-my-zsh是不支持mmm的,具体可以参见:Android source code build commend “mm or mmm” couldn’t use in oh-my-zsh,因此,这里只能切换回bash,切换回bash的命令是chsh -s /bin/bash

当然如果你和我一样得到了错误信息-bash: mmm: command not found,那么就需要在源码目录下执行如下指令(点与build之间是有空格的):. build/envsetup.sh

然后在根目录生成对应的android.ipr、android.iml IDEA工程配置文件。使用以下脚本:

1
$ development/tools/idegen/idegen.sh

大概半分钟后(视你的电脑配置决定),会在源码根目录下生成android.iprandroid.iml

使用Android studio打开任意一个项目,然后选择File->Open,打开根目录下的android.ipr文件夹,然后等待漫长的index完成后,就可以方便查看源码了。

Android源码的下载、编译与导入到Android Studio【转】的更多相关文章

  1. Android源码的下载和编译

    由于公司会安排我做硬解码这块,所以最近一直想研究一下Android源码,可是Android源码的下载真的挺麻烦的(可能是我第一次下载),参照网上的方法,没有一个可行的,现在就将我的下载过程和大家分享一 ...

  2. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  3. Android源码批量下载及导入到Eclipse

    1.去http://code.google.com/p/msysgit/downloads/list  下载Git,进行安装 2.生成批量下载脚本文件  下载批量工具CreatAutoGetSh(工具 ...

  4. Spring源码研究--下载-编译-导入eclipse-验证

    一,环境配置 操作系统:Unbutu14.04LTS JDK: 1.8.0_40 git: 1.9.1 gradle: 2.2.1 二,源码下载-编译-导入eclipse-验证 1,下载 使用git直 ...

  5. 安装ubuntu16虚拟机,下载android源码,配置编译环境

    Android 源码编译步骤: 我考虑了一下,目前电脑装了SSD,8G内存,使用虚拟机编译源码应该够用. 首先下载虚拟机软件,由于最近一直在使用virtualbox,感觉蛮不错了,下载地址: http ...

  6. Android源码、内核编译

    Android源码和内核的编译就是一场马拉松,每一个节点都耗时漫长,下载源码.编译源码.下载内核.编译内核,下载中途会断掉,编译中间会失败,求解再重来,又是一轮马拉松,于是每一步都要做好备份和记录,可 ...

  7. ubuntu下android源码的下载(最新)

    在ubuntu下下载android源码我断断续续搞了好几个月,希望大家不要向我学习啊!一次性搞定! 这里给大家一些建议啊,如果是看书的话看下书的出版日期,超过一年的基本上失效,网上的也是,特别是在国内 ...

  8. 4418开发板Android源码整体&单独编译

    内核缺省文件配置之后,Android 目录,运行一键编译脚本“build_android.sh”,如下图所示.注意:本篇文章基于iTOP-4418开发板,编译 Android 必须保证给 Ubuntu ...

  9. Android源码分析(九)-----如何修改Android系统默认时间

    一 : 修改Android系统默认时间 源码路径:frameworks/base/services/java/com/android/server/SystemServer.java 主要变量EARL ...

随机推荐

  1. 笔试算法题(28):删除乱序链表中的重复项 & 找出已经排好序的两个数组中的相同项

    出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序: 分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字 ...

  2. 零基础入门学习Python(15)--格式化

    前言 上节课我们介绍了字符串N多种奇葩方法的用法,但是我们唯独漏掉了format方法,那为何不把format方法和上节课的内容一起讲呢? 因为小甲鱼觉得format方法,跟今天的主题是如出一辙的,都是 ...

  3. 性能测试培训day1

    测试本质: 1构造测试数据和期望结果 2执行 3验证 自动化测试: 写完代码,单元测试测代码逻辑,单元测试搞清楚代码逻辑就行了(白盒测试)先静态,运行前用工具扫描BUG例如(a==11写成a=11), ...

  4. 常见算法的python实现

    提到排序算法,常见的有如下几种:冒泡排序.选择排序.插入排序.快速排序.堆排序.归并排序.希尔排序:查找算法最常见二分查找.这些算法的时间复杂度如下: 算法名称 时间复杂度(一般情况) 冒泡排序 O( ...

  5. 基本dos

    文件夹的操作:   进入指定盘符:盘符名+:     dir:列出当前控制台下的所有文件以及文件夹  . cd +文件夹名称:进入指定文件夹     cd.. 返回上一级 cd \返回到当前目录的根目 ...

  6. Windows学习总结(11)——Windows批处理命令编写代码及小程序简介

    批处理(Batch)也称为批处理脚本.顾名思义,就是对某对象进行批量的处理.DOS批处理是基于DOS命令,用来自动地批量地执行DOS命令以实现特定操作的脚本.批处理是一种简化的脚本语言,它应用于DOS ...

  7. Web页面测试总结(控件类)

    界面测试,最多的就是各种控件的功能测试,只有掌握了其测试要点,了解测试方法,总结各种测试情景,才能熟练测试Web页面. 一.输入框 输入框分为文本输入框,数字输入框.一般使用在填写输入的内容上,比如名 ...

  8. xtu summer individual 3 F - Opening Portals

    Opening Portals Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...

  9. [POJ2774][codevs3160]Long Long Message

    [POJ2774][codevs3160]Long Long Message 试题描述 The little cat is majoring in physics in the capital of ...

  10. 建造高塔(codevs 1689)

    题目描述 Description n有n种石块,石块能无限供应.每种石块都是长方体,其中第i种石块的长.宽.高分别为li.wi.hi.石块可以旋转,使得其中两维成为长度和宽度,第三维成为高度.如果要把 ...