Android.mk是Android工程管理文件,其作用基本等同于Linux环境中的Makefile,在语法上,Android.mk和普通Makefile略有不同,主要区别是Android.mk包含一些Android编译系统的公共的宏
Android.mk中选项参考以下文件路径:
build/core/config.mk
各个选项的默认值在以下文件中定义:
build/core/base_rules.mk
 
1、Android.mk文件只处理从根目录开始找到的第一个Android.mk文件,如果需要递归。需要在当前目录的Android.mk文件中做如下处理:
include $(call all-makefiles-under,$(LOCAL_PATH))
 
在一个Android.mk中也可以生成多个目标:可执行程序,动态库,静态库或者Android用用程序包
Android.mk文件可以处理多个内容:
 
include $(CLEAR_VARS) //清理变量
#处理第一个内容
include $(CLEAR_VARS)
#处理第二个内容
 
现在我们来讨论对于各种目标的构建方式
1、可执行程序
LOCAL_PATH :=$(my_dir) //本地路径,当前目录
Text EXe
include $(CLEAR_VARS)
LOCAL_SRC_FILES := eng
LCAOL_SRC_FILES :=\
main.c
LOCAL_MODULE := text_exe
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES := libc
include $(BUILD_EXECUTABLE)
 
注:编译一个可执行程序,需要在LOCAL_SRC_FILES 中假如远见路径(相对于当前Android.mk目录的路径),
在LOCAL_C_INCLUDES中假如所需要包含的头文件路径;
在LOCAL_STATIC_LIBRARIES 中假如所需要链接的静态库(*.a)的名称
在LOCAL_SHARED_LIBRARIES中假如所需要链接的动态库(*.so)的名称
LOCAL_MODULE标示模块最终的名称,最后使用include$(build_executable)
表示以一个可执行程序的方式进行编译,在本例中,LOCAL_MODULE被定义为test_exe,
因此最终生成可执行程序的名称是test_exe
一个可执行程序编译后生成独立的目标目录在out/target/product/中,路径如下所示:
<TARGET_PRODUCT>/obj/EXECUTABLES/<LOCAL_MODULE>
 
2、静态库
静态库,也称之为归档文件,在Linux中扩展名通常为.a,在Android.mk中编译一个静态库(归档文件)的模板如下所示
LOCAL_PATH :=$(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_SRC_FILES :=\
hello.c
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBARIES :=
LOCAL_SHARED_LIBRARAIES := libc
include $(BUILD_STATIC_LIBRARY)
 
在编译静态库,基本的内容和编译可执行程序相似,区别在于include$(BUILD_STATIC_LIBRARY) 标示编译静态库。在本例中,LOCAL_MODULE被定义为libtest_static,因此最终生成的静态库的名称是libtest_static.a
 
3、动态库
动态库 也称之为共享库,是linux标准的elf格式文件的一种,在Linux中扩展名通常为.so在Android中编译一个动态库(共享库)的模板如下:
LOCAL_PATH := $(my-dir)
include $ (CLEAR_VARS)
LOCAL_MODULE_TAGS :=eng
LOCAL_SRC_FILES := \
hello.c
LOCAL_MODULE := libtest_stared
TARGET_PRELINK_MODULE := false
LOCAL_C_INCLUDES :=
LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES := libc
include $ (BUILD_SHARED_LIBRARY)
编译一个动态库,基本的内容和编译可执行程序、静态库相似,区别在于使用include$(BUILD_SHARED_LIBRARY)
表示编译动态库。在本例中,LOCAL_MODULE被定义为libtest_shared,因此最终生成的动摇库的名称是libtest_shared.so
一个动态库编译后生成的独立的目标目录在out/target/product/中,路径如下所示
<TARGET_PRODUCT>/obj/STATIC_LIBRARIES/<LOCAL_MODULE>
 
Android 应用程序包是一种特殊的文件,通常以apk为扩展名。在Android.mk中编译
一个应用程序包的模板如下所示:
LOCAL_PATH := $(CALL my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_PACKAGE_NAME := TestApplication
include $(BUILD_PACKAGE)
这里使用BUILD_PACKAGE宏表示编译apk,而LOCAL_SRC_FILES 使用自动查找的方法,将找打所有的java文件进行编译
在源代码环境中编译和在SDK中编译应用程序包略有不同,涉及的目录主要有一下两个。
out/target/common/obj/APPS: 通用java字节码目录
out/target/product/<TARGET_PRODUCT>obj/APPS:Android 应用包目录
每个包在两个目录中均具有名为{LOCAL_PACKAGE_NAME}_intermediates/的独立目录
例如,对于SkeletonApp包编译,公共目录的生成结构如下所示:
关于在编译应用程序的时候,有一个额外的宏可以控制编译的行为,如下所示:
WITH_DEXPREOPT := true
如果WITH_DEXPREOPT 被定义为true,一个应用程序将由两个部分组成:一个是不包含java字节码classes.dex的apk文件,一个是名称为classes.odex的字节码文件。
两个文件同时预制在系统中依然可以构成能运行的应用程序。但是,这种生成的结构就不能在进行动态的安装了。
Android4.x以上默认为true
 

Android.mk入门(一)的更多相关文章

  1. 01 android ndk入门实例之android.mk编译

    前言 1 环境 android studio2.3 , window系统 2 ndk https://dl.google.com/android/repository/android-ndk-r16- ...

  2. Android编译系统入门(二)

    Android.mk的使用方法 在上一篇Android编译系统入门(一)中我们只要介绍了Android系统使用make命令默认编译的依赖树是droid,而droid是一个伪目标,它有两个先决条件dro ...

  3. Android开发入门要点记录:四大组件

    cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...

  4. Android编译系统入门(一)

    做过Android平台开发的朋友对make,mm或make clean命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系统的 ...

  5. Android NDK 入门与实践

    NDK 是什么 NDK 全称 Native Development Kit,可以让您在 Android 应用中调用 C 或 C++ 代码的工具. NDK 好处 1.NDK 可以生成 .so 文件, 方 ...

  6. 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)

    最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...

  7. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  8. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

  9. [译]:Xamarin.Android开发入门——Hello,Android快速上手

    返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...

随机推荐

  1. jQuery中Ajax的属性设置

    1.全局设置为同步 $.ajaxSetup({ async: false });

  2. 【bzoj3747】[POI2015]Kinoman 线段树区间合并

    题目描述 一个长度为n的序列,每个数为1~m之一.求一段连续子序列,使得其中之出现过一次的数对应的价值之和最大. 输入 第一行两个整数n,m(1<=m<=n<=1000000). 第 ...

  3. aFlex脚本入门

    aFlex脚本入门 来源:http://blog.51cto.com/virtualadc/599194 来源:http://blog.51cto.com/virtualadc/624219 对于A1 ...

  4. HDU 5790 Prefix(字典树+主席树)

    Prefix Time Limit: 2000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub ...

  5. 【HDU 1358 Period】

                 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)     ...

  6. UOJ356 【JOI2017春季合宿】Port Facility

    暴力就是O(n^2)连边,二分图,这样只有22分. 我们考虑优化建边,我们按照左端点排序,对于一个新加进来的线段,我们向左端点距其最近的和他相交的线段连边,别的相交的我们连同色边,当一个点连了两条同色 ...

  7. JavaScript如何读写cookie

    今天把javascript如何用来创建及存储cookie复习了一下,其中的一点体会拿出来和大家讨论,首先看一下基础知识: 什么是cookie cookie 是存储于访问者的计算机中的变量.每当同一台计 ...

  8. 设置RobotFramework的ftplibrary中,将Upload_file操作的异常改为回显错误信息。

    测试中需要通过FTP通道,将数据发送给服务器,而这个上传的数据要被阻断.在结合RobotFramework测试中,安装的ftplibrary,使用upload_file操作,如果上传动作失败,会抛出异 ...

  9. uoj Goodbye Dingyou Round 题解

    2.14 晚上的比赛, 现在改好了四题, 还差提答. 在这补个题解 新年的xor Description 给你 \(n\) , 然后要你构造 \([L, R], L<R\) 使得区间异或和为 \ ...

  10. poj 3744 Scout YYF 1 (概率DP+矩阵快速幂)

    F - Scout YYF I Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...