mk怎么写?

2020-04-11  本文已影响0人  duoduo7628

说明:这里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

上一篇下一篇

猜你喜欢

热点阅读