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
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库文件到编译环境:
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”的值是否相同,如果不同,则为真。
- Application.mk & Android.mk
- android.mk
- Android.mk
- Android.mk
- Android.mk
- Android mk
- Android.mk
- android.mk
- android.mk
- android.mk
- ANDROID-MK
- Android.mk
- Android.mk
- Android.mk
- Android.mk
- Android.mk
- Android.mk
- Android.mk
- ACM 1003 Max Sum
- SQLServer2000同步复制技术实现步骤
- RMQ问题——ST算法通俗讲解
- NSURL用法
- MongoDB和MySQL的区别
- Android.mk
- java开发使用openoffice时遇到的坑!!!!
- windbg 使用python寻找寄存器的值
- MySQL数据库修改字符集为UTF-8
- 最新JAVA调用新浪微博API之发微博
- 【React全家桶入门之三】基本的用户添加
- hash冲突原理及解决方法
- 重建二叉树 -- 漫漫算法路 刷题篇
- 正则表达式提取Json数据的方法