美文网首页
Android.mk

Android.mk

作者: 棒棒0_0 | 来源:发表于2020-06-10 15:32 被阅读0次

    LOCAL_PATH:= $(call my-dir)
    一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)

    include $(CLEAR_VARS)
    CLEAR_VARS由编译系统提供((可以在 android 安装目录下的/build/core/config.mk 文件看到其定义,为 CLEAR_VARS := $(BUILD_SYSTEM)/clear_vars.mk)),指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES , 等等…),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的

    LOCAL_MODULE_TAGS := optional
    user: 指该模块只在user版本下才编译
    eng: 指该模块只在eng版本下才编译
    tests: 指该模块只在tests版本下才编译
    optional:指该模块在所有版本下都编译

    LOCAL_CERTIFICATE := platform
    这个功能和 android:sharedUserId和LOCAL_CERTIFICATE 相关。
    都是用系统的签名来对apk 进行签名。其中签名的文件是:build\target\product\security",下面的platform.pk8和platform.x509.pem两个文件
    签名的工具是:
    Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk"
    其中通过 android:sharedUserId 也已可应用共享同一个进程,但是如果签名不一样是没有办法共享的,其中签名问题还设计到很多,之后可以补充。
    其中这个属性还可以有其他的赋值比如:
    LOCAL_CERTIFICATE := PRESIGNED 表示 这个apk已经签过名了,系统不需要再次 签名;
    LOCAL_CERTIFICATE := platform 表示为系统签名
    LOCAL_CERTIFICATE := media
    用于指定签名时使用的KEY,如果不指定,默认使用testkey,LOCAL_CERTIFICATE可设置的值如下:
    LOCAL_CERTIFICATE := platform 该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system
    LOCAL_CERTIFICATE := shared 该APK需要和home/contacts进程共享数据。
    LOCAL_CERTIFICATE := media 该APK是media/download系统中的一环。
    LOCAL_CERTIFICATE := testkey 普通APK,默认情况下使用。、
    对于使用eclipse编译的apk,其实 是用testkey 来签的名;我们也可以用signapk.jar来手动进行签名,其源码在build/tools/signapk下,编译后在out/host/linux-x86/framework/signapk.jar,也可以从网上下载。使用方法,例如:把签名修改为platform:Java -jar ./signapk platform.x509.pem platform.pk8 input.apk output.apk (platform.x509.pem platform.pk8在build/target/product/security获取)。build/target/product/security获取)。

    LOCAL_PROGUARD_ENABLED := disabled
    是否混淆

    LOCAL_PACKAGE_NAME := Name
    给这个package 确定name

    LOCAL_PRIVATE_PLATFORM_APIS := true
    是否使用系统@hide api

    LOCAL_PRIVILEGED_MODULE := true
    对于Android系统应用,LOCAL_PRIVILEGED_MODULE 决定了其编译后的在ROM中的安装位置:
    如果不设置或者设置为false,安装位置为system/app;
    如果设置为true,安装位置为system/priv-app。

    LOCAL_AAPT_FLAGS := --auto-add-overlay
    aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。也就是上面说的配置

    LOCAL_PROGUARD_FLAG_FILES := proguard.flags
    针对android 选择user版本进行编译的时候,会出现proguard错误,我们需要知道的事情
    1.proguard是做什么的,他的作用是将java代码进行混淆的工具
    2.因为proguard是混淆工具,所以android的mk文件也对其支持为两种方式:
    1.指定不需要混淆的native方法与变量的proguard.flags文件如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
    2.制定编译的工程,不要使用代码混淆的工具进行代码混淆如:LOCAL_PROGUARD_ENABLED := disabled
    3.不设置,默认使用LOCAL_PROGUARD_ENABLED := full.即将该工程代码全部混淆

    LOCAL_DEX_PREOPT := false
    odex文件简单来说就是android为了优化启动速度而将classes.dex文件提取出来的一个产物
    不生成odex,只生成apk,将 LOCAL_DEX_PREOPT 的值改为 false 即可

    include $(BUILD_SHARED_LIBRARY)
    BUILD_SHARED_LIBRARY表示编译一个静态库

    include $(BUILD_PACKAGE)
    BUILD_PACKAGE表示编译一个APK包

    include $(BUILD_SHARED_LIBRARY)
    BUILD_SHARED_LIBRARY表示编译一个动态库

    相关文章

      网友评论

          本文标题:Android.mk

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