android mm 到底执行了什么?

本文详细解析了Android源码构建中mm命令的工作原理,包括如何定位顶层目录、查找Android.mk文件及其编译过程。并通过示例展示了如何使用showcommands选项来查看具体的编译命令。
android mm 到底执行了什么?
----------------------------------------
author: hjjdebug
date:   2015年 05月 08日 星期五 16:10:39 CST
email:  hejinjing@tom.com
----------------------------------------
付实例介绍, 查看注释可以明白到底发生了什么。
mm()
if [ -f build/core/envsetup.mk -a -f Makefile ]; then
        make $@;
    else
        T=$(gettop);                # 获取顶层目录
        local M=$(findmakefile);    # 获取Android.mk 目录
        local MODULES=;
        local GET_INSTALL_PATH=;
        local ARGS=;
        local M=`echo $M|sed 's:'$T'/::'`;  # 去除顶层目录,成相对路径
        if [ ! "$T" ]; then
            echo "Couldn't locate the top of the tree.  Try setting TOP.";
        else
            if [ ! "$M" ]; then
                echo "Couldn't locate a makefile from the current directory.";
            else
                for ARG in $@;
                do
                    case $ARG in
                        GET-INSTALL-PATH)
                            GET_INSTALL_PATH=$ARG
                        ;;
                    esac;
                done;
                if [ -n "$GET_INSTALL_PATH" ]; then
                    MODULES=;
                    ARGS=GET-INSTALL-PATH;
                else
                    MODULES=all_modules;    #  MODULES 赋值 all_modules
                    ARGS=$@;
                fi;                # 进入顶层目录,指明makefile, 指明目标及参数
                ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk $MODULES $ARGS;
            fi;
        fi;
    fi
}

经注释, mm 秘密荡然无存。与自己知识融为一体。

另外: ONE_SHOT_MAKEFILE 专为mm 定义,进一步搜索本目录下编译的模块列表,具体看代码。

mmm 命令可以单独指明一个模块名称。这里不详述了。


gettop ()
{
    local TOPFILE=build/core/envsetup.mk;
    if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ]; then   #条件一般不满足,会走下面else
        echo $TOP;
    else
        if [ -f $TOPFILE ]; then
            PWD= /bin/pwd;
        else
            local HERE=$PWD;        # 取到原始目录
            T=;
            while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
                \cd ..;                # 不满足条件,退一级目录
                T=`PWD= /bin/pwd`;    # T 保留当前路径
            done;
            \cd $HERE;                # 重回原始目录
            if [ -f "$T/$TOPFILE" ]; then
                echo $T;            # 打印顶层目录
            fi;
        fi;
    fi
}

例如:
在 ~/myandroid/system/media/camera/src 下执行 gettop, 打印 /home/hjj/myandroid


findmakefile ()
{
    TOPFILE=build/core/envsetup.mk;
    local HERE=$PWD;
    T=;
    while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
        T=`PWD= /bin/pwd`;
        if [ -f "$T/Android.mk" ]; then
            echo $T/Android.mk;            # 找到了Android.mk 就打印,返回
            \cd $HERE;
            return;
        fi;
        \cd ..;                # 未到顶层则退一级
    done;
    \cd $HERE
}

在 ~/myandroid/system/media/camera/src 下执行 gettop, 输出
/home/hjj/myandroid/system/media/camera/src/Android.mk

另外还有一个问题, 我想显示出具体编译的命令,应该怎么做。

找啊找,终于找到你了。 showcommands

例如: mm showcommands

将显示完整编译命令。

<think> 我们正在讨论的是Android相关的命令。用户询问的是“android secilc”是什么命令。 首先,我需要确认这个命令的正确性。在Android中,与SELinux策略相关的命令中,有一个叫做`secilc`的工具。 实际上,`secilc`是SELinux策略编译器(SELinux Compiler)的缩写。它用于将SELinux策略源文件(通常是`.te`、`.if`、`.fc`等)编译成二进制策略文件(通常是`.cil`或`.policy`文件)。 在Android系统中,SELinux(Security-Enhanced Linux)被用来强制执行强制访问控制(MAC)。Android从4.3版本开始引入SELinux,并在后续版本中不断加强其使用。 `secilc`命令通常在构建Android时使用,用于编译SELinux策略文件。它并不直接用于设备上的命令行(除非在开发环境中手动操作)。在设备上,我们通常使用`sestatus`、`getenforce`、`setenforce`等命令来查看和设置SELinux的状态。 然而,用户提到了“android secilc”,所以我们需要明确:`secilc`是Android构建工具链中的一部分,用于编译SELinux策略。 在Android源代码中,`secilc`工具位于`external/selinux`目录下,是由SELinux项目提供的。 因此,我们可以这样回答: - secilc是SELinux策略编译器,它将SELinux策略模块(.te文件等)编译成二进制格式(.cil文件),以便内核加载。 但是,请注意,在设备上通常不会直接运行`secilc`,因为策略是在构建时编译并打包到系统镜像中的。 由于用户没有要求代码,而是询问命令,因此我们不需要提供代码。但我们可以解释其用法。 例如,在构建环境中的典型用法可能是: secilc -m -M true -G -c <policy_version> <input_file> -o <output_file> -f /dev/null 其中: -m:启用多重实例支持 -M true:启用条件语句(布尔值)的处理 -G:将未知的类和权限视为错误(严格模式) -c:指定策略版本(如30,对应Android O及以上) input_file:输入文件(通常是所有策略文件合并后的一个文件) -o:输出文件 -f:将消息重定向到文件(/dev/null表示忽略消息) 由于用户可能对SELinux策略编译的具体步骤感兴趣,我们可以简要说明。 但是,根据用户的问题,我们只需解释这个命令是什么。 最后,按照要求,我们需要在最后提出相关问题。 因此,回答如下: 在Android中,`secilc`是一个用于编译SELinux策略的工具。它通常作为Android构建系统的一部分运行,将文本格式的SELinux策略文件(如.te文件)编译成二进制格式(.cil文件),以供Linux内核的SELinux子系统加载。这个工具不是直接在设备上使用的,而是在构建Android系统时使用的。 例如,在Android的构建过程中,构建系统会收集所有的SELinux策略文件,然后使用`secilc`将它们编译成二进制策略文件,最终打包进系统镜像。 如果你需要手动使用`secilc`(比如在开发或调试策略时),你可以在Android源代码树中构建它,然后使用它来编译策略。 一个典型的`secilc`命令如下(在构建环境中): ```bash secilc -m -M true -G -c 30 my_policy.conf -o my_policy.cil -f /dev/null ``` 上述命令的含义: - `-c 30`:指定策略版本为30(Android O使用30)。 - `my_policy.conf`:这是合并后的策略源文件。 - `-o my_policy.cil`:输出编译后的CIL文件。 注意:实际构建过程中,策略源文件通常由构建系统自动收集生成。 如果你在设备上尝试运行`secilc`,可能会发现这个命令不存在,因为它不是设计给最终用户使用的。 §§相关问题§§: 1. SELinux在Android中的作用是什么? 2. 如何查看Android设备的SELinux状态? 3. 如何修改Android设备的SELinux策略? 4. 如何在Android上禁用SELinux? </think> 在Android中,`secilc` 是 **SELinux 策略编译器**(SELinux Compiler)的命令行工具,用于将人类可读的 SELinux 策略源文件(如 `.te`、`.if`、`.fc`)编译为二进制格式(`.cil` 文件),供 Linux 内核的 SELinux 子系统加载和执行。 ### 关键特性: 1. **作用**:将文本格式的 SELinux 策略转换为内核可加载的二进制格式(CIL 格式)。 2. **使用场景**: - Android 系统构建过程中编译 SELinux 策略 - 开发或调试自定义 SELinux 策略 3. **位置**:通常在 Android 构建环境中使用(如 AOSP 源码树中的 `external/selinux/secilc/` 目录下)。 ### 示例代码(编译策略文件): 以下是在 Android 构建环境或 Linux 主机上使用 `secilc` 的典型命令: ```bash # 将 .te 策略文件编译为 .cil 二进制文件 secilc -m -M true -G -c 30 my_policy.te -o my_policy.cil -f /dev/null ``` ### 参数解释: | 参数 | 说明 | |------|------| | `-m` | 启用多重实例支持 | | `-M true` | 允许布尔值条件语句 | | `-G` | 拒绝未定义的权限(严格模式) | | `-c 30` | 指定策略版本(Android 10+ 通常用 30) | | `my_policy.te` | 输入的策略源文件 | | `-o my_policy.cil` | 输出的二进制策略文件 | | `-f /dev/null` | 忽略警告/错误输出(生产环境需检查日志) | ### 工作流程: ```mermaid graph LR A[.te 策略文件] -->|secilc 编译| B[.cil 二进制文件] B -->|加载到内核| C[SELinux 安全策略] ``` ### 注意事项: - 该命令**不在 Android 设备上直接运行**,而是在系统构建阶段由 Makefile 自动调用。 - 若需手动调试策略,需在 AOSP 源码环境中编译 `secilc` 工具: ```bash cd external/selinux/secilc mm -j16 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值