Android m/mm/mmm/make编译模块

2024-03-05 03:36
文章标签 编译 模块 android make mm mmm

本文主要是介绍Android m/mm/mmm/make编译模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.编译成模块的前置条件

Android编译环境初始化完成后,我们就可以用m/mm/mmm/make命令编译源代码了。lunch命令其实是定义在build/envsetup.sh文件中的函数lunch提供的。与lunch命令一样,m、mm和mmm命令也分别是由定义在build/envsetup.sh文件中的函数m、mm和mmm提供的,而这三个函数又都是通过make命令来对源代码进行编译的。事实上,命令m就是对make命令的简单封装,并且是用来对整个Android源代码进行编译,而命令mm和mmm都是通过make命令来对Android源码中的指定模块进行编译。

二.m、mm和mmm的实现

各命令作用及用法:

mmm命令:编译指定路径下的模块,需要指定模块路径(必须为该模块的根目录,包含Android.mk的目录)。

mm命令:编译当前目录下的模块,需要进到模块所在目录,本质上跟mmm没什么区别。

m命令:编译全部模块。

函数m的实现如下所示:

function m()
{T=$(gettop)if [ "$T" ]; thenmake -C $T $@elseecho "Couldn't locate the top of the tree.  Try setting TOP."fi
}

函数m调用函数gettop得到的是Android源代码根目录T。在执行make命令的时候,先通过-C选项指定工作目录为T,即Android源代码根目录,接着又将执行命令m指定的参数$@作为命令make的参数。从这里就可以看出,命令m实际上就是对命令make的简单封装。

函数mm的实现如下所示:

function mm()
{# If we're sitting in the root of the build tree, just do a# normal make.if [ -f build/core/envsetup.mk -a -f Makefile ]; thenmake $@else# Find the closest Android.mk file.T=$(gettop)local M=$(findmakefile)# Remove the path to top as the makefilepath needs to be relativelocal M=`echo $M|sed 's:'$T'/::'`if [ ! "$T" ]; thenecho "Couldn't locate the top of the tree.  Try setting TOP."elif [ ! "$M" ]; thenecho "Couldn't locate a makefile from the current directory."elseONE_SHOT_MAKEFILE=$M make -C $T all_modules $@fifi
}

函数mm首先是判断当前目录是否就是Android源码根目录,即当前目录下是否存在一个build/core/envsetup.mk文件和一个Makefile文件。如果是的话,就将命令mm当作是一个普通的make命令来执行。否则的话,就调用函数findmakefile从当前目录开始一直往上寻找是否存在一个Android.mk文件。如果在寻找的过程中,发现了一个Android.mk文件,那么就获得它的绝对路径,并且停止上述寻找过程。
        由于接下来执行make命令时,我们需要指定的是要编译的Android.mk文件的相对于Android源码根目录路径,因此函数mm需要将刚才找到的Android.mk绝对文件路径M中与Android源码根目录T相同的那部分路径去掉。这是通过sed命令来实现的,也就是将字符串M前面与字符串T相同的子串删掉。

        最后,将找到的Android.mk文件的相对路径设置给环境变量ONE_SHOT_MAKE,表示接下来要对它进行编译。另外,函数mm还将make命令目标设置为all_modules。这是什么意思呢?我们知道,一个Android.mk文件同时可以定义多个模块,因此,all_modules就表示要对前面指定的Android.mk文件中定义的所有模块进行编译。

函数mmm的实现如下所示:

function mmm()
{T=$(gettop)if [ "$T" ]; thenlocal MAKEFILE=local MODULES=local ARGS=local DIR TO_CHOPlocal DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/')local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/')for DIR in $DIRS ; doMODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'`if [ "$MODULES" = "" ]; thenMODULES=all_modulesfiDIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'`if [ -f $DIR/Android.mk ]; thenTO_CHOP=`(cd -P -- $T && pwd -P) | wc -c | tr -d ' '`TO_CHOP=`expr $TO_CHOP + 1`START=`PWD= /bin/pwd`MFILE=`echo $START | cut -c${TO_CHOP}-`if [ "$MFILE" = "" ] ; thenMFILE=$DIR/Android.mkelseMFILE=$MFILE/$DIR/Android.mkfiMAKEFILE="$MAKEFILE $MFILE"elseif [ "$DIR" = snod ]; thenARGS="$ARGS snod"elif [ "$DIR" = showcommands ]; thenARGS="$ARGS showcommands"elif [ "$DIR" = dist ]; thenARGS="$ARGS dist"elif [ "$DIR" = incrementaljavac ]; thenARGS="$ARGS incrementaljavac"elseecho "No Android.mk in $DIR."return 1fifidoneONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS $MODULES $ARGSelseecho "Couldn't locate the top of the tree.  Try setting TOP."fi
}

函数mmm的实现就稍微复杂一点:

三.mm编译模块实例

要使用m、mm、mmm命令对Android代码进行模块编译,需要先执行如下命令初始化环境。

source build/envsetup.shlunch

mm编译成功后,在编译log会显示生成的so库。 

在根目录find -name " " 搜索编译生成的so,然后push到板子对应的目录下。  

这篇关于Android m/mm/mmm/make编译模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775209

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.