美文网首页
mk怎么写?

mk怎么写?

作者: duoduo7628 | 来源:发表于2020-04-11 20:37 被阅读0次

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

    相关文章

      网友评论

          本文标题:mk怎么写?

          本文链接:https://www.haomeiwen.com/subject/umgymhtx.html