android.mk notes

2022-07-30,,

Android.mk notes

  • Android.mk 是什么?
  • Android.mk 的语法
    • 编译apk
    • 编译jar包
    • JNI
      • cd项目bin\classes\ javah 包名+文件名 在当前路径生成头文件
      • 项目跟目录新建jni把头文件放入jni文件夹 加入c文件与android.mk文件
      • cd jni目录下 ndk-build 编译生成.so文件

Android.mk 是什么?

Android.mk 文件用来告知 NDK Build 系统关于Source的信息。Android.mk是GNU Makefile 的一部分,并且将Build System解析一次或者多次。
但是尽量少的在Android.mk中声明变量,也不要假定任何东西不会在解析过程中定义。
Android.mk文件语法允许我们将Source打包成一个‘modules’,‘modules’可以是:动态库,静态库。
只有动态库可以被 install/copy到应用程序包(APK),静态库则可以被链接入动态库。可以在一个Android.mk中定义一个或多个modules;也可以将同一份source 加进多个modules。
Build System帮我们处理了很多细节而不需要我们再关心。例如:你不需要在Android.mk中列出头文件和外部依赖文件。
NDK Build System自动帮我们提供这些信息。这也意味着,当用户升级NDK后,你将可以受益于新的toolchain/platform而不必再去修改Android.mk.

Android.mk 的语法

LOCAL_PATH:= $(call my-dir)
每个Android.mk文件必须定义LOCAL_PATH为开始,它用于在开发tree中查找源文件,宏my-dir则由build System提供。返回包含Android.mk的目录路径。

include $(CLEAR_VARS)
CLEAR_VARS 变量由Build  System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_XXX. 例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。
但是不清理LOCAL_PATH。这个清理动作是必须的,因为所以的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

LOCAL_MODULE := XXXXXX
LOCAL_MODULE 必须定义,以表示Android.mk中的每一个模块,名字必须唯一,不能包含空格。

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_TAGS  是指定在什么版下才会编译这个Android.mk
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码,这里将模块打包为apk包

LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_CLASS 标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中。

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
指定当前模块的后缀。一旦指定,系统在产生目标文件时,会以模块名加后缀来创建目标文件

LOCAL_PRIVILEGED_MODULE := true
LOCAL_PRIVILEGED_MODULE 是Android ROM编译时的一个变量,其与编译、安装、权限管理等几个方面都有关系。对于Android系统应用,
LOCAL_PRIVILEGED_MODULE 决定了其编译后的在ROM中的安装位置: 如果不设置或者设为false,安装位置为system/app; 如果设置为true,安装位置为system/priv-app。

LOCAL_CERTIFICATE := PRESIGNED
LOCAL_CERTIFICATE指apk的签名,可以有:
media    使用media签名文件签名
platform 使用平台签名文件签名
shared   使用shared签名文件签名
PRESIGNED 如果文件已经签过名,不需要重新签名,则使用PRESIGNED。

LOCAL_PREBUILT_JNI_LIBS := \ XXXX  、LOCAL_MULTILIB :=32  
因为Android5.1 是64位编译环境,因此需要将32位的so库提取出来,使用的32位的lib库,提取出来的lib库,放在/system/priv-app/app文件名/下

include $(BUILD_PREBUILT)
BUILD_PREBUILT               :该模块已经预先编译
它负责收集自从上次调用 include $(CLEAR_VARS)  后的所有LOCAL_XXX信息。并决定编译为什么。
BUILD_STATIC_LIBRARY     :编译为静态库。 
BUILD_SHARED_LIBRARY    :编译为动态库 
BUILD_EXECUTABLE           :编译为Native C可执行程序  
BUILD_SHARED_LIBRARY    :是Build System提供的一个变量,指向一个GNU Makefile Script。
NDK还定义了很多其他的BUILD_XXX_XXX变量,它们用来指定模块的生成方式。

$(call my-dir):获取当前文件夹路径。
$(call all-java-files-under, ):获取指定目录下的所有 Java 文件。
$(call all-c-files-under, ):获取指定目录下的所有 C 语言文件。
$(call all-Iaidl-files-under, ) :获取指定目录下的所有 AIDL 文件。
$(call all-makefiles-under, ):获取指定目录下的所有 Make 文件。
$(call intermediates-dir-for, , <app_name>, , <common?> ):获取 Build 输出的目标文件夹路径。

编译apk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := WistarHdmi
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := false

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_CERTIFICATE := platform

ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26 && echo OK),OK)
LOCAL_PROPRIETARY_MODULE := true
endif

LOCAL_JAVA_LIBRARIES := droidlogic droidlogic-tv
LOCAL_STATIC_JAVA_LIBRARIES := \
	common \
	asv4
	
LOCAL_RESOURCE_DIR := \
    $(LOCAL_PATH)/res \
    $(TOP)/frameworks/support/v17/leanback/res \
    frameworks/support/v7/preference/res \
    frameworks/support/v14/preference/res \
    frameworks/support/v17/preference-leanback/res \
    frameworks/support/v7/appcompat/res \
    $(TOP)/frameworks/support/v7/recyclerview/res

LOCAL_AAPT_FLAGS := --auto-add-overlay \
    --extra-packages android.support.v17.leanback:android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview


include $(BUILD_PACKAGE)

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := common:libs/com.wistar.common.jar \
										asv4:libs/android-support-v4.jar
include $(BUILD_MULTI_PREBUILT)

编译jar包

LOCAL_PATH:= $(call my-dir)

# the library
# ============================================================
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
  $(call all-subdir-java-files)

LOCAL_MODULE := droidlogic
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_DX_FLAGS := --core-library
LOCAL_JACK_ENABLED := disabled
include $(BUILD_STATIC_JAVA_LIBRARY) #编译jar包

#include $(BUILD_JAVA_LIBRARY)

JNI

static{
		System.loadLibrary("HelloJNI");
	}

	public static native String helloJNI();
	
	public static native int sum(int x,int y);

cd项目bin\classes\ javah 包名+文件名 在当前路径生成头文件

项目跟目录新建jni把头文件放入jni文件夹 加入c文件与android.mk文件


LOCAL_PATH       :=  $(call my-dir)
// 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
include              $(CLEAR_VARS)
// 清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)
LOCAL_MODULE     :=  hello_jni
// 设置模块的名称,即编译出来.so文件名
// 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_SRC_FILES  :=  test.cpp
// 指定参与模块编译的C/C++源文件名
include              $(BUILD_SHARED_LIBRARY)
// 指定生成的静态库或者共享库在运行时依赖的共享库模块列表。

cd jni目录下 ndk-build 编译生成.so文件

本文地址:https://blog.csdn.net/chen1103978255/article/details/108121685

《android.mk notes.doc》

下载本文的Word格式文档,以方便收藏与打印。