Macbook Pro下载并编译Android源码并导入Android Studio

最近尝试下载并编译Android的源码,过程比较曲折,所以特别的记录一下。
环境
mac系统:OS X EI Captian 10.11.6
Android源码:Android 7.0
JDK: jdk 1.8.0_77
下载源码
step1:因为我的mac硬盘空间比较小,所以我直接在移动硬盘上操作的,如果mac的空间够大也可以在内置硬盘操作。由于mac文件系统模式默认是不区分大小写的,但是AOSP托管在git上是区分大小写的,所以这里我们需要创建一个镜像。具体操作如下:
方法一:使用命令行(AOSP目前比较大,建议至少预留80G+的空间):

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

生成镜像的位置是可以自己定义的,我这里是放在了移动硬盘中。如果需要更大的磁盘空间,可以用下面的命令行来改变磁盘镜像的大小:

1hdiutil resize -size <new-size-you-want>g /Volumes/aosp/android.dmg 2

方法二:使用mac自带的磁盘工具,选择New Image,分配至少80G大小的空间;保证选择格式为OSX 扩展**(区分大小写,日志式)**的卷。一定要选区分大小写,日志式
这时在/Volumes/aosp/下会生成一个android.dmg的镜像,双击这个镜像,将其挂载。这样在mac Finder中就可以看到我们刚刚的创建的镜像了。

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

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

Step3 安装repo及同步AOSP源码

1mkdir ~/bin 2PATH=~/bin:$PATH 3curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 4chmod a+x ~/bin/repo 5

由于众所周知的原因,我们如果直接使用官方下载会非常的困难,那么我们可以考虑使用国内的源,比较好用的就是清华镜像。按照清华源的步骤去同步就可以了:

1cd /Volumes/aosp/ #将当前路径切换到刚刚挂载的的镜像中 2wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包 3tar xf aosp-latest.tar 4cd AOSP 5repo sync # 正常同步一遍即可得到完整目录 6

如果repo没有配置环境变量,那么需要把repo的绝对路径加上,例如刚刚把repo下载到~/bin下了,那么在同步时应该是~/bin/repo sync。安静的等待源码下载同步完成。

编译源码
step1 在源码的当前路径下:

1$ source build/envsetup.sh 2

如果不出意外会得到以下结果:

step2:接下来就是根据设备选择target
我这里选择的是5 aosp_x86-eng。每个选项对应的device可以在这里查看 如果打不开,我截了张图,大家可以根据自己的情况选择
选择好target后就可以直接进行编译了
不过在这之前你可能还需要下载驱动(如果只是想查看源码也可以忽略该步)
将下载下来的文件解压到源码的根目录会得到三个.sh的文件,依次运行三个文件,例如:

1$ ./extract-broadcom-hammerhead.sh 2 3The license for this software will now be displayed. 4You must agree to this license before using this software. 5 6Press Enter to view the licensels 7

回车后查看license,翻到license最后,输入I ACCEPT后回车,这时会将驱动文件释放到vendor目录。

step3:

1$ make -j8 2

使用make构建,该命令可以通过使用-jN参数来处理并行任务。此处的N,根据所用的计算机的硬件的核数来指定,一般N指定为CPU核心的1到2倍。接下来就是漫长的编译过程,具体编译时长得看机器的情况了。并且有可能出现各种问题,这个时候不要着急,可以根据错误日志搜索,一般都能找到解决办法。解决之后,在接着运行上边的make 命令就好,会继续在你中断的地方开始编译。
最后如果出现:

1make completed successfully 2

那么恭喜你,编译成功了,因为我这里选择的是模拟器的,所以可以通过

1$ emulator 2

直接启动,刚刚编译的系统。(如果没有下载驱动,可能会卡在启动页面。)

导入Android Studio
在编译玩Android源码后,我们继续编译生成Android studio工程:

1soruce build/envsetup.sh 2mmm development/tools/idegen/ 3sudo ./development/tools/idegen/idegen.sh 4

其中mmm development/tools/idegen/执行完成后会生成idegen.jar,而sudo ./development/tools/idegen/idegen.sh则会在源码目录下生成IEDA工程配置文件:android.ipr,android.iml及android.iws.这三个文件
android.ipr:通常是保存工程相关的设置,比如编译器配置,入口,相关的库等
android.iml:则是主要是描述了modules,比如modules的路径,依赖关系等.
android.iws:则主要是包含了一些个人工作区的设置.

接下来,打开Android Studio,点击File->Open,选择刚才生成的android.ipr文件即可,然后就是漫长的等待,注意此时是将源码完全导入到AS中了,不出意外,你会觉得AS运行会卡顿。还需要我们忽略掉一些不经常使用的包。
在Android Studio导入成功之后,项目结构如下:
红色的表示已经被忽略了,没有导入,那么也可以通过以下方法来对指定的包进行修改是否导入:
也可以直接在project Structure中进行修改:

在修改完后,我们可以在android.iml可以看到,我们忽略导入了那些包:

如果熟悉了包的结构,就可以直接在该文件中,完成忽略导入的操作,是最快捷的方式。

这样我们就可以使用Android Studio阅读源码了,在源码阅读过程中可能会出现跳转到SDK对应的方法中的问题,这个时候,需要先配置一下SDK,然后修改项目依赖就可以了。到这儿,就可以越快的撸源码了。Good Luck

代码交流 2021