Android编译系统 - 预装app -> Android.mk

Android-makefile

一、Android.mk概述

Android.mk file用来向编译系统描述你的源代码。具体来说:-该文件是GNU Makefile的一小部分,会被编译系统解析一次或更多次的build系统。这个文件的语法允许把你的源代码组织成模块,如:静态库、共享库(将被安装/复制到您的应用软件包);我们可以在每一个Android.mk file中定义一个或多个模块,也可以在几个模块中使用同一个源代码文件。

二、Android.mk的常用构成

  • LOCAL_PATH := $(call my-dir) #指定当前目录

  • include $(CLEAR_VARS) #引入编译变量

  • LOCAL_MODULE := hello #编译出来的模块名

  • LOCAL_MODULE_TAGS := optional #编译选项便是在何种情况下编译

  • LOCAL_SRC_FILES := hello.c #源文件(可以指定多个)

  • LOCAL_MODULE_CLASS := EXECUTABLES #指定编译之后放置的位置

  • include $(BUILD_EXECUTABLE) #引入编译成可执行文件的规则

  • LOCAL_PACKAGE_NAME #指定APP应用名称

  • LOCAL_PRIVATE_PLATFORM_APIS := true #设置后,会使用sdk的hide的api來编译

  • LOCAL_USE_AAPT2 := true #aapt 是编译和打包资源的工具。而aapt2是在aapt上做了优化

  • LOCAL_JNI_SHARED_LIBRARIES := libbluetooth_jni #声明要使用到的共享 JNI 库的名称

  • LOCAL_JAVA_LIBRARIES := javax.obex telephony-common services.net #指定依赖的共享java类库,这个是编译时依赖,最终不会打包

  • LOCAL_STATIC_JAVA_LIBRARIES := \

    com.android.vcard \

    bluetooth.cc\

    services.net \

    libprotobuf-java-lite \ #指定依赖的静态java类库,最终会打包到apk里面。引用多个的时候,可以像上面那样写。

  • LOCAL_STATIC_ANDROID_LIBRARIES := android-support-v4 #声明要调用 android 的包,这里是v4包

  • LOCAL_REQUIRED_MODULES := libbluetooth #指定依赖的模块。一旦本模块被安装,通过此变量指定的模块也将被安装

  • LOCAL_PROGUARD_ENABLED := disabled #混淆配置,默认为full obfuscation,全代码混淆,disabled不开启

  • include $(BUILD_PACKAGE) #编译成APK 文件

  • include $(BUILD_STATIC_JAVA_LIBRARY) #生成静态JAVA库

三、参考实例

3.1 共享库mk

下面这是一个生成共享库的mk文件实例。

LOCAL_PATH:= $(call my-dir)

include$(CLEAR_VARS)

LOCAL_MODULE:=helloworld

LOCAL_SRC_FILES:= helloworld.c

include$(BUILD_SHARED_LIBRARY)

我们来解释一下这几行代码

LOCAL_PATH := $(call my-dir)

Android.mk file必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

include $( CLEAR_VARS)

CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等…),

除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

LOCAL_MODULE:= helloworld

LOCAL_MODULE变量是必须定义的,它是你在Android.mk文件中描述的每个模块的标识。它必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,例如一个被命名为’foo’的共享库模块,将会生成’libfoo.so’文件。

LOCAL_SRC_FILES:= helloworld.c

LOCAL_SRC_FILES变量包含将要编译打包进模块中的源文件列表。

include$(BUILD_SHARED_LIBRARY)

需要编译成什么模块类型,BUILD_SHARED_LIBRARY是编译系统提供的变量,它表示的是生成一个动态库;它指向一个GNU Makefile脚本(应该就是在build/core目录下的shared_library.mk)。

3.2 预编译应用程序mk

LOCAL_PATH := $(call my-dir)
ifeq ($(strip $(SYSTEMUI_SUPPORT)),yes)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_MODULE := SystemUI
ifeq ($(TARGET_BUILD_VARIANT),user)
LOCAL_SRC_FILES := $(LOCAL_MODULE)-release.apk
else
LOCAL_SRC_FILES := $(LOCAL_MODULE)-debug.apk
endif
LOCAL_MULTILIB := both
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
endif

接着分析下新增的部分变量:

ifeq ($(strip $(SYSTEMUI_SUPPORT)),yes)

ifneq : 判断语句,用于比较两个参数,如果两个参数不等,则该语句通过。

# 如果a和b不相等,则do something
ifneq ($(a), $(b))
    # do something
endif

这里是判断是否需要继续执行;

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_TAGS,表示模块在什么版本中编译,optional 是模块在所有版本下都编译。

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_CLASS 定义模块的分类。根据分类,生成的模块文件会安装到目标系统相应的目录下。例如:APPS:安装到/system/app下;SHARED_LIBRARIES:安装到/system/lib下;EXECUTABLES:安装到/system/bin下;ETC:安装到/system/etc下;

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_MODULE_SUFFIX 指定当前模块的后缀。一旦指定,系统在产生目标文件时,会以模块名加后缀来创建目标文件。这里是指定为apk。

LOCAL_CERTIFICATE := platform

LOCAL_CERTIFICATE 签名认证,platform表示使用平台签名文件签名。

LOCAL_MULTILIB := both

指定编译目标为 32位 或 *64位,*它的值可以是32,64,both,表示可以编译的apk可以运行在32位、64位,或者32&64位硬件平台。

LOCAL_PRIVILEGED_MODULE := true

LOCAL_PRIVILEGED_MODULE 与编译、安装、权限管理等几个方面都有关系,不设置或者设置为false,安装位置为system/app;为true,安装位置为system/priv-app。

四、实例

LOCAL_PATH := $(my-dir)
###############################################################################
$(warning [xin.wang] : Build ApeFtm_Mtk_USER)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := ApeFtm_Mtk_USER
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

LOCAL_REQUIRED_MODULES := ApeFtm_Mtk_USER_permission.xml
include $(BUILD_PREBUILT)

# Permissions pre-grant
include $(CLEAR_VARS)
LOCAL_MODULE := ApeFtm_Mtk_USER_permission.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)

你可能感兴趣的:(android,vscode,ide)