当前位置: 首页 > 工具软件 > check_mk > 使用案例 >

mk文件解析

红鸿运
2023-12-01

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

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

LOCAL_MODULE:当前模块的名称(具有唯一性)(无源码);
    LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
    Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

LOCAL_PACKAGE_NAME:当前APK应用的名称(具有唯一性)(有源码);

LOCAL_MODULE_TAGS:当前模块所包含的标签,可以包含多标签,可能值为debgu,eng,user,development或optional(默认值)
    - user: 指该模块只在user版本下才编译 
    - eng: 指该模块只在eng版本下才编译 
    - tests: 指该模块只在tests版本下才编译 
    - optional:指该模块在所有版本下都编译 

LOCAL_MODULE_PATH:表示模块编译结果将要存放的目录
    LOCAL_MODULE_PATH := $(PRODUCT_OUT)/vendor/app/
    #编译到/vendor/app/目录下
    #$(TARGET_OUT)/app:/system/app目录下

LOCAL_PRIVILEGED_MODULE :
    = true 表示app应用在目录/system/priv-app/下
    = false 表示app应用在目录/system/app/下(默认)

LOCAL_SRC_FILES:当前模块包含的所有源码文件;
    LOCAL_SRC_FILES变量必须包含将要打包如模块的C/C++ 源码。
    不必列出头文件,build System 会自动帮我们找出依赖文件。
    缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。
    LOCAL_SRC_FILES := $(call all-java-files-under, src)————有源码
    LOCAL_SRC_FILES := $(patsubst $(LOCAL_PATH)/%,%,$(shell find $(LOCAL_PATH) -name "*.apk"))————无源码

LOCAL_C_INCLUDES:C/C++所需的头文件路径;

LOCAL_STATIC_LIBRARIES:当前模块在静态链接时需要的库名;

LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库名;

LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的Java静态库;

LOCAL_JAVA_LIBRARIES:当前模块依赖的Java共享库;

LOCAL_CERTIFICATE:签署当前应用的证书名称,比如platform
    PRESIGNED————使用apk原生的签名
    platform————使用平台签名

LOCAL_BUILT_MODULE
    表示编译链接后的目标文件(文件路径+文件名)

LOCAL_BUILT_MODULE_STEM
    表示编译链接后的目标文件的文件名,带后缀

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

LOCAL_DEX_PREOPT := false
    不需要在编译过程中做odex优化

include $(BUILD_PACKAGE)
    BUILD_PACKAGE:编译打包成APK文件
    BUILD_STATIC_LIBRARY:用它来编译生成C\C++静态库(打包成.a文件)
    BUILD_SHARED_LIBRARY :指向一个 GNU Makefile 脚本(应该就是在 build/core目录下的 shared_library.mk),用它来编译生成共享库(动态链接库.so) 
    BUILD_EXECUTABLE:编译C/C++应用程序

include $(call all-makefiles-under,$(LOCAL_PATH))
    加载当前目录下的所有makefile文件,all-makefiles-under会返回一个位于当前'my-dir'路径的子目录中的所有Android.mk的列表

不编译apk:在mk文件头部加ifeq (0,1),尾部加endif

举栗子一:无源码且存在lib库

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := 工程名称

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_TAGS := optional

LOCAL_CERTIFICATE := PRESIGNED

LOCAL_PRIVILEGED_MODULE := true

#不从apk中解压lib库而直接添加。注意前面的 @符号,@标识符会将apk中的so抽离出来,拷贝到对应编译后的apk目录
LOCAL_PREBUILT_JNI_LIBS := \
    @lib/armeabi-v7a/libcryptox.so \
    @lib/armeabi-v7a/libfb.so 

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_SRC_FILES := $(patsubst $(LOCAL_PATH)/%,%,$(shell find $(LOCAL_PATH) -name "*.apk"))

include $(BUILD_PREBUILT)

举栗子二:有源码且存在jar包和lib库

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-java-files-under, java)

LOCAL_MODULE_TAGS := optional

LOCAL_PACKAGE_NAME := Sample

LOCAL_STATIC_JAVA_LIBRARIES := \
    dui \
    okio \
    okhttp123

LOCAL_STATIC_ANDROID_LIBRARIES := \
    android-support-design \
    android-support-transition \
    android-support-v13 \
    android-support-v4 \
    android-support-v7-appcompat \
    android-support-v7-cardview \
    android-support-v7-recyclerview

LOCAL_CERTIFICATE := platform

LOCAL_NO_CLUSTER_PACKAGE := true

LOCAL_PREBUILT_JNI_LIBS := \
    jniLibs/armeabi/libca.so \
    jniLibs/armeabi/libduidns.so \
    jniLibs/armeabi/libduiutils.so \
    jniLibs/armeabi/libnr.so
    
LOCAL_PRIVILEGED_MODULE := true

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
    dui:/libs/DUI-lite-SDK-for-Android-1.2.2.jar \
    okhttp123:/libs/okhttp-3.12.0.jar \
    okio:/libs/okio-1.13.0.jar
include $(BUILD_MULTI_PREBUILT)

include $(call all-makefiles-under,$(LOCAL_PATH))

题外话:

编译出来的apk运行出现如下错误:

        05-08 16:31:45.973314  2224  2224 E AndroidRuntime: FATAL EXCEPTION: main
        05-08 16:31:45.973314  2224  2224 E AndroidRuntime: Process: com.aispeech.sample, PID: 2224
        05-08 16:31:45.973314  2224  2224 E AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: "/system/priv-app/Sample/lib/arm/libca.so" is 64-bit instead of 32-bit
        05-08 16:31:45.973314  2224  2224 E AndroidRuntime:     at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
        05-08 16:31:45.973314  2224  2224 E AndroidRuntime:     at java.lang.System.loadLibrary(System.java:1657)
        05-08 16:31:45.973314  2224  2224 E AndroidRuntime:     at com.aispeech.auth.Auth.<clinit>(SourceFile:67)
        05-08 16:31:45.973314  2224  2224 E AndroidRuntime:     at com.aispeech.auth.Auth.c(SourceFile:300)
        05-08 16:31:45.973314  2224  2224 E AndroidRuntime:     at com.aispeech.DUILiteSDK.isAuthorized(SourceFile:179)

mk文件中我放置了32bit以及64bit的所有so库,然后匹配的到了64bit的so库,机器却是32bit的。

关于查看机器bit,在build.prop中:
32bit:

ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.cpu.abilist=armeabi-v7a,armeabi
ro.product.cpu.abilist32=armeabi-v7a,armeabi
ro.product.cpu.abilist64=

64bit:

ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
ro.product.cpu.abilist=armeabi-v7a,armeabi
ro.product.cpu.abilist32=armeabi-v7a,armeabi
ro.product.cpu.abilist64=arm64-v8a

关于查看编译后的apk中lib库bit:
取出so库,执行“file so库名称”

 类似资料: