Android.mk for your own module

2023-05-16

   这里我们向Android中添加自己的模块,只涉及到.so/*.a/elf source的编译,以及如何将prebuilt file添加进工程。对于APK以及jar的source暂时没有仔细研究,要添加进去的话可以参照/pacakge和/framework里面的Android.mk ~~
     首先是可能用得到的基础知识,必须了解基础Makefile的语法,然后下面是Andriod用来编译相应模块使用的核心makefile,当然如果要速成的话也可以不看这些东西,直接按照后面的例子添加就可以了:
     1、prebuilt
      /build/core/base_rules.mk
      /build/core/prebuilt.mk
      /build/core/multi_prebuilt.mk
     2、.so/
      /build/core/base_rules.mk
      /build/core/shared_library.mk
      /build/core/dynamic_library.mk
      /build/core/binary.mk
     3、.a
      /build/core/base_rules.mk
      /build/core/static_library.mk
      /build/core/binary.mk
     编写可执行文件基本上和.so是差不多的,现在分为两类来仔细讲一下,一类是prebuilt files的编译,另外就是.so/.a/elf的编译。
     在所有这许makefile中最重要的是base_rules.mk,它是对module进行处理的核心过程,下面先看看这个文件的内容:

 每个模块在编译的时候都会产生一个编译目录和一个安装目录,编译目录就是这个模块编译以后生成的目标文件,安装目录就代表着这个模块是否会编译进文件系统,就是是否编译进IMG啦~~在base_rules.mk提供了两个变量来定义你要输出的目录,仔细弄懂对你了解编译后的生成目录是很有帮助的~~
      built_module_path := $(intermediates)
      LOCAL_BUILT_MODULE := $(built_module_path)/$(LOCAL_BUILT_MODULE_STEM)
      LOCAL_INSTALLED_MODULE := $(LOCAL_MODULE_PATH)/$(LOCAL_MODULE_SUBDIR)$(LOCAL_INSTALLED_MODULE_STEM)
      built_module_path是编译生成的中间文件所在的目录,LOCAL_BUILT_MODULE_STEM就是你要生成的编译目标啦,如果本地模块指定了LOCAL_MODULE_STEM的话,它的值就是$(LOCAL_MODULE_STEM)$(LOCAL_MODULE_SUFFIX),如果没有指定了的话就是$(LOCAL_MODULE)$(LOCAL_MODULE_SUFFIX)。由此可以看到LOCAL_MODULE的定义是很有讲究的,比如什么*.so,一般*就用来作模块名。LOCAL_MODULE_SUFFIX在编译不同的模块时,GOOGLE内置会给你加上相应的值,如果你不了解的话还是尽量自己来指定,不然可能编译出来的东西被篡改了文件名哦噢~~
      将编译目录的文件拷贝到安装目录就是我们的LOCAL_INSTALLED_MODULE了,是否会安装就要看你定义的 LOCAL_MODULE_TAGS了,当然你也可以通过修改LOCAL_MODULE_PATH来自定义安装。LOCAL_MODULE_PATH是有个很有用的变量,首先我们看看当我们在本地模块没有指定这个值的时候,它的值实际上是:LOCAL_MODULE_PATH := $($(my_prefix)OUT$(use_data)_$(LOCAL_MODULE_CLASS)),如果你的模块定义了TAGS:= TESTS则user_data的值是DATA,这样的模块会被安装在data/目录下,那么通过替换我们就知道这个LOCAL_MODULE_PATH := TARGET_OUT_$(LOCAL_MODULE_CLASS)。这个LOCAL_MODULE_CLASS在特定的类型编译会被google赋值成固定内容,但是在prebuilt的编译中它是由你自己来赋值的,它的值就会用来定义生成的目录,比如LOCAL_MODULE_CLASS := ETC的时候,则就会被安装在/system/etc目录。那么我们就知道如何来定义prebuilt模块里面的CLASS了,google还提供了一个 LOCAL_MODULE_SUBDIR可以让你来定义子目录,但是要记得的是在每个模块的最后要将这个值清空,因为默认CLEAR_VARS是不会清空这个值的。
      当然前面说的是LOCAL_MODULE_PATH的默认值,我们可以通过给它赋值来强制指定安装的目录,比如说要安装在system/etc /permissions目录,则可以强制指定它的值为$(TARGET_OUT_ETC)/permissions,这样模块就会被强制安装在这个目录了,给LOCAL_MODULE_PATH赋值的情况主要应用在prebuilt模块的编译上,其他的应该尽量采用其默认值。
      下面我们就具体看看我写的一个如何编译自己的.so *.a  elf的例子,具体能使用到的变量,和要注意的地方我都写出来了:

这里要说明的是这个prelink,prelinke只有在编译.so的时候才会有的选项,主要是通过预链接的方式来加快程序启动和执行的速度,如果你的本地模块prelink是真的话,那你要在build/core/prelink-linux-arm.map中定义你的库需要使用的空间,空间不够的话会报错(具体使用没仔细研究过)
       下面再看看如何来将我们自己的prebuilt files编译进工程,先让我们和这个相关的最重要的两个makefile:

 multi_prebuilt.mk只用来加入需要加入的各种库,仔细注意它里面的那个对加入文件进行处理的函数,尤其是 LOCAL_MODULE,LOCAL_MODULE_SUFFIX,LOCAL_SRC_FILES这3个变量是如何得到的,使用multi_prebuilt编译进工程的文件都会自动打上USER的tag。而且它最后还是会掉用prebuilt.mk来执行真正的编译操作。
        prebuilt.mk实际上可以编译任何文件到我们的工程中,下面是我写的一个例子,可以自动将目录下相应格式的文件编译进工程:

 此外添加prebuilt.mk也有一个粗暴的方式,可以通过下面的规则简单的将所有prebuilt files添加到你工程中去,必须一个一个添加:
        LOCAL_PATH := $(call my-dir)
        include $(CLEAR_VARS)
        # your prebuilt file name
        LOCAL_MODULE := example.so
        LOCAL_MODULE_TAGS := user eng
        # your prebuilt file (must be relative directory )
        LOCAL_SRC_FILES := lib/example.so
        # the path your prebuilt file will be installed   $(TARGET_OUT) is the system directory
        LOCAL_MODULE_PATH := $(TARGET_OUT)/lib   
        include (BUILD_PREBUILT)

 在最后说一下Android对模块唯一性检测的规则,在base_rules.mk里面通过module_id里来检测这个模块是否已经存在,我们看看这个值是如何定义的:

module_id := MODULE.$(if \
    $(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)

所以它是通过LOCAL_MODULE_CLASS和LOCAL_MODULE这两个变量来检测模块的唯一性,因此当你定义同一样的CLASS和MODULE的时候,Android就会报错,提示模块必须是唯一的。因此如果你将LOCAL_MODULE_CALSS进行修改,使用LOCAL_MODULE_PATH来指定安装目录的时候就会逃过Android对模块唯一性的检测,但是这样导致的问题就是同一个目标会有多个规则来实现它,而且每个规则都是相同的命令。这样导致的结果就是MAKE会将所有的依赖放在一起,然后使用命令来将其生成目标,这样是非常危险的,会造成库的覆盖,而且很多时候你不知道它就究竟使用的是哪个依赖来最终生成目标,只能用md5sum来检查。

     因此当你使用prebuilt来覆盖系统原有的文件的时候应该特别小心,如果你确认你的文件在覆盖系统原有文件以后系统能正常运行的话,好的方法是还是打开Android对module_id的检测,同时把原来生成这个文件的Makefile进行修改,让其不编译出这个文件~

     最后补充一个Android如何来存放模块的编译中间文件:
1、如果你的LOCAL_MODULE_CLASS包含COMMON_MODULE_CLASS := JAVA_LIBRARIES NOTICE_FILES,则你编译出的中间文件会放在:
   $(TARGET__OUT_COMMON_INTERMEDIATES)/$(LOCAL_MODULE_CLASS)/$(LOCAL_MODULE)_intermediates/
TARGET_OUT_COMMON_INTERMEDIATES := out/target/common/obj
2、如果你的LOCAL_MODULE_CLASS不包含COMMON_MODULE_CLASS,则你编译出的中间文件会放在:
     $(TARGET__OUT_INTERMEDIATES)/$(LOCAL_MODULE_CLASS)/$(LOCAL_MODULE)_intermediates/
TARGET_OUT_INTERMEDIATES := out/target/product/msm7627_ffa/obj

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yili_xie/archive/2009/12/09/4971736.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android.mk for your own module 的相关文章

  • 无法导入静态 android.support.test.espresso.contrib.DrawerMatchers.isOpen;

    我正在使用 espresso 来测试我的 Android 应用程序 当我尝试为导航抽屉菜单编写测试用例时 我无法导入其中任何一个 import static android support test espresso contrib Dra
  • 在列表视图/滚动视图中自动播放视频,类似于 facebook

    如果视图包含视频 我需要视频在列表视图 滚动视图中自动播放 这与 Facebook 非常相似 如果用户向下滚动并且可见区域包含视频 系统将播放视频 如果仍然滚动 则会自动停止该视频 它应该像一次播放一个视频一样工作 有人可以帮我解决这个问题
  • 为什么 PackageInfo.signatures 字段是一个数组,什么时候这里会出现除一个值之外的其他值?

    我正在相互检查包签名以确定它们是否不兼容 针对不同的密钥库进行编译 我注意到PackageInfo signatures几乎总是包含单个条目的集合 这对我来说很有意义 我使用调试或生产密钥库构建应用程序 这决定了包的签名 这是我此时对 ap
  • 如何全局公开 es6 模块

    我需要编写一个可在全局窗口上使用的模块 我使用 es6 创建模块 我定义的每个类都有它自己的文件 我正在使用 webpack 来 babelify 并捆绑这些类 我的模块的入口点也是包含要公开的全局的文件 我尝试了各种方法来实现这一点 包括
  • AudioTrack 可以播放 MIDI 文件吗?

    我想知道AudioTrack Android可以播放MIDI文件吗 如果没有的话哪个库可以 因为我想要 Android 库 可以为我的应用程序播放和控制 MIDI 文件的速度 从这里检查 Android 支持的媒体格式Android 媒体支
  • 创建自定义工具栏?

    Please help me to create a toolbar like this home page design 工具栏顶部有 3 个按钮 3 个图像按钮 下面2个按钮 搜索框 imagebutton 和镜头 imagebutto
  • 单击片段中的按钮不起作用

    我在片段中有一个按钮 对于该按钮 我重写了 onClick 方法 但它不起作用 单击按钮时 我也有一个 Taost 和一个日志 public class DataShown extends Fragment implements OnCli
  • 共享首选项在运行时是否存储在内存中?

    Android 中的共享首选项是否总是在启动时读取并在运行时存储在内存中 如果没有 还有比这更有效的读取偏好的方法吗 settings getSharedPreferences myPrefsFile 0 int answer settin
  • 返回 SOAP xml - Android

    在处理 Web 服务时 我使用适用于 Android 的 k2SOAP SoapObject request new SoapObject NAMESPACE METHOD NAME request addProperty ProjectI
  • Android TableLayout 宽度

    我有两列TableLayout作为滚动视图的唯一子视图 第一列包含TextViews labels 并且第二列包含EditText Spinner DateWidget等等 价值观 尽管我已指定android layout width fi
  • 输入流返回 NullPointerException (Java)

    以下是出现 NullPointerException 错误的代码 InputStream is getAssets open twentyone txt InputStreamReader iz new InputStreamReader
  • android:clickable="true" 意味着它不可点击?

    我有一个 ListView 其中包含一些自定义部分 每个部分都有自己的标题视图 我希望列表中的元素可单击 但显然不希望节标题可单击 所以在我添加的节标题的 xml 中android clickable false 调试时我注意到节标题仍然响
  • Xamarin 中 QR 扫描后的处理对话框

    我在Xamarin应用程序中使用QR码扫描仪 当它扫描QR码时 它会执行一些操作 大约需要一分钟 而在执行操作时 我想在屏幕上显示一个加载对话框 但是 它没有显示在屏幕上 并且在应用程序的其他地方 它运行得很好 Code var expec
  • java.lang.NoSuchMethodError:没有虚拟方法 zzait()Ljava/util/ArrayList;在 Lcom/ 类中错误?

    您好 我正在 Udacity 课程中学习使用 Firebase 当我运行我的应用程序时 我收到此错误并且对此一无所知 11 23 16 48 34 995 3947 3947 com google firebase udacity Frie
  • 使用 Android 应用程序将条目发布到 SQL Server

    我是一个真正的新手 如果这个问题听起来很愚蠢 我提前道歉 我正在尝试创建一个应用程序 允许我将客户数据发布到 Windows 服务器上的 SQL Server 这可能吗 如果是这样 我需要什么 再次感谢您的帮助 如果这是一个愚蠢的问题 我再
  • device_admin_sample.xml 放在哪里?

    在哪里放置 device admin sample xml 无论我把它放在哪里 它都会给出错误 device admin sample xml
  • Android 应用程序不在主屏幕上创建快捷方式图标(从 Play 商店下载)

    从Play商店下载应用程序后 它不会在主屏幕上创建快捷方式图标 它在应用程序抽屉中创建图标 虽然这个东西在大多数设备上运行良好 但对于某些设备 应用程序未创建快捷方式 我检查过 a Play 商店设置和自动添加小部件已标记 b 启动器设置自
  • Android:如何管理同一应用程序使用的多个库中的公共代码库

    NOTE 这个问题是基于我在以下讨论中收到的答案 Android 2个具有相同包的aar库 https stackoverflow com questions 57347039 android 2 aar libraries with th
  • Android 从相机预览中解码位图

    我正在尝试从相机预览中获取位图图像 我将在执行面部检测后对其进行一些处理并绘制一些叠加层 环顾四周后 我发现 onPreviewFrame 获取的字节数组无法直接解码为位图 需要使用 YuvImage 将其转换为正确的像素格式 而这正是我所
  • 在不同的任务中启动一个新的 Android Activity

    这是一个有点复杂的故事 我有一个Activity A Activity A使用意图打开浏览器来进行一些身份验证 完成此操作后 网页将重定向到 URL Activity B使用意图过滤器将其设置为可浏览 并且 URL 使得浏览器启动Activ

随机推荐

  • CSDN Marddown 编辑器语法备忘

    原文链接 xff1a https blog csdn net blogdevteam article details 103478461 本文对其二次加工 xff0c 增加渲染样式 补充例程 添加未收录的常用语法 CSDN Markdown
  • 随想008:烂摊子

    我看到过很多离谱的现象 比如 xff1a 程序 代码重复 命名随意 逻辑混乱 甚至对齐都不一致 xff0c 当我询问代码为什么这样写时 xff0c 他们告诉我 xff1a 我接手时就是这样 xff01 原理图参数错误 器件老旧 xff0c
  • MySQL —— Database initialization failed 错误处理

    安装 MySQL 过程中遇到的错误 xff0c 记录一下 xff0c 避免下次又遇到同样的错误 安装 MySQL 8 0 33 到最后一步时 xff0c 出现了小红点无法往下执行了 找了网上的方法解决了问题 xff0c 为了避免下次遇到同样
  • 随想009:读书

    我很懊恼的意识到 xff0c 直到过了 30 岁 xff0c 我才明白如何读书 我们在网上浏览新闻 阅读小说 xff0c 这些让人愉悦的阅读不叫读书 xff0c 顶多叫消遣 xff1b 我们在学校背诵历史 地理 xff0c 记住数学公式和化
  • 找文心一言问了几个嵌入式软件开发的问题

    百度终于通知我可以试用文心一言了 xff0c 试验了一番 xff0c 总体满意 xff0c 记录几个文心一言回答的问题 我是一个嵌入式软件开发者 xff0c 你能帮我做什么工作以提高我的开发效率 作为一个嵌入式软件开发者 xff0c 以下是
  • JavaScript常用数组属性和方法

    本文给出了js xff08 JavaScript xff09 数组 xff08 Array xff09 操作所涉及到的所有常用内置函数说明及用法 xff0c 希望对大家有所帮助 数组的属性和方法 属性length属性 xff1a 方法1 把
  • FreeRTOS三种数据结构区别(StreamBuffer,MessageBuffer,Queue)

    转载自博客 xff1a https blog zh123 top p 61 308 Queue队列是最基本的数据结构 xff0c 在FreeRTOS v10 0后提供了另外两种高级数据结构为Streambuffer和MessageBuffe
  • MySQL知识点(详细)

    结构化查询语言SQL 结构化查询语言SQL xff08 Structured Query Language xff09 xff1a 是在关系数据库上执行数据操作 xff0c 检索及维护所使用的标准语言 xff0c 可以用来查询数据 定义数据
  • linux驱动系列学习之Framebuffer子系统(三)

    一 Framebuffer子系统简介 Framebuffer xff08 帧缓冲 xff09 时Linux系统位显示设备提供的一个接口 属于偏底层的显示接口 它将显示缓冲区抽象 xff0c 屏蔽图像硬件的底层差异 xff0c 允许上层应用程
  • Linux系统通过远程终端修改分辨率

    最近的工作是测试服务器的板载GPU xff0c 由于一切处于开发阶段 xff08 没有USB驱动 xff0c 无法通过键鼠操作 xff09 xff0c 切换桌面分辨率成了一项难题 用谷歌 用百度 xff0c 总算找到了一个在远程终端修改分辨
  • ubuntu安装WPS字体缺失的解决办法

    作者最近新安装的ubuntu系统 xff0c 所以缺少了很多的办公软件 xff0c 之前安装了WPS xff0c 但是Linux系统的wps缺少了windows的字库 xff0c 因此使用起来不太方便 xff0c 所以作者就整理了这样的一份
  • Qt实现串口通信(C++实现串口通信小助手)---串口收发及串口数据解码、串口通信模拟器。

    Qt实现串口通信示例 前言 xff1a 以下串口通信示例 xff0c 参考了现有网上前辈们的资源 xff0c 最后结合部分个人的思想 xff0c 所以下述博客会将实现的原理及代码的案例进行公开 这里我们先上效果图 xff1a 一 串口通信简
  • vins-mobile代码解析3:drawAR

    AR功能主要流程是 xff1a 先检测平面 xff0c 然后计算AR物体 xff08 box xff09 的各个顶点3d位置 xff0c 然后写程序把每个顶点投影到相平面 xff0c 用cv的多边形填充功能来绘制到照片上面 先求一个相机朝向
  • Error:ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol

    MySQL 8 0 33 安装完成 xff0c 使用时候报错 xff1a Error xff1a ER NOT SUPPORTED AUTH MODE Client does not support authentication proto
  • 卡尔曼滤波器和优化的本质理解

    非线性最小二乘优化中 xff0c 最重要的是那个雅克比矩阵 每一行对应一个观察两 xff0c 里面的值代表要减少这个观察量的误差 xff0c 其他被优化的量需要做的改变 而每一列就是这个观察量需要怎么变才能减少不同的观察量 对于一个优化量
  • G2o,GTSAM,Ceres,Tensorflow优化器的方法比较

    首先是一些背景知识 xff1a 最速梯度下降法 xff08 GD xff09 和牛顿法可以用来优化所有种类的函数 牛顿高斯和基于牛顿高斯的LM法只能用来优化非线性最小二乘 SGD是最速梯度下降法的改进 xff0c 也就是每次迭代随即选取一些
  • MSCKF算法研究

    目的 xff1a 找一个能把imu和视觉融合起来的算法 细节 xff1a 网上搜索了下 xff0c 17年初的时候基本VIO算法就是MSCKF最完备 github上面有一个非官方的实现 xff0c 就下下来研究 但是跑kitti的数据都效果
  • SLAM中全局优化初值设置的经验谈

    情况分析 xff1a 有两段轨迹 xff0c 段内的重投影误差很小 xff0c 但是两段轨迹的相对位置有点错位 我们找到了这两段轨迹overlap的一些共视关系 这个时候如果我们直接把两段轨迹放一起做BA xff0c 其实是不能减少这两段轨
  • 视觉建图融合gps的合并工具测试

    描述 xff1a 把两个bag的数据分别计算自己的轨迹后 xff0c 和gps做刚体对齐找两个轨迹的共視关系通过两个轨迹的点云匹配后得到两个轨迹的相似变换 xff0c 把第二个轨迹变换到第一个轨迹的坐标系下加入gps边的pose graph
  • Android.mk for your own module

    这里我们向Android中添加自己的模块 xff0c 只涉及到 so a elf source的编译 xff0c 以及如何将prebuilt file添加进工程 对于APK以及jar的source暂时没有仔细研究 xff0c 要添加进去的话