原标题:粉丝投稿 | 谈谈Android.mk

本文由公号【你看上去真美】(微信号:tmac_lover)粉丝投稿,目前工作是Android系统rom定制开发,有同行可以关注一下。

1. 为什么是Android.mk

不知道有没有人想过,Android源码里为什么每个模块的编译文件叫Android.mk? 而不是别的什么名字呢。这是因为main.mk明确指定了,以每个子目录下的Android.mk作为模块编译的起始makfile文件。

[build/core/main.mk]

subdir_makefiles := $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git $(subdirs) Android.mk) $(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk)))

所以在Android源码里,我们每次看一个模块是如何编译时,总是把模块所在目录里的Android.mk作为编译的起始Makefile文件。

2. 如何阅读Android.mk

可能有朋友在琢磨是不是Android的编译系统重新定义了一套和GNU Makefile完全不同的规则?答案是否定的。其实在编译源码时,无论是直接使用make全编,还是使用mmmmm命令全编译单个模块,我们所遵循的原则和GNU Makefile是一模一样的,最终都是使用相同的make命令,所有GNU Makefile规则在Android源码里照样适用,只不过Android封装了宠大且复杂的编译系统,使得我们可以清晰简便的做修改。

对于Android源码的build系统,比较复杂,涉及的知识点也相对较多,这里只以Android.mk作为切入点,剩下的以后有机会展开,由点及面,对build系统熟悉起来。

以Android源码里一个系统APP的Android.mk文件作为例子:

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) src/com/android/music/IMediaPlaybackService.aidl LOCAL_PACKAGE_NAME := Music LOCAL_PROGUARD_FLAG_FILES := proguard.flags include $(BUILD_PACKAGE)

具体解释如下:

每一个Androi.mk文件都必须以定义LOCAL_PATH变量开头,my-dir是由build系统定义的函数,作用是返回当前Android.mk在源码中目录

CLEARVARS是由build系统所定义的一个变量,它的值是build/core/clear_vars.mk,作用是清除很多LOCAL开头的变量,但是不清理LOCAL_PATH,所以你可以当include $(CLEAR_VARS)作为每个模块编译的开始。

LOCAL_MODULE_TAGS用于定义当前模块在什么编译模式中被编译,它的值有eng, user, tests, optional。

LOCAL_PACKAGE_NAME变量指明了编译出apk的名字,只有当前模块是一个应用(APP)才使用LOCAL_PACKAGE_NAME; 其余情况,无论so或jar包,全部都使用LOCAL_MODULE变量。

LOCAL_SRC_FILES变量指明编译使用的源码文件,all-java-files-under是由build系统定义的函数,作用是列出指定目录下所有的java文件。

LOCAL_PROGUARD_FLAG_FILES指定混淆文件,上例中表明当前目录下proguard.flags作为混淆文件。

BUILD_PACKAGE也是由build系统定义的一个变量,值是build/core/package.mk, 表示编译出一个apk文件。一般来讲,类似include $(BUILD_PACKAGE)可以作为一个模块编译的结束。

和BUILD_PACKAGE变量类似的还有好几个,这里列出其中常见的一部分:

BUILD_JAVA_LIBRARY — build/core/java_library.mk; 表示编译一个jar包, 里面是DEX格式的文件

BUILD_STATIC_JAVA_LIBRARY – build/core/static_java_library.mk; 也编译一个jar包,但是里面每个java文件所对应的class文件都存在

BUILD_EXECUTABLE — build/core/executable.mk; 编译一个可执行的bin程序

BUILD_PREBUILT — build/core/prebuilt.mk;用于集成第三方的jar包或者so库等

3. 常见变量

LOCAL_STATIC_JAVA_LIBRARIES/LOCAL_JAVA_LIBRARIES - 指明编译当前模块所依赖的jar包

LOCAL_CERTIFICATE := platform - 指明使用platform key来对当前模块进行签名

LOCAL_AAPT_FLAGS - Android源码里使用aapt打包jar包或apk文件,这个变量可以定义aapt打包参数,比如 :—auto-add-overlay, —extra-packages

LOCAL_PROGUARD_ENABLED - 是否进行混淆

4. 调试手段

我们调试代码的时候,最常用的手段就是打log, 在不明白的地方,或者不知道走了哪个if分支,或者想看看变量的值是什么,都可以打log看。

Android build系统里也可以打Log,使用函数warning / info / error。

需要注意的是,error函数会让编译直接停下来,所以一般用warning和info

使用示例(以warning为例,其它两个类似):

打印普通字符串(hello world):$(warning hello world)

打印变量的值:$(warning $(LOCAL_PACKAGE_NAME))

变量和字符串组合打印:$(warning thisapk is $(LOCAL_PACKAGE_NAME))

下面以一个真实的App编译为例,在这个Android.mk里,可能我不知道PLATFORM_VERSION的值,所以我不知道它会不会进ifeq语句,这时打个log, 编译一下:

include $(CLEAR_VARS)... ...$(warning tmac_lover $(PLATFORM_VERSION))ifeq ($(PLATFORM_VERSION), 6.0) LOCAL_STATIC_JAVA_LIBRARIES += upgrade_httpclientendif... ...include $(BUILD_PACKAGE)

使用mm -B命令编译apk, 从编译输出中可以看到下面这些,6.0就是PLATFORM_VERSION的值。

packages/apps/TVUpdate/Android.mk:29: tmac_lover 6.0

完。

本公号介绍

责任编辑:

android.mk 比较字变量,粉丝投稿 | 谈谈Android.mk相关推荐

  1. android.mk 比较字变量,Android.mk的用法和基础

    一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...

  2. android 代码中使用dp,简单谈谈Android中SP与DP的区别

    从一开始写Android程序,就被告知这些常识 一.dp(或者dip device independent pixels) 一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp=1px.不同 ...

  3. android客户端和服务端交互,谈谈android客户端和网站数据交互的实现

    android客户端一般不直接访问网站数据库,而是像浏览器一样发送get或者post请求,然后网站返回客户端能理解的数据格式,客户端解析这些数据,显示在界面上,常用的数据格式是xml和json. 可以 ...

  4. Android.mk 打印变量信息

    编译android项目的时候,遇到了添加一个包含opencv的Opencv.mk之后,就存在编译不通过的情况. 怀疑是添加 include Opencv.mk 之后, 就把原来 Android.mk ...

  5. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  6. mac 电脑android环境变量设置,mac上Android环境变量配置

    1.AndroidSDK路径查看 (1)AndroidStudio: 菜单栏AndroidStudio > Preferences > Appearences&Behavior & ...

  7. android java静态库,Android make 中变量记录

    转换mk文件到bp文件 $ out/soong/host/linux-x86/bin/androidmk Android.mk > Android.bp 编译不同类型的模块 编译成 Native ...

  8. android属于数据库管理系统,详细谈谈Android系统中的SQLite数据库的应用

    数据库是按照数据结构来组织.存储和管理数据的仓库,而在信息话的社会,数据库又不单单仅限与数据的相关内容,现在数据库技术是管理信息系统.办公自动化系统.决策支持系统等各类信息系统的核心部分,而SQL是结 ...

  9. Android SDK环境变量配置及连接真机

    目录 一.SDK环境变量配置 二.Android设备连接调试 三.常用adb命令 一.SDK环境变量配置 参考: Android-SDK下载及安装配置教程_勒布朗-孟的博客-CSDN博客_androi ...

最新文章

  1. 2009-徘徊-开场白
  2. 博客园第一天,开放封闭原则
  3. mysql读写分离,主从配置
  4. Select模型原理
  5. 一周一论文(翻译)——[VLDB 18] Chi:分布式流处理系统下可扩展的、可编程的控制计划模块
  6. 【LDA学习系列】LDA-Python库
  7. hdu 3706 Second My Problem First 单调队列
  8. 如何设计实现一个地址反解析服务?
  9. 边缘设备上的实时AI人员检测:以实时模式检测视频中的人员
  10. 开源管理软件 OpenEMR 被曝多个漏洞,可被用于攻陷医疗基础设施
  11. 贷前调查必须采集的十大客户信息
  12. 有关彩票的python编程教程入门_python入门教程NO.6 用python做个简单的彩票号码统计分析工具...
  13. elpida颗粒_内存涨价三星背锅,晶圆颗粒远远不止这几家!
  14. STM32入门:STM32F401CDU6库函数工程文件搭建
  15. 第十五周助教工作总结——NWNU李泓毅
  16. 【毕设记录日记】Python基础内容笔记整理6:函数
  17. 摩尔定律即将走向终结?对未来更广阔世界影响的55个预测!
  18. 如何看待国企纷纷卸载微软Office改用金山WPS?
  19. 简单介绍十几款常用的画架构图流程图的软件
  20. 上海中兴软件测试面试,中兴综合测评没做完

热门文章

  1. java session 同步_session同步
  2. matlab写出二维数组
  3. 求离散马尔科夫链的平稳分布+按照一定概率分布生成想要的样本
  4. python下载之后无法启动_安装后启动时,适用于Python的Eric IDE崩溃
  5. c语言汉字属于什么类型_狠准!你的名字属于什么类型 就是什么性格
  6. Java常用类(1)--字符串相关类String、StringBuffer、StringBuilder全面知识
  7. java案例源代码_求java案例源代码 越多越好!
  8. 建立时间、保持时间与亚稳态
  9. 删除某个时间段之前的文件
  10. 一种table超出高度自动出滚动条的解决方案