Android5.1系统Android.mk讲解(以内置第三方apk的Android.mk为例)

1. 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.

2. Android.mk 的语法

  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. # Module name should match apk name to be installed
  4. LOCAL_MODULE := XXXXXX
  5. LOCAL_MODULE_TAGS := optional
  6. LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
  7. LOCAL_MODULE_CLASS := APPS
  8. LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
  9. LOCAL_PRIVILEGED_MODULE := true
  10. LOCAL_CERTIFICATE := PRESIGNED
  11. LOCAL_PREBUILT_JNI_LIBS := \
  12.     @lib/armeabi/libbutterfly.so \
  13.     @lib/armeabi/libluajava.so \
  14.     @lib/armeabi/libNinepatch.so \
  15.     @lib/armeabi/libSogouAgc_v1.so \
  16.     @lib/armeabi/libsogouupdcore.so \
  17.     @lib/armeabi/libweibosdkcore.so
  18. LOCAL_MULTILIB := 32
  19. include $(BUILD_PREBUILT)


语法讲解:

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变量,它们用来指定模块的生成方式。

猜你喜欢

转载自blog.csdn.net/m0_37526672/article/details/80411294