说明:这里mk怎么写主要针对编译apk的mk怎么写.
首先来认识符号:
“#“ 代表注释
“\” 代表连接符号
“:=” 赋值符号
“+=” 赋值符号( “:=” 是重新赋值, “+=”则会带上之前的值)
一些函数
$(call my-dir):获取当前文件夹的路径。
$(call all-java-files-under, <src>):获取指定目录下的所有java文件。
$(call all-c-files-under, <src>):获取指定目录下的所有c文件。
$(call all-Iaidl-files-under, <src>):获取指定目录下的所有AIDL文件。
$(call all-makefiles-under, <folder>):获取指定目录下的所有Make文件。(include $(call all-makefiles-under,$(LOCAL_PATH)) 编译当前目录的所有mk文件(包括子目录))
$(call all-subdir-java-files):从当前目录查找所有java文件,包括子目录。(当前目录指当前mk文件的所在目录)
$(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>):获取Build输入的目标文件夹路径。(不知怎么用)
注意:函数all-java-files-under、all-c-files-under、all-Iaidl-files-under 中<src>需为相对路径,不能$(call all-java-files-under, $(LOCAL_PATH)/src)
--来自 xiongyeping share
mk的作用就是告诉编译器哪些文件是需要编译的。
先来个hellowrold.mk
#Android.mk 文件必须先定义 LOCAL_PATH 变量
#编译系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径
LOCAL_PATH := $(call my-dir)
#清除许多 LOCAL_XXX 变量,但不会清除 LOCAL_PATH
include $(CLEAR_VARS)
#设置后,会使用sdk的hide的api來编译(9.0编译需要)
LOCAL_PRIVATE_PLATFORM_APIS := true
#指该模块在所有版本下都编译
LOCAL_MODULE_TAGS := optional
#编译系统生成模块时所用的源文件列表(注意:路径不支持“\”)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
#指定生成APK名称
LOCAL_PACKAGE_NAME := HelloWroldMk
#编译生成APK
include $(BUILD_PACKAGE)
可以发现,几乎只用指定java文件,难到其他文件不用指定吗?当然不是,只是因为它们有默认值!
一些默认值
LOCAL_RESOURCE_DIR := res (资源默认值 当前路径的res)
LOCAL_AIDL_INCLUDES := src ((aidl文件生成java文件默认值))
LOCAL_MANIFEST_FILE := AndroidManifest.xml (AndroidManifest.xml文件也是当前路径)
LOCAL_ASSET_DIR := assets (assets文件夹目录)
LOCAL_CERTIFICATE := testkey (签名默认为testkey签名)
注意:当然如果标签对应的值不在默认路径,那就需要重新定义(参照下面)!
再来一个全一点的:
LOCAL_PATH := $(call my-dir)
#清除许多 LOCAL_XXX 变量,但不会清除 LOCAL_PATH
include $(CLEAR_VARS)
#设置后,会使用sdk的hide的api來编译(9.0编译需要)
LOCAL_PRIVATE_PLATFORM_APIS := true
#不要使用代码混淆的工具进行代码混淆
LOCAL_PROGUARD_ENABLED := disabled
#指该模块在所有版本下都编译
LOCAL_MODULE_TAGS := optional
#指定依赖的共享java类库(其实就是系统目录/system/framework/下的jar)
LOCAL_JAVA_LIBRARIES := com.noahedu \
ucache \
com.writepen \
PenWriterLib \
AirWindowLib
#指定依赖的静态java类库(一般就是第三方库,注意:此处定义的是别名)
LOCAL_STATIC_JAVA_LIBRARIES := penwrite_support_v4 \
org.apache.http.legacy \
penwrite_umeng-analytic \
penwrite_sinaweibo \
penwrite_wechat \
penwrite_qq_open
#指定资源文件
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/noah_screenShotNote/res \
$(LOCAL_PATH)/noah_studynote/res \
$(LOCAL_PATH)/noah_copybook/res \
$(LOCAL_PATH)/noah_notepad/res \
$(LOCAL_PATH)/noah_penEntry/res \
$(LOCAL_PATH)/noah_penPicker/res \
$(LOCAL_PATH)/core_connection/src/main/res \
$(LOCAL_PATH)/penwrite/src/main/res \
$(LOCAL_PATH)/base_pro_common/src/main/res
#指定编译系统生成模块时所用的源文件列表(注意:路径不支持“\”)
LOCAL_SRC_FILES := $(call all-java-files-under, noah_copybook/src) \
$(call all-java-files-under, noah_notepad/src) \
$(call all-java-files-under, noah_penEntry/src) \
$(call all-java-files-under, noah_penPicker/src) \
$(call all-java-files-under, noah_screenShotNote/src) \
$(call all-java-files-under, noah_studynote/src) \
$(call all-java-files-under, core_connection/src/main/java) \
$(call all-java-files-under, penwrite/src/main/java) \
$(call all-java-files-under, base_pro_common/src/main/java) \
noah_copybook/src/com/noahedu/poem/service/IPoemData.java \
noah_penPicker/src/com/noahedu/penpicker/aidl/PenPickerAIDL.aidl \
noah_screenShotNote/src/com/noahedu/ssnote/aidl/SSNoteAidl.aidl \
noah_copybook/src/com/noahedu/poem/service/IPoemService.aidl
# 解决AIDL编译的问题(不要包含包名)
aidl_dirs = noah_copybook/src
LOCAL_AIDL_INCLUDES += $(LOCAL_PATH)/$(aidl_dirs)
#添加包名,指定R资源生成别名(AAR和Module都需要添加包名,不然可能引用不到类或资源)
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages com.noahedu.studynote \
--extra-packages com.noahedu.ssnote \
--extra-packages com.noahedu.base_lib \
--extra-packages com.noahedu.base_pro_common \
--extra-packages com.noahedu.core_connection \
--extra-packages com.noahedu.copybook \
--extra-packages com.noahedu.notepad \
--extra-packages com.noahedu.penentry \
--extra-packages com.noahedu.penpicker
#指定androidmainfest.xml目录
LOCAL_MANIFEST_FILE := /penwrite/src/main/AndroidManifest.xml
#指定签名
LOCAL_CERTIFICATE := platform
#指定生成APK名称
LOCAL_PACKAGE_NAME := PenWrite
#指定项目用到的32位的so
LOCAL_PREBUILT_JNI_LIBS_arm := \
/libs/armeabi-v7a/libgostudy_camera.so \
/libs/armeabi-v7a/libAs.so \
#指定项目用到的64位的so
LOCAL_PREBUILT_JNI_LIBS_arm64 := \
/libs/arm64-v8a/libgostudy_camera.so \
/libs/arm64-v8a/libAs.so \
#构建32位静态库(可选值“32”、“64”、“both”等)
LOCAL_MULTILIB := 32
#指定需要引用的JNI中的共享库
LOCAL_JNI_SHARED_LIBRARIES += libjni_freestylus
#编译生成APK
include $(BUILD_PACKAGE)
#清除许多 LOCAL_XXX 变量,但不会清除 LOCAL_PATH
include $(CLEAR_VARS)
#设置后,会使用sdk的hide的api來编译(9.0编译需要)
LOCAL_PRIVATE_PLATFORM_APIS := true
#指定预编译jar库的规则(指定别名所对应的第三方库的路径)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := penwrite_support_v4:base_lib/libs/android-support-v4.jar \
penwrite_umeng-analytic:base_lib/libs/umeng-analytics.jar \
penwrite_wechat:base_lib/libs/libammsdk.jar \
penwrite_qq_open:base_lib/libs/open_sdk_r5886_lite.jar \
penwrite_sinaweibo:base_lib/libs/sinaweibo.jar
#开始编译第三方库
include $(BUILD_MULTI_PREBUILT)
# 编译当前目录的所有mk文件(包括子目录)
#include $(call all-makefiles-under,$(LOCAL_PATH))
mk编译错误临时解决方案,直接编译apk文件
#临时解决方案为直接编译打包好的apk文件
#编译系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径
LOCAL_PATH:= $(call my-dir)
#清除许多 LOCAL_XXX 变量,但不会清除 LOCAL_PATH
include $(CLEAR_VARS)
#disabled为不混淆
LOCAL_PROGUARD_ENABLED := disabled
#编译完成后生成的apk名
LOCAL_MODULE := IntelligentLearningScheme
#需要编译的apk文件
LOCAL_SRC_FILES := app-release.apk
#暂不知
LOCAL_MODULE_CLASS := APPS
#暂不知
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#签名
LOCAL_CERTIFICATE := testkey
#编译生成apk
include $(BUILD_PREBUILT)
最后的也是最重要善用Log调试(当你苦恼不知道怎么办时就要开始调试了)
LOCAL_PATH := $(call my-dir)
#调试代码1
$(warning '111111111111111111111111111111111111111111111')
include $(CLEAR_VARS)
LOCAL_PRIVATE_PLATFORM_APIS := true
#调试代码2
$(warning “111111111111111111111111111111111111111111111”)
$(warning "222222222222222222222$(base_aidl)/src/com/noahedu/search/IMiddleSchoolTutorshipExists.aidl")
$(warning "3333333333333333$(LOCAL_PATH)/../../library/yxp_src/base_pro_yxb/base_lib_aidl/src")
输出结果(示例):
参考:
https://developer.android.google.cn/ndk/guides/android_mk?hl=zh_cn
https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/
https://blog.csdn.net/wzy_1988/article/details/39958727
网友评论