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 系统源码-收藏必备
  • Android拓展系列(10)--使用Android Studio阅读整个Android源码
  • Mac 10.10 编译android 4.4.4 for nexus


本文转自:JudyMaxiee's Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 链接远程oracle,PHP连接远程oracle输出数据

远程连接的连接字符串可以这样写oledbconnection 的连接字符串:providermsdaora;host192.168.1.1;data sourcemytest;user idsystem;passwordxxxprovider msdaora; 指明oledb 的提供者是oracle数据库host 是远程 oracle 数据库所在服务器的ip地址,如果端口不是默认…

RNN介绍,较易懂

人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实含义。我们不会将所有的东西都全部丢弃,然后用空白的大脑进行思考。我们的思想拥有持久性。 传统的神经网络并…

android虚拟机鼠标左键拖动会输入C

不知道什么原因,突然出现这个情况,以为是虚拟机坏了。于是删了,新建,问题还是存在。 问题原因: 后来发现,原来是今天开了有道词典,又开启了词典的划词翻译。 解决方法: 关闭划词翻译…

php生成图片水印,PHP生成图片加文字及图案水印办法

工作中,各种语言都要会,但不是各种语言都记到脑子里,常常要查字典、查手册、以及百度对于PHP生成图片加文字及图案水印这项技巧,好久没有用,又有些生疏了,现在来温故知新,加深记忆!代…

易飞扬宣布完成100G CWDM4PSM4光模块量产线建设

讯,易飞扬即日宣布量产两款高性能的100G光模块:100G QSFP28 CWDM4 和100G QSFP28 PSM4。两种产品采用同一个技术平台和生产平台。本次建设投产的CWDM4/PSM4 车间为万级无尘恒温恒湿车间,面积2000平米,配置有3套全自动高精密WIRE B…

滑动切换activity

一、效果 手在屏幕上划过一段距离,切换页面。 二、原理 2.1手在屏幕上出发 onTouch事件 2.2在onTouch事件中完成滑动逻辑处理 2.2.1 判断划过的x轴距离,如果大于多少,则startActivtiy 2.2.2 判断划过的y轴距离,如果大于多少&a…

Redux的全家桶与最佳实践

2019独角兽企业重金招聘Python工程师标准>>> image.png Redux 的第一次代码提交是在 2015 年 5 月底(也就是一年多前的样子),那个时候 React 的最佳实践还不是明晰,作为一个 View 层,有人会用 backbone 甚至…

php二分查找算法时间复杂度,一个运用二分查找算法的程序的时间复杂度是什么...

一个运用二分查找算法的程序的时间复杂度是“对数级别”。二分查找是一种效率较高的查找方法,算法复杂度即是while循环的次数,时间复杂度可以表示“O(h)O(log2n)”。本教程操作环境:windows7系统、Dell G3电脑。一个运用二分查找算法的程序的…

Android MediaPlayer使用方法简单介绍

1)如何获得MediaPlayer实例: 可以使用直接new的方式:MediaPlayer mp new MediaPlayer();也可以使用create的方式,如:MediaPlayer mp MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了* 需要在…

oracle基本的操作命令,oracle命令基本操作

--创建表空间create tablespace TBS_OTHERS datafile G:\APP\ORCL\ORADATA\ORCL\TBS_OTHERS01.dbf size 1000m;-- 创建用户create user C##JHGL identified by jhgl default tablespace TBS_OTHERScreate user C##YJYJHGL identified by jhgl default tablespace TBS_OTHERScre…

将不确定变为确定~头压缩是否有必要,MVC如何实现头压缩

网页的头部压缩在页面体积大的情况下非常有必要做,它会使页面体积有一个明显的减小,同时加到网页从服务端下载到客户端的速度,以下是我做的一个测试: 没有使用头压缩时: 使用了头压缩后: 我们可以看到&…

android .9.png ”点九” 图片制作方法

“点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸…

servlet3.0异步处理

Servlet3是Tomcat7出现的新特性,所以需要先安装tomcat7 微信企业号使用回调模式时: 假如企业无法保证在五秒内处理并回复,可以直接回复空串,企业号不会对此作任何处理,并且不会发起重试。这种情况下,可以…

使用svn diff的-r参数的来比较任意两个版本的差异

1 svn diff的用法1.1 对比当前本地的工作拷贝文件(working copy)和缓存在.svn下的版本库文件的区别[plain] view plaincopyprint? svn diff 1.2 对比当前本地的工作拷贝文件(working copy)和任意版本A的差异[plain] view plaincopyprint? svn diff -rA 比如,以下…

深入理解HTTP Session

session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同。这里只探讨HTTP Session。为了说明问题…

Hibernate的懒加载session丢失解决方法

在web.xml加入spring提供的过滤器&#xff0c;延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --><filter><filter-name>openSessionInView</filter-name><filter-class>org.springframework.orm.hibernate4.support.OpenSess…

Linux访问其他进程空间,Linux环境进程间通信系列(五):共享内存

共享内存可以说是最有用的进程间通信方式&#xff0c;也是最快的IPC形式。两个不同进程A、B共享内存的意思是&#xff0c;同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新&#xff0c;反之亦然。由于多个进程共享同一块内存区…

冲刺NO.8

Alpha冲刺第八天 站立式会议 项目进展 项目稳步进行&#xff0c;项目的基础部分如基本信息管理&#xff0c;信用信息管理等部分已相对比较完善。 问题困难 技术困难在短期内很难发生质的变化&#xff0c;而本项目由于选择了队员不太熟悉的程序框架&#xff0c;所以所以项目的交…

linux由众多微内核组成,什么是linux

大家对Linux这个词比较陌生吧&#xff0c;那么Linux是什么呢&#xff1f;Linux是什么Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux&#xff0c;但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中&#xff0c;从手机、平板电脑、路由器和视…

浅析jQuery中常用的元素查找方法总结

$("#myELement") 选择id值等于myElement的元素&#xff0c;id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div") 选择所有的div标签元素&#xff0c;返回div元素数组 $(".myClass") 选择使用myClass类的css的所有…