闲来无事,分析一下Android的Build系统,希望对自己的工作有所助益;有可能对别人有所帮助。
Android无疑是一个很大的系统,目前看来也是还很年轻,又很有活力的一个系统。通过研究它的build子系统,至少可以看到一个大系统是怎样写出来的。
Makefile,很多人可能都觉得,这个东西太简单了,甚至很多时候都不需要,我直接gcc把源代码编出来就可以了。这种想法,在程序小的时候是可以的,但是要写一个大型的系统的话,如果还守着以前的手工作坊的模式,那只会给自己带来很大的困扰。
我们关注的不是Makefile的语法,偏僻的用法,而是学习一下,Android这个大系统里,关于build管理,它用Makefile解决了一些什么样的问题。
粉墨登场
产品,product。Android已经支持了好几款产品,比如有HTC的dream, hero, nexus,Motorola的droid等,还有Google自己的generic的android源码。
Variant。Android在build的时候,可以指定几个variant,比如,user, userdeubg, eng, tests。通过这些选项,可以编译出来不同的程序,eng是给工程师用的,user是给最终客户用的。
子系统。Android平台里有很多不同的程序。有跑在手机上的,有跑在PC上的。有程序,有库。有动态库,也有静态库。有代码,也有文档。有C,有C++,也有Java。还有键盘/字符映射表。这些都是需要编译的。
继承关系。针对很多产品的角色之间,是有继承关系的。比如,Google自己的产品,其实不是一个产品,只是一个参考设计。但是其他所有厂商的产品呢,又必须是从Google的参考设计继承下来的。如果每个厂商都需要从头定义很多自己的标准,那很费人力,又不好维护,就像人类造通天塔一样,是不可能成功的。Google定义出来了一套标准,就是要鼓励厂商们使用它的这套标准。
天狗吠日
好吧,让我们看一眼代码吧。
build/target/product底下有一些.mk文件,其格式是Makefile文件,其中:
core.mk定义了product_packages,也就是说,基本上所有基于Android的系统,都必须有这几个package。像browser啊,contacts啊,launcher啊,phone啊,都是这里面规定了的,其他厂商版本没有特殊情况,就不需要再自己去定义这几个package了。
generic.mk又定义了几个额外的package,同时继承了core.mk。
说到这儿,您可能会觉得奇怪,继承那不是面向对象的概念吗,怎么Makefile里还能“继承”呢?这样想的话就错了。Makefile一样能继承。即使是汇编语言,你都可以继承。语言只是提供一种方便而已,关键还是要看人怎么用。
C++提供了继承,但是它不是一个专门为build管理设计的语言啊。Makefile语言才是专门为build系统设计的语言。但是我们看到Android这样一个系统,它需要用到继承的概念时,有经验的开发者肯定不会那么死板,因为一种语言没有内在的某种特性就束手无策。他们会考虑两种方案
1。换语言。比如我自己重新写一个build的语言。Java里的ant,还有boost C++库的jam,就是这么来的。
2。自己用已有语言编程实现需要的特性。
一般来说,影响做出最后决定的因素,无疑应该是代价。专门发明一种新语言,代价还是很大的。所以我们看到,Android的开发者选择了后者。
待续。
转:http://blog.csdn.net/flowermonk/archive/2010/04/03/5447813.aspx
分享到:
相关推荐
理解 Android Build 系统,安卓编译的规则原理分析!详解
Android 编译系统分析 Android 编译系统是 Android 操作系统的核心组件之一,它负责将源代码编译成可执行文件。Android 编译系统的分析对于Android 开发者来说非常重要,因为它可以帮助开发者更好地理解 Android 的...
Android SDK Build Tools是Android Studio项目构建系统的一部分,用于编译、打包和优化APK。它们处理诸如AAPT(Android Asset Packaging Tool)这样的任务,负责资源的编译和打包,以及 Dex 文件的生成等。 2. **...
Lint是Android开发中的静态代码分析工具,用于检测潜在的错误和不推荐的实践。在23.0.2版本中,Lint可能增加了新的检查规则,提升了代码质量。 8. **资源编译** build-tools 23.0.2可能改善了资源编译过程,使得...
随着Android系统的更新,Build-Tools也会定期发布新版本,以适应最新的开发需求和API级别。29.0.0是Build-Tools的一个重要版本,它包含了许多优化和改进,以提升开发效率和应用质量。 二、主要组件及功能 1. AAPT...
Android编译系统是Android操作系统的核心组成部分,负责将源代码转换为可在设备上运行的二进制文件。它是一个复杂的构建系统,涉及多个层次的配置、编译和打包过程。本文将深入探讨Android编译系统的结构和工作原理...
随着移动互联网技术的飞速发展,Android操作系统已经成为全球最流行的移动操作系统之一。对于希望进入移动应用开发领域的开发者而言,掌握Android Studio这一官方推荐的集成开发环境(IDE)至关重要。本教材旨在帮助...
### Android Makefile与Build System深度解析 #### 一、引言 随着移动互联网技术的快速发展,尤其是近十年间,智能手机已成为人们日常生活中不可或缺的一部分。在众多操作系统中,Google推出的Android系统因其开放...
当遇到"failed to find build tools 27.0.1"的错误时,意味着你的系统缺少这个特定版本的构建工具,这将导致项目无法正常编译。为解决这个问题,你需要下载并安装对应的`build-tools`版本。具体步骤如下: 1. 打开...
综上所述,《Learn Android Studio Build Android Apps Quickly And Effectively》不仅是一本系统介绍Android Studio及其应用开发的教程,还是一本引导读者如何有效利用该工具进行高效开发的手册。通过循序渐进的...
【Android Build-Tools_r19.0.3-Windows】是Android SDK中的一个重要组件,它为开发者提供了构建Android应用程序所需的工具集。这个特定版本(r19.0.3)适用于Windows操作系统,确保了在Windows环境下开发Android...
### Android build.prop生成过程源码分析 #### 一、概览 `build.prop`是Android系统中的一个关键配置文件,它记录了系统构建时的重要属性信息,如屏幕密度(LCD density)、默认语言设置、编译时间等。这些信息对于...
《Android编译系统分析》 Android的编译系统是其核心组成部分之一,它负责将源代码转换为可以在Android设备上运行的应用程序和系统组件。理解这个系统的工作原理对于开发者来说至关重要,因为它涉及到如何构建、...
Android编译系统是Android操作系统开发的关键组成部分,负责将源代码转化为可在不同设备上运行的可执行文件和库。本文将深入解析Android编译系统的结构和工作原理,重点关注四种类型的Make文件及其作用。 首先,...
这个版本针对Windows操作系统设计,包含了构建Android应用所需的各种工具。在本文中,我们将深入探讨这个版本的SDK Build Tools包含的关键知识点,以及它如何在Android开发流程中发挥作用。 首先,SDK Build Tools...
- **书名**:“高清彩版 Learn Android Studio Build Android Apps Quickly And Effectively” - **作者**:Adam Gerber 和 Clifton Craig - **简介**:本书旨在帮助读者快速有效地掌握使用 Android Studio 开发 ...
- **`tools.build`**:强调这是Android构建工具相关的部分,即Android Gradle插件。 - **`gradle`**:通用的Gradle标签,涵盖了所有与Gradle相关的知识点。 5. **压缩包内容**: `gradle-3.2.0`目录通常包含了该...
android.os.build.serial 在API 9 中引入,如果低于9的系统可以通过这个方法获取这个信息值 java代码如下: public static String getDeviceSerial() { String serial = unknown; try { Class clazz = Class.for...
8. **编译与构建系统**:Android使用Build System(如Makefile、Gradle)进行编译和打包,了解这些工具的源码能提高构建效率,实现自动化工作流。 9. **测试框架**:如JUnit、 Espresso等,通过源码分析可以学习...
Android.tools.build:gradle:2.2.2版本的源码为我们揭示了Gradle在Android项目中的运作机制,这对于开发者来说是一份宝贵的资源,尤其对于那些希望深入了解Gradle编译过程、Task任务分析以及Hook Task技术的开发者而...