深入浅出Android makefile(1)--初探(转载)

  转载:http://nfer-zhuang.iteye.com/blog/1752368

  

一、说明
android build system是一个非常庞大的系统,要编译Android工程、修改或新增Android模块都需要对这个编译系统有一定的了解。但是由于它实在是太庞大了,大家往往是不知道从哪里切入进去,对Android的编译系统进行一个系统的学习。

下面我们尝试从一个小模块逐步对android build system做一个深入剖析。选择的这个模块名字叫做acp ,源码位于build\tools\acp目录。

后续很多模块的编译都需要使用到acp,根据编译依赖一般会先编译本模块。当然它也需要依赖到其他文件,需要的时候我们再进行阐述。

二、acp Android.mk初探
acp的Android.mk比较简单,去掉的无用代码后,如下面所示:

Makefile代码

    LOCAL_PATH:= $(call my-dir)
    include $(CLEAR_VARS)  

    LOCAL_SRC_FILES := acp.c  

    LOCAL_STATIC_LIBRARIES := libhost
    LOCAL_C_INCLUDES := build/libs/host/include
    LOCAL_MODULE := acp
    LOCAL_ACP_UNAVAILABLE := true  

    include $(BUILD_HOST_EXECUTABLE)   

上面的语句大致的意思就是,使用当前路径下的acp.c源码,引用的include和链接的library都是host模块,最终编译生成一个可在当前主机运行的可执行文件,名字为acp(linux环境)。。
这里我们先不谈每一个变量的具体含义和使用,我们先大概看一下一个Android.mk的基本组成。

三、 Android.mk基本组成

  1. LOCAL_PATH 定义了当前模块的相对路径,必须出现在所有的编译模块之前
  2. 每个编译模块由include $(CLEAR_VARS) 开始,由include $(BUILD_XXX) 结束
  3. include $(CLEAR_VARS) 是一个编译模块的开始,它会清空除LOCAL_PATH之外的所有LOCA_XXX变量
  4. include $(BUILD_XXX) 描述了编译目标
  5. LOCAL_SRC_FILES 定义了本模块编译使用的源文件,采用的是基于LOCAL_PATH的相对路径
  6. LOCAL_MODULE 定义了本模块的模块名

编译acp还需要了几个可选的变量:

  • LOCAL_STATIC_LIBRARIES 表示编译本模块时需要链接的静态库
  • LOCAL_C_INCLUDES 表示了本模块需要引用的include文件
  • LOCAL_ACP_UNAVAILABLE 表示是否支持acp,如果支持acp,则使用acp进行拷贝,否则使用linux cp拷贝,本模块编译acp,当然是不支持acp了

四、编译目标

上面我们用到include $(CLEAR_VARS)和include $(BUILD_HOST_EXECUTABLE),那么他们是在哪里定义的呢?除了BUILD_HOST_EXECUTABLE还有哪些BUILD_XXX目标呢?

它们的定义位于build/core/config.mk文件,当然config.mk文件定义的编译目标也很多,下面列举几个常用的目标:

编译目标 说明
BUILD_HOST_STATIC_LIBRARY 主机上的静态库
BUILD_HOST_SHARED_LIBRARY 主机上的动态库
BUILD_HOST_EXECUTABLE 主机上的可执行文件
BUILD_STATIC_LIBRARY 目标设备上的静态库
BUILD_SHARED_LIBRARY
目标设备上的动态库
BUILD_EXECUTABLE
目标设备上的可执行文件
BUILD_JAVA_LIBRARY JAVA库
BUILD_STATIC_JAVA_LIBRARY 静态JAVA库
BUILD_HOST_JAVA_LIBRARY 主机上的JAVA库
BUILD_PACKAGE APK程序

具体的每一个目标,等我们遇到的时候我们再详细进行讲解。

时间: 12-23

深入浅出Android makefile(1)--初探(转载)的相关文章

深入浅出Android makefile(2)--LOCAL_PATH(转载)

转自:http://nfer-zhuang.iteye.com/blog/1752387 一.说明 上文我们对acp的Android.mk文件做了一个大致的描述,使得大家对Android.mk文件有了一个初步的认识,下面我们就重点分析下第一行: LOCAL_PATH:= $(call my-dir) 二.LOCAL_PATH 有人就问了,在本Android.mk中又没有使用到LOCAL_PATH,为什么先 要定义这么一个变量呢?为什么规定必须放在所有的include $(CLEAR_VARS)之

【转】深入浅出Android Support Annotation

[转自]http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0427/2797.html 英文链接:http://anupcowkur.com/posts/a-look-at-android-support-annotations/ 译文链接 深入浅出Android Support Annotations 导读:如果你之前遇到过在方法参数前面有@NonNull的情况却不知道它是干什么的,这篇文章将解答你的疑问. 原文如下: 在Androi

深入浅出 - Android系统移植与平台开发(一)

深入浅出 - Android系统移植与平台开发(一) 分类: Android移植2012-09-05 14:16 16173人阅读 评论(12) 收藏 举报 androidgitgooglejdkubuntu 目录(?)[+] +-------------------------------------------------+ +      本系列为连载,不定期会更新       + +-------------------------------------------------+ 一.A

android Makefile把jar包打到apk里

这个是经常的需求,我就是经常忘,关键不理解啊. 反反复复的也看看了android makefile. 太复杂了. 慢慢来吧.哎.工作十年.啥也不会.咋整? ## Copyright (C) 2008 The Android Open Source Project## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance

深入浅出Android Gradle构建系统(三:build task)

接上一篇  深入浅出Android Gradle构建系统(二:项目结构) 构建任务(Build Tasks) java和Android通用的任务 在build文件中使用了Android或者Java插件之后就会自动创建一系列可以运行的任务. Gradle中有如下一下默认约定的任务: 1. assemble 该任务包含了项目中的所有打包相关的任务,比如java项目中打的jar包,Android项目中打的apk 2. check 该任务包含了项目中所有验证相关的任务,比如运行测试的任务 3. buil

Android Makefile中是 如何识别 TARGET_PRODUCT 的

http://blog.csdn.net/stevenliyong/article/details/5285334 今天有时间小看一下Android 的Makefile, 终于稍有明白Android 编译系统是如何通过环境变量 TARGET_PRODUCT 来决定编译定制product. 首先, 编译Android 代码 通常情况下使用: # make showcommands 这实际上等价于下面的完整命令 (具体参见 build/core/envsetup.mk ) # TARGET_ARCH

Android 设计原则【转载】

原文地址 本文内容 吸引我的眼球 简化我的生活 让我眼前一亮 在使用过大量 Android APP 后,你会发现,遵循了下面这些原则的 APP 将会有更好的用户体验. 我们知道,往往国企的那些软件,都很难用,比如银行手机客户端,操作繁杂.界面难看.功能有限--基本上,那就是糊弄领导的东西,完全不是给用户用的,农业银行手机客户端,在我所用过的所有银行手机客户端中算是不错的了(而且,转账没有手续费),操作有点不便,尤其是"返回"操作,有种"不知身在何处"的感觉:而建设银

如何使用JS来检测游览器是什么类型,或android是什么版本号- 转载

var brower = { versions:function(){ var u = window.navigator.userAgent; var num ; if(u.indexOf('Trident') > -1){ //IE return "IE"; }else if(u.indexOf('Presto') > -1){ //opera return "Opera"; }else if(u.indexOf('Gecko') > -1 &a

Android之——JNI初探

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47405683 这里,我将用一个小例子的形式来帮助大家初探JNI的用法,首先,大家要先搭建好NDK环境,请大家先阅读<Android之--NDK环境搭建>一文. 一.实现 这个小例子实现的功能就是,通过Android中的java代码来调用C代码实现java代码与C代码之间的交互. 1.布局文件 我们首先在布局文件activity_main.xml中,添加一个按钮控件,并给按钮控件