基本语法

1. :=是赋值的意思,+=是追加的意思,$是引用某变量的值
2. 清理所有已经设定好的变量 include $(CLEAR_VARS)

支持的编译目标?

1)APK程序,一般的Android程序,编译打包生成apk文件
  2)JAVA库,java类库,编译打包生成jar文件
  3)  C\C++应用程序,可执行的C\C++应用程序
  4)C\C++静态库,编译生成C\C++静态库,并打包成.a文件
  5)C\C++共享库, 编译生成共享库(动态链接库),并打包成.so, 有且只有共享库才能被安装/复制到您的应用软件(APK)包中。

在Android.mk中的写法:
include $(BUILD_PACKAGE)
include $(BUILD_STATIC_JAVA_LIBRARY)
include $(BUILD_PREBUILT)
include $(BUILD_MULTI_PREBUILT)
如果你想引用所有子文件夹下的mk文件

LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)

如何把so库编译到/system/lib下面?

1. 在一个编译单元的Android.mk中,比如Jar,Apk,添加本地Native库, 这个库的位置假如是libs/armeabi/libxxx.so
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libxxx
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_SRC_FILES := libs/armeabi/libxxx.so
include $(BUILD_PREBUILT)

2. 如果是上一步编译的是Jar包,那么在包含这个Jar包的Apk中,添加:
LOCAL_REQUIRED_MODULES := libxxx
如果上一步编译的是Apk,直接添加在上一步所用的Android.mk中。

3. 整个系统编译,编译完系统,so库就进入到了system/lib下面

如何用一个静态Jar引用别的静态jar?

1. 写上引用Jar包的名字:
LOCAL_STATIC_JAVA_LIBRARIES := okhttp270 okhttpws okio

2. 需要让系统可以找到jar包,所以需要做一个映射,此时需要注意,系统中是不是有别的已经include好了的Android.mk已经定义好了这个名字,如果有,编译报错
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
okhttp270:libs/okhttp-2.7.0.jar \
okhttpws:libs/okhttp-ws-2.7.0.jar \
okio:libs/okio-1.6.0.jar

include $(BUILD_MULTI_PREBUILT)

如果这个Jar/APK需要别的Jar的资源,怎么办?

资源文件是单独由AAPT编译的,查wiki,AAPT是:
AAPT
aapt stands for Android Asset Packaging Tool. This tool is part of the SDK (and build system) and allows you to view, create, and update Zip-compatible archives (zip, jar, apk). It can also compile resources into binary assets.

Build scripts and IDE plugins utilize this tool to package the apk file that constitutes an Android application.

In the SDK, aapt is found in the $ANDROID_HOME/platforms/$SDK/tools/ directory of the SDK (where $SDK is the name of some Android version, like android-2.1).
In the Android open source build environment, aapt is found in $ANDROID_BUILD_HOME/out/host/linux-x86/bin

而基本做法是把所有引用到的Jar包里的R.java合成一个R.java,再放入一些需要引用的路径下。

怎么做呢?
1. 写上需要引用的路径:
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
$(LOCAL_PATH)/../../Support/res \
$(LOCAL_PATH)/../../AndroidSupport/res

2. 将生成的Resource,也就是R.java放到本地的一个package下面,从而使得代码不报编译错误。
LOCAL_AAPT_FLAGS := --auto-add-overlay --extra-packages android.support.xxxx
--extra-packages android.support.xxxx这一句的意思是说在out生成的包里面形成一个/src/android/support/xxxx的路径,把R.java放进去,这样代码里import android.support.xxxx.R就能找得到了。

如何把一些已经编译好的Apk放入/system/app?

include $(CLEAR_VARS)
LOCAL_MODULE := xxxx
LOCAL_SRC_FILES := xxxx.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PREBUILT_JNI_LIBS := @lib/armeabi/libxxxx_jni.so
include $(BUILD_PREBUILT)

Android.mk的一些FAQ相关推荐

  1. android.mk 里面内容介绍

    大致如下 # 这个是固定的必须要写的,作用是构建系统提供的宏函数 my-dir 将返回当前目录(Android.mk 文件本身所在的目录)的路径 LOCAL_PATH:= $(call my-dir) ...

  2. Android.mk文件语法规范

    序言: ------------- 此文档旨在描述Android.mk文件的语法,Android.mk文件为Android NDK(原生开发)描述了你C/C++源文件. 为了明白下面的内容,你必须已经 ...

  3. Android.mk和Application.mk文件语法规范说明及举例

    以下英文内容摘自:http://www.kandroid.org/ndk/docs/OVERVIEW.html The Android NDK is a set of tools that allow ...

  4. Android.mk 用法介绍

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

  5. Android.mk文件语法规范及使用模板 (转载)

    2019独角兽企业重金招聘Python工程师标准>>> http://blogold.chinaunix.net/u3/99423/showart_2206760.html Andr ...

  6. android编译系统Android.mk使用详解

    2019独角兽企业重金招聘Python工程师标准>>> (1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要 ...

  7. Android.mk 配置参数

    Android.mk 的可配置参数会比较多,但是常用的可能很少.在进行多项目 ndk 共享的时候,如果对各个参数比较了解,对项目的结构优化有不小的好处. 0x00 LOCAL_PATH 根据 Andr ...

  8. About LOCAL_PRIVATE_PLATFORM_APIS in Android.mk

    LOCAL_PRIVATE_PLATFORM_APIS := true 设置后,会使用sdk的hide的api來编译 在Android.mk中如果有 LOCAL_SDK_VERSION 这个编译配置, ...

  9. Android.mk简介

    Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译. 因为所有的编译文件都在同一个 GNU MAKE 执行环境中进行执行,而Android.mk中所有的变 ...

最新文章

  1. 腾讯极客攻破iPhone刷脸解锁,凭一副眼镜,转走熟睡用户的钱
  2. 2018 - 待深入学习博客
  3. 如何将linux装入空白硬盘,如何将tiny core linux装入硬盘
  4. mysql isam cache_Mysql性能优化基础篇
  5. SMB协议端口号,Windows文件共享协议
  6. table内容超出宽度时隐藏并显示省略标记
  7. fp16和fp32,神经网络混合精度训练,PYTORCH 采用FP16,Libtorch采用FP16,神经网络混合精度三种避免损失,TensorRT模型转换及部署(一)
  8. 嫦娥四号的通讯速率,为何没有视频直播
  9. Python中系统命令
  10. 网页中的QQ和阿里旺旺聊天图标
  11. win10的计算机策略组,Win10家庭版如何添加组策略功能?
  12. 解析xml的四种方式
  13. VBA每日一练(10)range.end() 或 cells().end() 用法,偏移 且 查找非空单元格,取最大最小行列数
  14. div网页布局(做一个简单网页界面为例)
  15. Markdown安装/破解/下载
  16. Redis Master/Salve Replication(主从复制模式)
  17. idear右边的依赖视图没了_APP开发中出现提到的Idear是什么意思
  18. centos使用yum时提示Segmentation fault错误的深入研究
  19. [No000026]365种创业、办公、和生活成长的精华资源
  20. android控制中心实现,基于Android平台的智能家居系统控制中心的设计与实现

热门文章

  1. 《延世大学韩国语教程2》第二十课 办公室(上)
  2. string 转换int
  3. 软件以人为本1 - 序 - 写于上海2011 ScrumGathering会后
  4. 反向传播网络(BP 网络)
  5. 火柴人小程序linux,火柴人手绘小程序
  6. 会php会javascript,javascript – 只会php和js但不会java,能做手机应用开发吗?
  7. 语言怎么得到直流电压并采样_250V10A高频直流电源/大电流直流稳压稳流电源
  8. 二元函数可导与可微的关系_视频教学:期末试卷解析之多元函数基本概念及相互关系讨论...
  9. NodeJS 数组超出部分以弹出框显示。
  10. Leetcode-Pascal's Triangle