Android.mk的使用以及常用模板

Android.mk使用

// 一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)
LOCAL_PATH := $(call my-dir)

// Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束
// CLEAR_VARS指的是clear_vars.mk,由编译系统提供,它会让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
// 这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
include $(CLEAR_VARS)

// user:  指该模块只在user版本下才编译;
// eng:  指该模块只在eng版本下才编译;
// tests: 指该模块只在tests版本下才编译;
// optional:指该模块在所有版本下都编译;
// debug: 批该模块只在userdebug版本下才编译
LOCAL_MODULE_TAGS := optional

// java源码: 调用all-java-files-under得到。(这种形式来包含local_path目录下的所有java文件)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
// C/C++:  LOCAL_SRC_FILES变量就必须包含将要编译打包进模块中的C或C++源代码文件
LOCAL_SRC_FILES := *.cpp

// package的名字,这个名字在脚本中将标识这个app或package,编译为apk时使用
LOCAL_PACKAGE_NAME := ***
// LOCAL_MODULE标识你在Android.mk文件中描述的每个模块。名称必须是唯一的。(编译其余使用)
// 注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件(也可以直接以libxxx命名)
LOCAL_MODULE := foo

// LOCAL_CERTIFICATE 后面是签名文件的文件名,说明Settings.apk是一个需要platform key签名的APK
LOCAL_CERTIFICATE := platform

// 可选变量,表示头文件的搜索路径。默认的头文件的搜索路径是LOCAL_PATH目录
LOCAL_C_INCLUDES := /**/**/**

// 表示该模块需要使用哪些静态库,以便在编译时进行链接
LOCAL_STATIC_LIBRARIES := *** \
						  ***
// 表示模块在运行时要依赖的共享库(动态库),在链接时就需要,以便在生成文件时嵌入其相应的信息
LOCAL_SHARED_LIBRARIES := *** \
						  ***

// 编译在vendor分区,不指定默认编译在system分区
LOCAL_VENDOR_MOUDLE := true

// 指定特定模块编译32bit或64bit或都编译,取值 32, 64, both
LOCAL_MULTILIB := 32 

//  设置在构建 C 和 C++ 源文件时构建系统要传递的编译器标记
//  参数说明:
//	-Wall 打开警告开关 -Wno-error=***
//	-O 代表默认优化 -O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化
//	-g 生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息
//	-D 增加全局宏定义,相当于 #define ***
//	-ffast-math:极大地提高浮点运算速度
//	-mfloat-abi=softfp 浮点运算
//	-fopenmp OpenMp用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案(Compiler Directive)
LOCAL_CFLAGS := ***

//  只构建 C++ 源文件时将传递的一组可选编译器标记
LOCAL_CPPFLAGS := ***

// 此变量列出了在构建共享库或可执行文件时使用的额外链接器标记。利用此变量,您可使用 -l 前缀传递特定系统库的名称。例如,以下示例指示链接器生成在加载时链接到 /system/lib/libz.so 的模块
LOCAL_LDLIBS := -lz -llog

// 此变量列出了构建系统在构建共享库或可执行文件时使用的其他链接器标记。例如,若要在 ARM/X86 上使用 ld.bfd 链接器:
LOCAL_LDFLAGS += -fuse-ld=bfd

编译C++代码使用rtti标记(RTTI 运行时类型识别)
LOCAL_RTTI_FLAG := -frtti

// 目标的安装路径
LOCAL_MODULE_PATH := ***

// 指定platform api版本
LOCAL_PRIVATE_PLATFORM_APIS := current

// 引用静态jar包
LOCAL_STATIC_JAVA_LIBRARIES := *** \

// 引用动态jar包
LOCAL_JAVA_LIBRARIES := *** \

// full:使用编译系统默认的配置:压缩但不混淆和优化,默认的混淆配置文件是build/core/proguard.flags
// custom:和full一样,但不包括aapt生成的resource相关的混淆配置。
// nosystem:不使用系统的默认配置,但使用aapt生成的resource相关的混淆配置,其他混淆由模块自己负责。
// disabled:关闭混淆
// obfuscation:和full一样,并且开启混淆
// optimization:和full一样,并且开启优化
// 不设置时,如果是app,默认为full,如果是library,则默认为disabled。
// 编译userdebug版本时,编译脚本会把app的obfuscation改成full,即不混淆
LOCAL_PROGUARD_ENABLED := disabled

// 引用jni库
LOCAL_JNI_SHARED_LIBRARIES := ***_jni \

include $(BUILD_PACKAGE) // 是用来编译生成package/app/下的apk。还有其他几种编译情况:
include $(BUILD_STATIC_LIBRARY)    // 表示编译成静态库;
include $(BUILD_SHARED_LIBRARY)    // 表示编译成动态库;
include $(BUILD_EXECUTABLE)        // 表示编译成可执行程序;
include $(BUILD_JAVA_LIBRARY)    // 表示编译成动态jar包;
include $(BUILD_STATIC_JAVA_LIBRARY)    // 表示编译成静态jar包;
include $(BUILD_PREBUILT)   // 把文件当成编译项目,在Android.mk中copy一个file,一般用于第三方提供apk二次打包到系统中

常用模板

编译apk

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := src/com/example/test/MainActivity.java 
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := ***
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := com.example.test \
LOCAL_PRIVATE_PLATFORM_APIS := current
LOCAL_CERTIFICATE := platform
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.example.test"
	android:versionCode="1"
	android:versionName="1.0"
	android:sharedUserId="android.uid.system">
	<application
	    android:allowBackup="true"
	    android:persistent="true"
	    android:label="test"
	    android:supportsRtl="true">
	    <activity
	        android:name=".MainActivity"
	        android:label="Tests for com.example.test" >
	
	        <intent-filter>
	            <action android:name="android.intent.action.MAIN" />
	            <category android:name="android.intent.category.LAUNCHER" />
	        </intent-filter>
	    </activity>
	
	</application>
</manifest>
编译静态库
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
          helloworld.cpp
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
编译动态库
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
          helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
编译可执行程序
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
二次打包apk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myapplication
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := true
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
LOCAL_SRC_FILES := ./app-release.apk
# LOCAL_MULTILIB := 64
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PREBUILT)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值