Android.mk的使用以及常用模板

2023-11-09

Android.mk使用

// 一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)
LOCAL_PATH := $(call my-dir)

// Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始,以include $(BUILD_XXX)结束
// CLEAR_VARS指的是clear_vars.mk,由编译系统提供,它会让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
// 这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。
include $(CLEAR_VARS)

// user:  指该模块只在user版本下才编译;
// eng:  指该模块只在eng版本下才编译;
// tests: 指该模块只在tests版本下才编译;
// optional:指该模块在所有版本下都编译;
// debug: 批该模块只在userdebug版本下才编译
LOCAL_MODULE_TAGS := optional

// java源码: 调用all-java-files-under得到。(这种形式来包含local_path目录下的所有java文件)
LOCAL_SRC_FILES := $(call all-java-files-under, src)
// C/C++:  LOCAL_SRC_FILES变量就必须包含将要编译打包进模块中的C或C++源代码文件
LOCAL_SRC_FILES := *.cpp

// package的名字,这个名字在脚本中将标识这个app或package,编译为apk时使用
LOCAL_PACKAGE_NAME := ***
// LOCAL_MODULE标识你在Android.mk文件中描述的每个模块。名称必须是唯一的。(编译其余使用)
// 注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件(也可以直接以libxxx命名)
LOCAL_MODULE := foo

// LOCAL_CERTIFICATE 后面是签名文件的文件名,说明Settings.apk是一个需要platform key签名的APK
LOCAL_CERTIFICATE := platform

// 可选变量,表示头文件的搜索路径。默认的头文件的搜索路径是LOCAL_PATH目录
LOCAL_C_INCLUDES := /**/**/**

// 表示该模块需要使用哪些静态库,以便在编译时进行链接
LOCAL_STATIC_LIBRARIES := *** \
						  ***
// 表示模块在运行时要依赖的共享库(动态库),在链接时就需要,以便在生成文件时嵌入其相应的信息
LOCAL_SHARED_LIBRARIES := *** \
						  ***

// 编译在vendor分区,不指定默认编译在system分区
LOCAL_VENDOR_MOUDLE := true

// 指定特定模块编译32bit或64bit或都编译,取值 32, 64, both
LOCAL_MULTILIB := 32 

//  设置在构建 C 和 C++ 源文件时构建系统要传递的编译器标记
//  参数说明:
//	-Wall 打开警告开关 -Wno-error=***
//	-O 代表默认优化 -O0不优化,-O1低级优化,-O2中级优化,-O3高级优化,-Os代码空间优化
//	-g 生成调试信息,生成的可执行文件具有和源代码关联的可调试的信息
//	-D 增加全局宏定义,相当于 #define ***
//	-ffast-math:极大地提高浮点运算速度
//	-mfloat-abi=softfp 浮点运算
//	-fopenmp OpenMp用于共享内存并行系统的多处理器程序设计的一套指导性的编译处理方案(Compiler Directive)
LOCAL_CFLAGS := ***

//  只构建 C++ 源文件时将传递的一组可选编译器标记
LOCAL_CPPFLAGS := ***

// 此变量列出了在构建共享库或可执行文件时使用的额外链接器标记。利用此变量,您可使用 -l 前缀传递特定系统库的名称。例如,以下示例指示链接器生成在加载时链接到 /system/lib/libz.so 的模块
LOCAL_LDLIBS := -lz -llog

// 此变量列出了构建系统在构建共享库或可执行文件时使用的其他链接器标记。例如,若要在 ARM/X86 上使用 ld.bfd 链接器:
LOCAL_LDFLAGS += -fuse-ld=bfd

编译C++代码使用rtti标记(RTTI 运行时类型识别)
LOCAL_RTTI_FLAG := -frtti

// 目标的安装路径
LOCAL_MODULE_PATH := ***

// 指定platform api版本
LOCAL_PRIVATE_PLATFORM_APIS := current

// 引用静态jar包
LOCAL_STATIC_JAVA_LIBRARIES := *** \

// 引用动态jar包
LOCAL_JAVA_LIBRARIES := *** \

// full:使用编译系统默认的配置:压缩但不混淆和优化,默认的混淆配置文件是build/core/proguard.flags
// custom:和full一样,但不包括aapt生成的resource相关的混淆配置。
// nosystem:不使用系统的默认配置,但使用aapt生成的resource相关的混淆配置,其他混淆由模块自己负责。
// disabled:关闭混淆
// obfuscation:和full一样,并且开启混淆
// optimization:和full一样,并且开启优化
// 不设置时,如果是app,默认为full,如果是library,则默认为disabled。
// 编译userdebug版本时,编译脚本会把app的obfuscation改成full,即不混淆
LOCAL_PROGUARD_ENABLED := disabled

// 引用jni库
LOCAL_JNI_SHARED_LIBRARIES := ***_jni \

include $(BUILD_PACKAGE) // 是用来编译生成package/app/下的apk。还有其他几种编译情况:
include $(BUILD_STATIC_LIBRARY)    // 表示编译成静态库;
include $(BUILD_SHARED_LIBRARY)    // 表示编译成动态库;
include $(BUILD_EXECUTABLE)        // 表示编译成可执行程序;
include $(BUILD_JAVA_LIBRARY)    // 表示编译成动态jar包;
include $(BUILD_STATIC_JAVA_LIBRARY)    // 表示编译成静态jar包;
include $(BUILD_PREBUILT)   // 把文件当成编译项目,在Android.mk中copy一个file,一般用于第三方提供apk二次打包到系统中

常用模板

编译apk

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := src/com/example/test/MainActivity.java 
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := ***
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := com.example.test \
LOCAL_PRIVATE_PLATFORM_APIS := current
LOCAL_CERTIFICATE := platform
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.example.test"
	android:versionCode="1"
	android:versionName="1.0"
	android:sharedUserId="android.uid.system">
	<application
	    android:allowBackup="true"
	    android:persistent="true"
	    android:label="test"
	    android:supportsRtl="true">
	    <activity
	        android:name=".MainActivity"
	        android:label="Tests for com.example.test" >
	
	        <intent-filter>
	            <action android:name="android.intent.action.MAIN" />
	            <category android:name="android.intent.category.LAUNCHER" />
	        </intent-filter>
	    </activity>
	
	</application>
</manifest>
编译静态库
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
          helloworld.cpp
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
编译动态库
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
          helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
编译可执行程序
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
二次打包apk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myapplication
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := true
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
LOCAL_SRC_FILES := ./app-release.apk
# LOCAL_MULTILIB := 64
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PREBUILT)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android.mk的使用以及常用模板 的相关文章

  • java.lang.IllegalStateException:无法为 X 创建层 - 使用硬件层时

    我在自定义视图上使用硬件层 以便在为其 Alpha 制作动画时获得更好的性能 在我的崩溃记者上看到这次崩溃 Fatal Exception java lang IllegalStateException Unable to create l
  • 构建 gradle 系统应用程序作为 AOSP 构建的一部分

    我有一个基于 AOSP 的自定义 ROM 并且正在开发一个系统应用程序 该应用程序在 ROM 构建期间打包 就像任何其他系统应用程序一样 是否可以将此应用程序切换为 gradle 样式应用程序 并在 AOSP 构建期间使用 gradle 构
  • Android 上的透明视频

    有什么办法让Android播放带有透明区域的视频吗 当我尝试在 VideoView 中播放包含透明区域的 WebM 视频时 视图的背景保持黑色 我希望看到透明区域上显示的父视图的背景 而不是黑色 到目前为止 我发现的唯一可行的解 决方案是从
  • SysUtils:ApplicationStatus(WebView)中的ApplicationContext为空

    我可以在基于 WebView 的应用程序启动时看到一些奇怪的东西 它根本不影响应用程序 但我很好奇为什么会出现错误 没有任何崩溃 一切似乎都很好 但是错误 这是日志猫 Loading com google android webview v
  • 在 Firebase 群组消息应用中实现已读回执功能

    我想在我的 Firebase 群组消息应用中实现 Seen 功能 您能否建议采取最好 最有效的方法 工作代码将不胜感激 例如 应用程序会显示 已被 6 人看过 or 15 人看过 在群组消息中 这是我的项目 https github com
  • android中如何实现列表之间的拖放?

    我试图做到这一点 以便用户可以从一个列表视图中拖动文本视图 然后将其放入另一个列表视图中 但我发现这非常困难 到目前为止我发现的最大问题是 onTouchEvents 似乎只能在 ACTION DOWN 事件起源的视图中听到 我将单击一个列
  • 主应用程序下载另一个应用程序然后使用它

    What I want to do is maybe hard to explain or to understand so I made a quick drawing 首先 我们有 2 个 Android 应用程序 一个显示器 你好世界
  • 无法使用 Android 版 VLC 设置字幕

    启动 Android 版 VLC 的 VideoPlayerActivity 时 我在设置字幕位置时遇到问题 我的目标是 API 27 并使用 FileProvider 来允许访问文件 根据文档here https wiki videola
  • 如何在 Android Studio 中立即获取 LivaData 的值?

    savedRecordFileName是一个变量LivaData
  • 搜索栏小部件未启动可搜索活动

    我正在尝试使用操作栏中的搜索栏小部件在我的 Android 应用程序上实现搜索 我正在关注 http developer android com guide topics search search dialog html http dev
  • Android 中如何获取帧

    实际上 我需要从视频中获取所有帧 但在使用 Mediametadataretriever 缩略图 时间戳获取帧时 我经常重复获取第一帧 然后获取特定时间帧 我通过更改所有 GetFrameAtTime options 尝试了很多修复 但仍然
  • 检查互联网连接是否可用?

    我正在开发在线应用程序 问题 当互联网关闭或不可用时 它会给我错误 强制关闭 我尝试使用broadCast Receiver进行处理 但没有满足确切的解决方案 正在寻找更好的解决方案 public class MyBroadcastRece
  • 如何避免将相同的片段添加到堆栈中

    我需要一些帮助 他们以这种方式将片段添加到活动中 问题是每次调用 openFragment 时都会创建片段并添加 这是显而易见的 问题 我做了什么修改 这样它只能添加一次片段 在下次使用相同片段标签的调用时 它将什么也不做 案例 第一次按下
  • Android:Enter 或 Tab 键仍然使用 jetpack compose 在密码输入字段中输入值

    当我输入或 Tab 键时 仍然使用 jetpack compose 在密码输入字段中输入值 下面是我的代码片段 val focusRequester FocusRequester createRefs TextField value tex
  • 如何在android中以编程方式阻止呼叫[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Android 中阻止来电 https stackoverflow com questions 1083527 how to block calls in android 我正在 Androi
  • Android 权限 BIND_NOTIFICATION_LISTENER_SERVICE 不起作用

    我正在 React Native 应用程序中工作 我正在努力在 Android 中使用Notification Services BIND NOTIFICATION LISTENER SERVICE 我正在尝试使用读取传入的通知Notifi
  • Android快速查找网络上所有本地设备

    我正在制作一个 Android 应用程序 需要能够查看本地网络设备 名称或 IP 目前我可以扫描网络并找到设备的本地IP 然而 由于时间太长 用户在搜索网络时会看到黑屏加载几分钟 这是我当前正在使用的代码 private ArrayList
  • 如何在Java中从一组选定的颜色中输出随机颜色? (安卓)

    因此 我希望每当用户输入答案时都为字符串赋予随机颜色 我的问题是 我不确定如何使字符串的随机颜色成为特定范围的颜色 例如 如果我希望字符串随机变成蓝色 红色 绿色 粉色 白色或棕色 只有这些颜色 没有其他颜色 到目前为止 我已经使用以下代码
  • Ionic Cordova Build Android 未找到已安装的构建工具

    我在 Ubuntu 16 04 上的 Android 上构建 ionic 应用程序时遇到问题 这是我为了实现这一目标所做的一步 下载Android Studio 下载Android SDK 在 bashrc 和 bash profile 中
  • 查找手动注册(混淆)的本机函数地址

    我试图理解一个 Android 应用程序 其中包含一个名为foo在班上com app Bar 课堂内Bar有一个加载共享对象的静态子句System loadLibrary libfoo so 我认为是用它构建的 f可见性 隐藏 https

随机推荐

  • 拒绝数据裸奔,进行3DES加密很重要!(Java,JavaScript)

    一 前言 对于3DES加密百度上大部分都有很详细的解释这里就不再赘述 本文只针对Java以及JavaScript进行使用3DES加密的过程进行详细的解答 并对容易采坑以及容易疑惑的地方进行详细解释 注意点 1 3DES加密key 必须为24
  • yoloe 超过yolox和yolov5

    号称超过yolox和yolov5的PP YoLoE 开源地址 GitHub PaddlePaddle PaddleDetection Object Detection toolkit based on PaddlePaddle It sup
  • jquery validation engine ajax,jquery ajax validation engine not working

    my jquery validation form is not validate here is the code like document ready function frm validationEngine validate HD
  • 在vscode中的js文件中自动补全html标签

    code 首选项 settings 查找settings json 然后在json文件中加入 emmet includeLanguages javascript html
  • 汉德笔试,感觉有些难的手机密码的动态规划题

    汉德公司的笔试编程题有两个 一个很简单 另一个感觉是加分题 当场没做出来后来做出来了 1 充电桩 N个电桩 第一个输入为ele数组 就是能充多少电 第二个输入为耗电数组 到下一站费多少电 要求输出为从任意一个充电桩进入 能跑一圈 则输出这个
  • C double转char字符串

    找个double转char字符串的代码 国内搜出来的都是些什么狗屎 翻墙出去 一搜就有几种不错的方法 方法1 使用sprintf https cboard cprogramming com c programming 38507 doubl
  • android里用Paint画圆环的时候,让圆环的笔头头部变圆

    DrawArc画圆环的时候 如果设置width过大 那么直角的笔头会画得很丑 这个时候使用以下这句就行了 Piant setStrokeCap Cap ROUND
  • xinput1_3.dll缺失了如何去修复?xinput1_3.dll解决方法分享

    缺失了xinput1 3 dll文件 对应用程序或游戏的正常运行造成了严重的影响 这个动态链接库文件 DLL 是由Microsoft Corporation开发的 它是一个重要的Windows系统文件 提供了针对Xbox 360控制器的输入
  • eclipse error: * could not be resolved

    转自 http lihaichuan blog 51cto com 498079 1060466 打开Eclipse后 编辑c c 编译时出错 could not be resolved 但运行结果正确 解决办法 在eclipse上 pro
  • Nginx实战(四) 限速功能

    本文转载至 http blog csdn net u012486840 article details 52787275 如果很多用户 同一时刻下载nginx服务器上面的资源 这样会对nginx服务器的I O产生极大负担 所以对nginx服
  • 备份文件下载

    一 备份文件下载 1 网站源码 开启题目 点开链接后 进入环境 可以看到常见网站源码备份文件的后缀和备份文件名 打开burp暴力破解flag 设置打开代理 开始抓包 2 bak文件 开启bak题目 点开链接 进入环境 出现这个界面 打开文件
  • flask url 构建

    from flask import Flask redirect url for import time app Flask name app route def hello world return hello world app rou
  • Qt QTableWidget设置表头背景色不成功的原因

    QTableWidget没有设置背景色的函数 通过Qss样式来设置背景色 m pTable gt horizontalHeader gt setStyleSheet QHeaderView section background color
  • Java8的新特性以及使用

    1 通过10个示例来初步认识Java8中的lambda表达式 我个人对Java 8发布非常激动 尤其是lambda表达式和流API 越来越多的了解它们 我能写出更干净的代码 虽然一开始并不是这样 第一次看到用lambda表达式写出来的Jav
  • 缺陷检测方法 halcon

    文章预览 前言 1 缺陷检测分类 1 1 标准缺陷检测 1 2 非标缺陷检测 针对行业特性 2 行业难点 3 常规缺陷检测算法 Halcon 3 1 差分法 3 1 1 blob分析 差分 3 1 2 模板匹配 差分 3 1 3 两种检测方
  • 前端实现在线预览pdf、word、xls、ppt等文件

    前端实现在线预览pdf word xls ppt等文件 PDF文档在线预览功能 方式一 通过a标签href属性实现 pdf文件理论上可以在浏览器直接打开预览但是需要打开新页面 在仅仅是预览pdf文件且UI要求不高的情况下可以直接通过a标签h
  • windows 环境下安装Tomcat

    环境 windows 7 64位 java jdk 11 0 1 官网下载jdk tomcat9版本链接地址 https tomcat apache org download 90 cgi 因为我的电脑是win7 64位的 所以选择红色框出
  • jQuery九宫格跑马灯抽奖(已知结果)

    描述 写两个抽奖 等级不同 找到一个原生写法的 原作者链接如下 参考 https www cnblogs com yangqing22 p 14065754 html 略改了一下 换成了jQuery方式 优化点 在抽奖过程中 禁止重复点击抽
  • 因果推断-解决推荐系统公平性的新思路

    论文引入 近年来推荐系统公平性成为新的热点 在所有解决公平性问题的方法中 因果推断显得格外靓眼 我们以论文 Recommendations as treatments Debiasing learning and evaluation 1
  • Android.mk的使用以及常用模板

    Android mk使用 一个Android mk file首先必须定义好LOCAL PATH变量 它用于在开发树中查找源文件 在这个例子中 宏函数 my dir 由编译系统提供 用于返回当前路径 即包含Android mk file文件的