Android.mk的基本构成

这个Android.mk 会编译出一个hello的可执行文件,并放入system/bin

LOCAL_PATH := $(call my-dir)             #指定当前目录   include $(CLEAR_VARS)                    #引入编译变量
LOCAL_MODULE := hello                    #编译出来的模块名
LOCAL_MODULE_TAGS := optional            #编译选项便是在何种情况下编译
LOCAL_SRC_FILES := hello.c               #源文件(可以指定多个)
LOCAL_MODULE_CLASS := EXECUTABLES        #指定编译之后放置的位置(此处指示放在system/bin下)
include $(BUILD_EXECUTABLE)              #引入编译成可执行文件的规则 

参考实例

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE        := SystemCore
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := APPS
LOCAL_CERTIFICATE   := platform
LOCAL_SRC_FILES     := SystemCore_v5.2.5.7-10.apk
LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/app
include $(BUILD_PREBUILT)include $(CLEAR_VARS)
LOCAL_MODULE        := libjni_gpiocontrol.so
LOCAL_MODULE_TAGS   := optional
LOCAL_MODULE_CLASS  := SHARED_LIBRARIES
LOCAL_CERTIFICATE   := platform
LOCAL_SRC_FILES     := libjni_gpiocontrol.so
LOCAL_MODULE_PATH   := $(PRODUCT_OUT)/system/lib
include $(BUILD_PREBUILT)

代码编译规则

  • LOCAL_PATH
    指定目录,以上是一般用法指示当前目录(my-dir函数是Android编译时. build/envsetup.sh命令生成的 能够获取当前目录的路径)

  • include $(CLEAR_VARS)
    android有自己的一套代码编译规则跟编译选项等变量的定义,此变量实际是build/core/clear_vas.mk

  • LOCAL_MODULE
    必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格

  • LOCAL_MODULE_TAGS

user     模块只在user版本下编译
eng         模块只在eng版本下编译
tests       模块只在test版本下编译
optional    模块在所有版本下都编译
  • LOCAL_MODULE_CLASS
    标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中.
    编译C/C++规则build/core/definitions.mk
    LOCAL_MODULE_CLASS用于制定LOCAL_MODULE_PATH的路径所在

自己编写的Android.mk可不显示的指定LOCAL_MODULE_CLASS的值。
但当遇到include $(BUILD_PREBUILT)的预编译选项时不会指定模块模块编译输出的类型CLASS,需要在自己编写的Android.mk中明确指定LOCAL_MODULE_CLASS的值如ETC/APP等,使其值为非空,从而帮助系统确定LOCAL_MODULE_PATH的路径,比如最终编译输出LOCAL_MODULE_PATH := $(TARGRT_OUT_ETC)。

LOCAL_MODULE_CLASS := ETC               #表示放于system/etc目录
LOCAL_MODULE_CLASS := EXECUTABLES      #放于/system/bin
LOCAL_MODULE_CLASS := SHARED_LIBRARIES  #放在/system/lib下
  • LOCAL_MODULE_PATH
    目标安装路径

  • LOCAL_MODULE_RELATIVE_PATH
    指定动态库的相对路径,以各自编译对象放置的目录为参考。

android.mk文件中有
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw 改为
LOCAL_MODULE_RELATIVE_PATH := hw
后一种可以分别在lib和lib64下分别生成32位和64位的so文件
  • LOCAL_CERTIFICATE
    签名方式
testkey          普通APK,默认情况下使用。
platform        该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
shared          该APK需要和home/contacts进程共享数据。
media           该APK是media/download系统中的一环。
  • LOCAL_SRC_FILES
    源文件列表
#添加所有cpp文件MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/src/core/*.cpp)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
  • include $(BUILD_XXX)
    表示编译出来的模块类型,有三种
BUILD_EXECUTABLE     编译成可执行的模块   build/core/host_executable.mk
BUILD_STATIC_LIBRARY    编译成静态库          build/core/host_static_library.mk
BUILD_SHARED_LIBRARY    编译成动态库          build/core/host_shared_library.mk

BUILD_PREBUILT :
这种方式把文件当成编译项目,在Android.mk中copy一个file

Android系统模块编译Makefile编写规则相关推荐

  1. Android系统模块编译

    #环境生效 source build/envsetup.sh lunch 5 #清理编译 make clean #更新系统改动API make update-api #8线程编译 make -j8 # ...

  2. tiny4412开发板Android篇_2基于tiny4412的Android系统的编译

    tiny4412开发板使用的android系统版本是android5.0.2,由友善之臂公司提供,下载网址: https://pan.baidu.com/s/1pnn6N8Wpsx8PISLmKT59 ...

  3. android.mk 模块编译,通过Android.mk添加一个编译模块到系统中的顺序如下

    ①LOCAL_PATH ②CLEAR_VARS ③LOCAL_SRC_FILES ④LOCAL_CFLAGS(可选) ⑤LOCAL_MODULE ⑥LOCAL_STATIC_LIBRARIES(可选) ...

  4. Android Studio 导入 Android 系统模块并编译和调试

    FAQ: AS导入系统模块源码,并且能够编译调试,正常查看java doc ???? Android AOSP基础(五)Android Studio调试系统源码的三种方式 http://liuwang ...

  5. 一篇文章看懂makefile编写规则

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

  6. 【整理】Makefile编写规则

    Makefile 文章目录 Makefile Makefile的规则 语法 通配符 文件搜寻 伪目标 多目标 静态变量 自动生成依赖性 书写命令 嵌套执行make 定义命令包 变量使用 变量基础 变量 ...

  7. 关于Android的硬件抽象层添加进Android系统默认编译的问题

    这里主要是遇到两个问题:第一个是,自己编写的hal层源码怎么添加进Android的默认编译中去,也就是说在根目录执行make时,自己编写hal源码也会被编译.第二个问题是,编译完成后还要自动安装在指定 ...

  8. Android系统反编译FrameWork层虚拟定位方法

    首次发帖,如有不规范的地方还望多多包涵 起因是因为需要做模拟定位的功能,最终是过金融类app的定位 ,root.框架分分钟被砍死 迫于无奈,直接从操作系统入手,反正hook也不过是hook那几个系统里 ...

  9. Android Framework 模块编译

    在framework/base/core/res/res 下添加资源文件后需要先编译资源 然后编译framework 才可正常引用 进入项目根目录 cd frameworks/base/core/re ...

  10. android 单个模块编译的方法

    单个模块编译的方法 $.build/envsetup.sh  mmm packages/apps/Contacts/ 示例编译联系人  这时生成  out/target/product/generic ...

最新文章

  1. 递归/分治:归并排序
  2. Spring Boot + Vue.js 实现前后端分离(附源码)
  3. 用XCA(X Certificate and key management)可视化程序管理SSL 证书(2)--生成SSL证书请求...
  4. matlab摆线等时性程序,摆的等时性实验报告.doc
  5. linux桌面文件夹改图标,Linux 给桌面程序设置个性化图标
  6. 浅谈Java中的数据类型以及面向对象
  7. python二维列表做参数_python sum函数iterable参数为二维list,start参数为“[]”该如何理解...
  8. asp.net core安全事项(下)
  9. 前端学习(501):水平居中布局得第二种方式的优缺点
  10. 2分钟 Docker 部署 SprinBoot 集成 Flowable 工作流引擎
  11. 常州工学院计算机毕业论文多少字,研究常州工学院毕业论文(设计)系统快速使用指南.doc...
  12. ios7之后的一些更改
  13. 【STM32】按键---有关GPIO输入的那些事
  14. c语言规范标准c99中文版下载,c99标准找到了,中文HTML页面
  15. 传智播客到底在坚持什么?
  16. 实际BCI应用:异步EEG/EOG BCI手抓取和释放的可行性
  17. 你是如何看待saas行业
  18. 基于GeoEvent Processor的物联网应用案例赏析
  19. 如果程序员能早知道这些该有多好!
  20. Flutter第一天

热门文章

  1. C10K问题及解决方案
  2. kindle刷机ttl_“免费” PHICOMM 斐讯 K2路由器TTL刷机全纪录
  3. plsql连接mysql教程_PLSQL Developer连接oracle数据库配置教程
  4. Modis数据下载及后处理
  5. 《Java程序设计》期末复习资料
  6. 2013 VS 2018:五年前和今天的十大数字货币大比拼
  7. 自建rtmp直播和朋友一起异地看电影
  8. spring定时器详解
  9. 微信朋友圈api接口调用源码
  10. 西铁城手表最外圈数字是什么_手表外圈数字是什么意思 有什么作用