Android.mk变量解析

37 篇文章 0 订阅
1 篇文章 0 订阅

前言

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表示编译一个动态库

  • 103
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值