zoukankan      html  css  js  c++  java
  • android编译系统 整体 简介

          本地模块的Makefile文件就是我们在Android里面几乎上随处可见的Android.mk。Android进行编译的时候会通过下面的函数来遍历所有子目录中的Android.mk,一旦找到就不会再往层子目录继续寻找(所以你的模块定义的顶层Android.mk必须包含自己定义的子目录中的Android.mk)。
        

    1. subdir_makefiles += \  
    2.          $(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk) 

    简单地把Android所有的Make文件分为3种:


          1、配置环境makefile
          这类文件主要来配置
    product,board,以及根据你的Host和Target选择相应的工具以及设定相应的通用编译选项:
    Java代码  
    1. build/core/config.mk         summary of config  
    2. build/core/envsetup.mk    generate dir config and so on  
    3. build/target/product         product config  
    4. build/target/board            board config  
    5. 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、 系统模块makefile
          这类文件主要定义了如何来处理Module的Android.mk
    ,以及采用何种方式来生成目标模块

    1. ,这些模块生成规则都定义在config.mk里面,我们可以看看:  
    2.       CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk  
    3.       BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk  
    4.       BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk  
    5.       BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk  
    6.       BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk  
    7.       BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk  
    8.       BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk  
    9.       BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk  
    10.       BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk  
    11.       BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk  
    12.       BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk  
    13.       BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk  
    14.       BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk  
    15.       BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk  
    16.       BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk  
    17.       BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk  
    18.       BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk  
    19.       BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk  
    20.       BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk  
    21.         

    除了CLEAR_VARS是清楚本地变量之外,其他所有的都对应了一种模块的生成规则,每一个本地模块最后都会include其中的一种来生成目标模块。大部分上面的.mk都会包含base_rules.mk,这是对模块进行处理的基础文件,建议要写本地模块的都去看看,看明白了为什么 Android.mk要这么写就会大致明白了。


          3、工程 编译

           Android通过LOCAL_MODULE_TAGS来决定哪些本地模块会不会编译进系统,通过PRODUCT和LOCAL_MODULE_TAGS来决定哪些应用包会编译进系统,如果用户不指定LOCAL_MODULE_TAGS,默认它的值是user。此外用户可以通过buildspec.mk来指定你需要编译进系统的模块。

           用户也可以通过mm来编译指定模块,或者通过make clean-module_name来删除指定模块。


           这主要指的是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就是以这样一种方式组织在一起的了。

    通过CASH_MK=true来打开快速编译的功能,因为没有对错误进行检测的操作,所以使用的时候一定要特别小心。

           最后一个是扩展SDK API的问题,Android可以编译出自己的SDK,并扩展相应的SDK API,现在没有仔细的研究,只了解一个粗暴的方法就是在frameworks/base/core/java中添加相应的类。将来有时间的话再仔细研究下。






  • 相关阅读:
    深入理解Linux修改hostname
    Linux开发环境必备十大开发工具
    管理员必备的几个Linux系统监控工具
    Solaris&&QNX® Neutrino®&&OpenVMS&&FreeBSD&&AIX
    ansible来了
    Cobbler系统安装备用链接
    Web安全
    在Eclipse/STS中使用EclEmma进行覆盖率检查
    C#中使用扩展方法
    Winform中Textbox的使用
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744740.html
Copyright © 2011-2022 走看看