Android.mk

来源:互联网 发布:淘宝店铺装修页头图片 编辑:程序博客网 时间:2024/06/05 07:04

声明:此文非本人原创,为网上搜索的资料修改整理后所得(如有侵权,请留言说明)

Android.mk文件

 将那个apk打包进系统的宏控制

ifeq ($(TARGET_BUILD_VARIANT_TOPPAY),true)      判断配置中的宏TARGET_BUILD_VARIANT_TOPPAY是否等于true
 PRODUCT_PACKAGES += \
                 ToppayTl
 else
 PRODUCT_PACKAGES += \
                ToppaySmt
 endif
宏在customize/res/z507/Z507HZA_TOPODM_TLPAY/customize_projectconfig.mk中添加   TARGET_BUILD_VARIANT_TOPPAY = true

文件夹app下的app.mk将多个文件夹加入编译
PRODUCT_PACKAGES += ServiceMenu\
                    AgingTestExt \
                    Calculator \
                    QrCodeScanner \
                    PrintAging
PrintAging文件夹下的Android.mk用于控制其编译

将PrintAging1.apk加入编译并生成PrintAging2.apk

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

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

LOCAL_MODULE表示Android.mk中的每一个模块。名字必须唯一且不包含空格。Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。生成apk时为包名
LOCAL_MODULE := PrintAging      

LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
LOCAL_SRC_FILES += src/com/topwise/agingtestext/ITopwiseAgingtest.aidl
生成apk时为apk全名
LOCAL_SRC_FILES := PrintAging.apk

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

LOCAL_MODULE_CLASS 指定文件类型,apk文件用APPS, 并且 会检查 是否是apk文件,动态库so文件用SHARED_LIBRARIES ,bin文件用EXECUTABLES,其他文件 用ETC
LOCAL_MODULE_CLASS := APPS

使用平台签名文件签名。
LOCAL_CERTIFICATE := platform

a.默认预置apk到system/app/目录(普通系统apk,不可卸载)

b.预置apk到system/priv-app/目录(系统核心apk,不可卸载)
LOCAL_PRIVILEGED_MODULE := true

c.预置apk到data/app/目录并且卸载后不需要再会恢复)

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

d.预置apk到data/app/目录并且卸载后恢复出厂可以恢复)
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
   
    

include $(BUILD_PREBUILT)


LOCAL_OVERRIDES_PACKAGES := AgingTest

使 AlarmClock不会加入到编译系统中,不会生成 AlarmClock.apk。

include $(BUILD_PACKAGE)
编译打包成APK文件

包含lib库文件的apk
情况一:对于预置到data/app/目录下的apk,包括可恢复和不可恢复(即上一段 c 和 d)), 一般lib库文件可以不用手动添加,apk在首次运行时,会自动将自身的lib库抽取安装到自身的根目录;
情况二:对于预置到system/app/ 和 system/priv-app 目录下的apk(即上一段 a 和 b)),因为在android系统中,system分区是不允许应用执行写操作的,因此需要在Android.mk脚本中进行配置,手动添加lib库文件到编译环境,以便lib库文件在编译之后拷贝到对应编译后的apk目录下,否则apk执行时会因找不到lib库而报错;

添加lib库文件到编译环境:

include $(BUILD_STATIC_JAVA_LIBRARY) : 编译生成静态jar
include $(BUILD_JAVA_LIBRARY) : 编译生成共享jar

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_STATIC_JAVA_LIBRARIES := jarlib1 wqtest llyLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_SDK_VERSION := currentLOCAL_PACKAGE_NAME := PrintAgingLOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)include $(BUILD_PACKAGE)##################################################include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := jarlib1:jar/classes.jar \                                        wqtest:jar/sc-light-jdk15on-1.47.0.2.jar \                                        lly:jar/zxing.jarinclude $(BUILD_MULTI_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))

添加在项目jar目录jar包    

方法一 不从apk中解压lib库而直接添加:
LOCAL_PREBUILT_JNI_LIBS = \
@lib/armeabi-v7a/libcryptox.so \
@lib/armeabi-v7a/libfb.so
@标识符会将apk中的so抽离出来,拷贝到对应编译后的apk目录;
方法二 手动解压lib文件到当前apk的编译目录并添加:
LOCAL_PREBUILT_JNI_LIBS = \
lib/armeabi-v7a/libcryptox.so \
lib/armeabi-v7a/libfb.so

目前一般的apk运行环境为32位Android系统环境,当在64位Android系统中预置带有lib库的apk时,手动添加lib库文件到编译环境后,默认情况下编译环境会在编译后apk目录建立64位的环境的lib库路径 /lib/arm64,虽然编译过程未报错,但之后在执行该apk时,会出现apk因找不到lib库而报错
因此,需要在Android.mk中对当前apk编译环境进行配置,配置的方法常见的也有两种:
1.指定编译目标为 32位 或 64位  
LOCAL_MULTILIB :=
###可选值 /32/64/first/both
2.指定目标lib库的类型
LOCAL_MODULE_TARGET_ARCH :=
###可选值  arm/arm x86/arm64

Android.mk里添加 LOCAL_SDK_VERSION := current 后不能使用@hide API
# 若是添加,编译时会忽略源码隐藏的API,导致编译失败

android sdk中的两类特殊的API    
1 . Internal API   翻译为内部API,理解为供sdk内部使用的API。
2 . Hide API   在源码中看到使用@hide 标记的方法或类,就是hide的。    这类接口本意是要公开,但是当前阶段仍然不稳定或未开发完成。所以暂时不推荐开发者调用。


'+='是追加的意思;‘$’表示引用某变量的值。 文件之间可以用空格或Tab键进行分割,换行请用"\" 
加入判断

Android.mk文件中

$(warning 'wqtest gogogo')
$(warning wqtest_TOPPAY_FACTORY_TEST=$(TOPPAY_FACTORY_TEST))

#打印log   wqtest_TOPPAY_FACTORY_TEST=***

ifeq ($(strip $(TOPPAY_FACTORY_TEST)), yes) 

判断customize/res/Z505/Z505FAB_ENG/proj.cfg中的TOPPAY_FACTORY_TEST是否为yes。为yes时true;没有配或者不为yes时false;
PRODUCT_PACKAGES += PrintAging
endif

 ifneq (<arg1>;, <arg2>;) 比较参数“arg1”和“arg2”的值是否相同,如果不同,则为真。







原创粉丝点击