【Makefile】如何写Android.mk(整理)
来源:互联网 发布:沈天津seo诊断 编辑:程序博客网 时间:2024/06/06 05:07
开始接触android编译,不可避免的就是遇到一个个目录下的android.mk文件。mk文件就就是uinx/linux下的makefile文件。前一阵子再看陈皓老师的《跟我一起学makefie》,看的不深入,自己实践得少。
先回顾一下make的工作方式(参考 陈皓的 跟我一起写makefile)
GNU的make工作时的执行步骤入下:(想来其它的make也是类似)
1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
1-5步为第一个阶段,6-7为第二个阶段。第一个阶段中,如果定义的变量被使用了,那么,make会把其展开在使用的位置。但make并不会完全马上展开,make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用了,变量才会在其内部展开。
一、全局看android下的mk (参考: android.mk脚本结构)
一个Android.mk
下面简单解释一下这三步:
1、清除旧变量,是因为Android.mk中所有的变量都是全局的,编译函数在编译时会调用这些变量。为了防止编译函数使用了编译其它模块时设置的变量,每次开始编译一个新的模块时清除所有的变量是个好习惯。
2、设置新变量就是把本次编译时用到的源码地址,包名等设置好。
3、调用编译函数其实就是include一个固定的mk文件,这个mk文件会根据设置的变量提取出编译模块需要的target,Command等信息并执行固定的编译命令。
编译一个简单的APK
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage # Tell it to build an APK include $(BUILD_PACKAGE)
编译一个依赖静态.jar文件的APK
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # List of static libraries to include in the package LOCAL_STATIC_JAVA_LIBRARIES := static-library # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage # Tell it to build an APK include $(BUILD_PACKAGE)
编译一个需要platform key签名的APK
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage LOCAL_CERTIFICATE := platform # Tell it to build an APK include $(BUILD_PACKAGE)
编译一个需要特殊vendor key签名的APK
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage LOCAL_CERTIFICATE := vendor/example/certs/app # Tell it to build an APK include $(BUILD_PACKAGE)
添加一个第三方APK
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Module name should match apk name to be installed. LOCAL_MODULE := LocalModuleName LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := platform include $(BUILD_PREBUILT)
第三方APK针对需要.so的apk的示例如下:
LOCAL_PATH := $(my-dir)include $(CLEAR_VARS) LOCAL_MODULE := baiduinput_android_v1.1_1000eLOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := platform include $(BUILD_PREBUILT) ######################################################################## copy the library to /system/lib ##########################################################################################include $(CLEAR_VARS) LOCAL_MODULE := libinputcore.so LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)LOCAL_SRC_FILES := lib/$(LOCAL_MODULE)OVERRIDE_BUILD_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES) include $(BUILD_PREBUILT)
添加静态java库
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Any libraries that this library depends on LOCAL_JAVA_LIBRARIES := android.test.runner # The name of the jar file to create LOCAL_MODULE := sample # Build a static jar file. include $(BUILD_STATIC_JAVA_LIBRARY)
- 【Makefile】如何写Android.mk(整理)
- 【Makefile】如何写Android.mk(整理)
- 如何写Android.mk
- 如何写Android.mk
- 如何写Android.mk
- 如何写Android.mk
- Android Makefile 及Android.mk 整理
- 如何写一个Android.mk
- android makefile(android.mk)分析(序)
- android makefile(android.mk)分析(1)
- android makefile(android.mk)分析(2)
- android makefile(android.mk)分析(序)
- android makefile(android.mk)分析(序)
- android makefile(android.mk)分析(1)
- android makefile(android.mk)分析(2)
- android makefile(android.mk)分析(转)
- android makefile(android.mk)分析(序)
- android makefile(android.mk)分析(1)
- Parameter blendMode must be non-null.
- Android Activity生命周期详解
- 选项菜单_上下文菜单_子菜单_图标菜单_自定义菜单_联系人标记弹出菜单
- Groovy
- android权限大全
- 【Makefile】如何写Android.mk(整理)
- system()函数
- smarty常用方法
- JQuery的KinSlideshow插件打造超炫焦点轮播图,带参数说明
- ZOJ 4257--Most Powerful(状压dp)
- Android通过共享用户ID来实现多个Activity进程共享
- 进程同步与异步的概念
- 列表_下拉列表_可扩展的列表_滚动_画廊_图像切换_网格_标签_惰性装载
- 十一、从头到尾彻底解析Hash表算法