Android 6.0 源代码编译实践

前阵子去上海参加 Android 开发面试,被问及了 Android 的基本原理、常用组件背后的实现机制、设计模式等问题,我都回答地不好。面试时,老司机们常常问我对知识点“背后的实现代码有没有看?”。于是我就想着,回来要把 Android 代码下下来,有针对性地学习。 

本文记述了我从下载源代码到编译成功、导入 Android Studio 的过程。我所使用的系统为 Mac OSX, Android 代码的分支是 android-6.0.0_r26。 

代码的下载  
Android 的代码我是、从AOSP - 清华大学TUNA 镜像源这个国内的镜像下载。下载代码的具体方法在官方文档 Downloading the Source  和  AOSP - 清华大学TUNA 镜像源  中都有记述,我就不再赘述。我选择下载的分支是 android-6.0.0_r26。 

由于代码比较大,我使用我的下载机( Linux 系统)进行下载,待下载完成后导入 Mac OSX 进行后续操作。如何实现导入呢? 

将代码文件夹拷贝到 ntfs 分区的移动硬盘失败。这是因为 ntfs 分区部分大小写,而代码目录中存在字母相同、大小写不同的文件,因此导入失败。(这一问题在后面 Mac OSX 中还会遇到。) 

随后我对代码文件夹进行了压缩。压缩之后就能够随意拷贝了。在这里我推荐一种拷贝方式,就是直接用网线将两台机器相连对拷代码压缩包。这样速度非常快,也省得移动硬盘中转浪费时间。 

Mac OSX 下的准备  
压缩包拷过来之后,就该要解压、配置了。但是前文所说的大小写问题在这里又出现了。若将代码直接解压在 Mac 的文件系统中强硬编译将会报错。 

创建映像文件  
解决的方法是按照官方文档  Establishing a Build Environment  中的说明,建立一个区分大小写的映像文件,挂载后将代码解压进去,具体步骤不再赘述。 

有一点需要强调的是,文档中创建的映像文件大小为 40GB,这在实际中不够,我编译完代码后就已经占用 46GB 了,因此我分配了 60GB 的大小。 

JDK 版本  
JDK 必须为 1.7,没装或只装了 1.8 的要去下一个 1.7 再装上。 

mac_sdk_versions_supported 问题  
我使用的系统版本为 EI Capitan,新于代码的配置文件,因此要修改配置文件。它位于 build/core/combo/mac_version.mk,其中有一个 mac_sdk_versions_supported 变量,修改为我目前的版本 10.11。 

源代码的编译  
参考官方指南  Building the System  先用 build/envsetup.sh 设置环境变量,再调用 lunch 命令选择构建目标。之后即执行 make -jN 进行编译。我用的参数为 -j4 编译了大约两个小时: 
Java代码 
  1. Creating filesystem with parameters:  
  2.     Size: 1610612736  
  3.     Block size: 4096  
  4.     Blocks per group: 32768  
  5.     Inodes per group: 8192  
  6.     Inode size: 256  
  7.     Journal blocks: 6144  
  8.     Label: system  
  9.     Blocks: 393216  
  10.     Block groups: 12  
  11.     Reserved block group size: 95  
  12. Created filesystem with 1452/98304 inodes and 101032/393216 blocks  
  13. Install system fs image: out/target/product/generic/system.img  
  14. out/target/product/generic/system.img+ maxsize=1644333504 blocksize=2112 total=1610612736 reserve=16610880  
  15.    
  16. e[0;32m#### make completed successfully (01:56:47 (hh:mm:ss)) ####e[00m  

将代码导入 Android Studio  
代码目录中含有一个名为 idegen 的模块,它能够为 Android 代码生成 Android Studio 下的工程文件。 

具体编译、使用方法可以参考这篇 使用Android Studio导入源码。大体过程是, idegen 是一个模块,要先使用 mmm 编译一下,之后在 idegen 的文件目录下有一个脚本,在代码根目录下执行这个脚本,它就会遍历代码目录生成工程文件,很方便。另外,这篇博客中还讲解了如何裁剪 android.iml,排除掉不需要加载到 Android Studio 到代码,有助于加快载入速度。 

完成后,用 Android Studio 就像打开普通的工程一样,打开这个工程,经历一番加载与 indexing, Android 的代码就导入进来了。最后附上一张截图: 

Android 6.0 源代码编译实践_第1张图片 

参考文献  
在实践过程中,我还参考了一下文章。感谢这些兄弟分享的经验。 
  • 如何阅读 Android 系统源码-收藏必备
  • Android拓展系列(10)--使用Android Studio阅读整个Android源码
  • Mac 10.10 编译android 4.4.4 for nexus


本文转自:JudyMaxiee's Blog

你可能感兴趣的:(Android 6.0 源代码编译实践)