原文网址:http://www.360doc.com/content/15/0314/23/1709014_455175716.shtml

 Android Building System 总结 收藏 
花了一个月的时间来看Android Make,在网上总是看到某某大虾说一天就把Android Make overview了一下,不得不感叹现在大虾的强大和咱那连蜗牛都可以鄙视一下的进度。不过总算是彻底看清的Android make这个系统,不得不当初架构出这套机制的神人顶礼膜拜一下,虔诚地烧三柱高香,惊叹于神人的伟大的时候也越感自己的沧海一粟,苦海无边,回头无岸,就加油滑水吧。
      闲话就不多说了,来瞅瞅这套机制,Android以模块的形式来组织各个系统中的部件,Eng专业点的词汇就是Module,就是各位在几乎每个目录下都能看到的Android.mk。可以简单地把Android所有的Make文件分为4种:
      1、For config
      这类文件主要来配置product,board,以及根据你的Host和Target选择相应的工具以及设定相应的通用编译选项:
      build/core/config.mk         summary of config
      build/core/envsetup.mk    generate dir config and so on
      build/target/product         product config
      build/target/board            board config
      build/core/combo              build flags config 
      这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中,哪些APK在当前product中是不提供的。
      config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说 BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。
      2、 Module Compile
      这类文件主要定义了如何来处理Module的Android.mk,以及采用何种方式来生成目标模块,这些模块生成规则都定义在config.mk里面,我们可以看看:
      CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
      BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
      BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
      BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
      BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
      BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
      BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
      BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
      BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
      BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
      BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
      BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
      BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
      BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
      BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
      BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
      BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
      BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
      BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk
      除了CLEAR_VARS是清楚本地变量之外,其他所有的都对应了一种模块的生成规则,每一个本地模块最后都会include其中的一种来生成目标模块。大部分上面的.mk都会包含base_rules.mk,这是对模块进行处理的基础文件,建议要写本地模块的都去看看,看明白了为什么 Android.mk要这么写就会大致明白了。
      3、Local Module
      本地模块的Makefile文件就是我们在Android里面几乎上随处可见的Android.mk。Android进行编译的时候会通过下面的函数来遍历所有子目录中的Android.mk,一旦找到就不会再往层子目录继续寻找(所有你的模块定义的顶层Android.mk必须包含自己定义的子目录中的Android.mk)。
      subdir_makefiles += \
          $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
       不同类型的本地模块具有不同的语法,但基本上是相通的,只有个别变量的不同,如何添加模块在前面的帖子已经说过了,大家可以参考。
       Android通过LOCAL_MODULE_TAGS来决定哪些本地模块会不会编译进系统,通过PRODUCT和LOCAL_MODULE_TAGS来决定哪些应用包会编译进系统,如果用户不指定LOCAL_MODULE_TAGS,默认它的值是user。此外用户可以通过buildspec.mk来指定你需要编译进系统的模块。
       用户也可以通过mm来编译指定模块,或者通过make clean-module_name来删除指定模块。
       4、Package 
       这主要指的是build/core/Makefile这个文件,它定义了生成各种img的方式,包括ramdisk.img   userdata.img  system.img  update.zip  recover.img等。我们可以看看这些img都是如何生成的,对应着我们常用的几个make goals:
 
在实际的过程中,我们也可以自己编辑out目录下的生成文件,然后手工打包相应生成相应的img,最常用的是加入一些需要集成进的prebuilt file。
       
       所有的Makefile都通过build/core/main.mk这个文件组织在一起,它定义了一个默认goals:droid,当我们在TOP目录下敲Make实际上就等同于我们执行make droid。当Make include所有的文件,完成对所有make我文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。
       基本上Android building system就是以这样一种方式组织在一起的了,下面说一点闲散的东西。首先是如何来加快Android的编译过程,因为每次Android都要遍历所有的Android.mk,不管是编译整个工程还是只编译某个模块。所以可以将遍历的结果保存下来,下次直接从文件读就好了,但是这里容易出错,所以一定要确认是否正确包含了所有的.mk,当新加入文件的时候确认将原来保存的文件删除。下面是我写的加快编译的一个makefile,将下面的语句替换掉 main.mk中的相应部分就可以了:
       FROM:
       subdir_makefiles += \
           $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
       TO:
       ifneq ($(ONE_SHOT_MAKEFILE),)
       else
       ifneq ($(CASH_MK),true)
       subdir_makefiles += \
           $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
      else
     subdir-makefiles-cash := $(shell cat build/subdir_mk_cash)
     ifeq ($(subdir-makefiles-cash),)
     $(warning No .mk cash ,create now !)
     subdir_makefiles += \
           $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
     mk-to-file := $(shell echo $(subdir_makefiles) > build/subdir_mk_cash) 
     else
    $(warning Using cash mk !)
    subdir_makefiles := $(shell cat build/subdir_mk_cash)
    endif
    endif
    endif
       通过CASH_MK=true来打开快速编译的功能,因为没有对错误进行检测的操作,所以使用的时候一定要特别小心。
       最后一个是扩展SDK API的问题,Android可以编译出自己的SDK,并扩展相应的SDK API,现在没有仔细的研究,只了解一个粗暴的方法就是在frameworks/base/core/java中添加相应的类。将来有时间的话再仔细研究下~~
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yili_xie/archive/2009/12/14/5004205.aspx

【转】Android Building System 总结 - 一醉千年 - CSDN博客的更多相关文章

  1. android中MVP模式(一) - 清风明月的专栏 - CSDN博客

    presenter 主持人.主导器 ====== 1. 明确需求,界面如下:可存,可根据id读取数据. 包结构图 2. 建立bean public class UserBean { private S ...

  2. Android应用开发-小巫CSDN博客clientJsoup篇

    Android应用开发-小巫CSDN博客clientJsoup篇 距上一篇博客已经过去了两个星期,小巫也认为很抱歉,由于在忙着做另外一个项目,差点儿抽不出空来,这不小巫会把剩下的博文全部在国庆补上.本 ...

  3. Android应用开发-小巫CSDN博客client之显示博文具体内容

    Android应用开发-小巫CSDN博客客户端之显示博文具体内容 上篇博文给大家介绍的是怎样嵌入有米广告而且获取收益,本篇博客打算讲讲关于怎样在一个ListView里显示博文的具体信息.这个可能是童鞋 ...

  4. Android应用开发-小巫CSDN博客client之获取评论列表

    Android应用开发-小巫CSDN博客客户端之获取评论列表 上一篇博客介绍了博文具体内容的业务逻辑实现,本篇博客介绍小巫CSDN博客客户端的最后一项功能.获取评论列表,这个功能的实现跟前面获取文章列 ...

  5. Android应用开发-小巫CSDN博客client之嵌入有米广告

    Android应用开发-小巫CSDN博客client之嵌入有米广告 上一篇博客给大家介绍怎样集成友盟社会化组件,本篇继续带来干货,教大家怎样嵌入广告到应用中去.小巫自称专业对接30年,熟悉各大渠道SD ...

  6. 基于Netbeans的安卓Android开发环境配置 - CSDN博客

    原文:基于Netbeans的安卓Android开发环境配置 - CSDN博客 基于Netbeans的安卓Android开发环境配置 一.准备工作 NetBeans 勾选网页中的Accept-选择对应系 ...

  7. Android为TV端助力 转载自jguangyou的博客,XML基本属性大全

    android:layout_width 指定组件布局宽度 android:layout_height 指定组件布局高度 android:alpha 设置组件透明度 android:backgroun ...

  8. android用户界面的教程实例---转自qianqianlianmeng的博客

    1.android用户界面之AlarmManager教程实例汇总http://www.apkbus.com/android-48405-1-1.html2.android用户界面之文本编辑教程实例汇总 ...

  9. android旋转动画和平移动画具体解释,补充说一下假设制作gif动画放到csdn博客上

    先上效果图: 我这里用的是GifCam来制作的gif动画,能够在http://download.csdn.net/detail/baidu_nod/7628461下载, 制作过程是先起一个模拟器,然后 ...

随机推荐

  1. CEO、COO、CFO、CTO

    CEO.COO.CFO.CTO是什么意思? 网站里的各种职位: CEO(Chief executive officer)首席执行官 类似总经理.总裁,是企业的法人代表. COO(Chief opera ...

  2. (转)Java爬虫,信息抓取的实现

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23272657 今天公司有个需求,需要做一些指定网站查询后的数据的抓取,于是花了点 ...

  3. web 自定义监听器中设置加载系统相关的静态变量及属性

    直接上代码: 在src下新建一个StartListener 实现接口ServletContextListener,: /** * @Title:StartListener.java * @Packag ...

  4. 在Android上模拟登录广工正方教务系统查询成绩

    这是在博客园里开博以来写的第一篇博客. 因为之前看过很多人都有发过关于模拟登录正方软件获取数据的文章,自己觉得挺好玩的便也去动手一做,开始还以为挺难的,但实际做起来还蛮简单的,当然其中还有些小插曲. ...

  5. C#之垃圾回收

    垃圾回收时现代语言的标志之一.垃圾回收解放了手工管理对象释放的工作,提高了程序的健壮性,但是副作用就是程序代码可以对于创建对象变得随意. 1.避免不必要的对象创建 由于垃圾回收的代价较高,所以C#程序 ...

  6. acrobat GetSize 返回 x,y 值单位

    GetSize:LPDISPATCH GetSize();Description:Gets a page’s width and height in points.Parameters:Return ...

  7. python隐含的特性

    本文源自(http://stackoverflow.com/questions/101268/hidden-features-of-python)希望介绍Python非常有用,而比较忽视的Python ...

  8. Linux 信号量互斥编程

    所谓信号量,其实就是一个数字.内核给这个数字赋予一定的含义,让它等于不同的值时所表示的意义不同.这样就可以用它来标示某种资源是否正被使用.信号的分类其实挺多的,主要还是二值和计数器.这里讨论二值 现在 ...

  9. SQL分页小Demo

    SELECT @TotalCount=count(1) FROM TableA A WITH(NOLOCK) INNER JOIN TableB B WITH(NOLOCK) ON A.Id=B.Id ...

  10. javascript图片预先加载

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...