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
- 01 android ndk入门实例之android.mk编译
前言 1 环境 android studio2.3 , window系统 2 ndk https://dl.google.com/android/repository/android-ndk-r16- ...
- Android编译系统入门(二)
Android.mk的使用方法 在上一篇Android编译系统入门(一)中我们只要介绍了Android系统使用make命令默认编译的依赖树是droid,而droid是一个伪目标,它有两个先决条件dro ...
- Android开发入门要点记录:四大组件
cocos2dx跨平台开发中需要了解android开发,昨天快速的浏览了一本Android开发入门教程,因为之前也似懂非懂的写过Activity,Intent,XML文件,还有里面许多控件甚至编程思想 ...
- Android编译系统入门(一)
做过Android平台开发的朋友对make,mm或make clean命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系统的 ...
- Android NDK 入门与实践
NDK 是什么 NDK 全称 Native Development Kit,可以让您在 Android 应用中调用 C 或 C++ 代码的工具. NDK 好处 1.NDK 可以生成 .so 文件, 方 ...
- 关于jni编译32位、64位动态库(Android.mk和Application.mk文件)
最近新项目需要编译64位的动态库,这里记录如何配置. 在jni目录下加入Android.mk和Application.mk文件. Application.mk APP_ABI := armeabi a ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- [译]:Xamarin.Android开发入门——Hello,Android深入理解
返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
随机推荐
- Python中的返回函数与闭包
返回函数,顾名思义,就是高阶函数可以把函数作为return值返回.与闭包的关系是:闭包需要以返回函数的形式实现. 一. 返回函数 比如我们有一个求和函数: >>> def calc_ ...
- 利用VS2013 XSLT对 XML进行转换
1.打开VS2013 2.文件-->新建-->文件-->XML文件 3.文件-->新建-->文件-->XSLT文件 4.CTRL+SHIFT+S 保存2个文件位置 ...
- [AT2698] Don't Be a Subsequence
题目大意:给定一个字符串,求一个最短的串要求没有在该字符串的子串中出现过,如果有多个,输出字典序最小的那一个. 题解:倒着跑一遍原字符串(以下编号为$1\sim n$),按出现了所有$26$个字母来分 ...
- 【POJ3294】 Life Forms(SA)
...又是TLE,对于单组数据肯定TLE不了,问题是多组的时候就呵呵了... 按height分组去搞,然后判一下是否不属于同一个串... ; var x,y,rank,sa,c,col,h,rec:. ...
- POJ 3977 Subset | 折半搜索
题目: 给出一个整数集合,求出非空子集中元素和绝对值最小是多少(元素个数尽量少) 题解: 分成两半 爆搜每一半,用map维护前一半的值 每搜出后一半的一个值就去map里找和他和绝对值最小的更新答案 # ...
- POJ 3974 Palindrome | 马拉车模板
给一个字符串,求最长回文字串有多长 #include<cstdio> #include<algorithm> #include<cstring> #define N ...
- rem布局和hotcss原理分析
rem布局的开源方案hotcss, 其原理个人理解如下: 手机px = (手机页面宽度/设计稿宽度) * 设计稿px 手机rem = 手机px / fontSize = (手机页面宽度/设计稿宽度) ...
- POJ3680:Intervals(离散化+最大流最小费用)
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9320 Accepted: 4014 题目链接:ht ...
- web项目报outmemory错误解决方案
因为数据问题内存不够出现错误,将参数加入到eclipse的run的配置文件中:
- web本地存储 sessionStorage 和 localStorage
1.sessionStorage 临时存储 为每一个数据源维持一个存储区域,在浏览器打开期间存在,包括页面重新加载. 2.localStorage 长期存储 与sessionStorage一样,但在 ...