前言
Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握Android.mk的语法规范。
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文件也对其支持为两种方式:
2.1指定不需要混淆的native方法与变量的proguard.flags文件如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags
2.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表示编译一个动态库
标签:CERTIFICATE,platform,apk,mk,编译,Android,解析,LOCAL From: https://blog.csdn.net/u010345983/article/details/137497348