Android build/soong/scripts/microfactory.bash源码分析

该文件export一个全局变量,提供了两个方法,执行了一个source导入命令。

export一个全局变量

复制代码
# Ensure GOROOT is set to the in-tree version.
# 确保 GOROOT 环境变量被设置为 Android 源代码树中的适当版本的 Go 运行时目录
# uname返回操作系统的名称
# 开始一个 case 语句,用于根据操作系统执行不同的命令。
case $(uname) in
    Linux)
        export GOROOT="${TOP}/prebuilts/go/linux-x86/"
        ;;
    Darwin)
        export GOROOT="${TOP}/prebuilts/go/darwin-x86/"
        ;;
    *) echo "unknown OS:" $(uname) >&2 && exit 1;;
# 结束一个case语句
esac

export 全局变量 GOROOT,作为Android源代码go语言运行时目录,即go源码的位置。

提供两个方法

1. getoutdir

getoutdir 确定 Android 构建系统的输出目录

复制代码
function getoutdir
{
    #尝试使用环境变量 OUT_DIR 的值对其进行初始化。如果 OUT_DIR 未设置,out_dir 将为空字符串
    local out_dir="${OUT_DIR-}"
    #-z 测试操作符用于检查字符串长度是否为零
    if [ -z "${out_dir}" ]; then
        #再次检查环境变量 OUT_DIR_COMMON_BASE 是否设置。如果设置了,使用它的值来构建输出目录的路径
        if [ "${OUT_DIR_COMMON_BASE-}" ]; then
            #如果 OUT_DIR_COMMON_BASE 被设置了,将 out_dir 设置为 OUT_DIR_COMMON_BASE 目录下,
            #加上 TOP 变量所指向的目录的基本名称(即 TOP 目录的名称)
            out_dir="${OUT_DIR_COMMON_BASE}/$(basename ${TOP})"
        else
            #如果没有指定 OUT_DIR 或 OUT_DIR_COMMON_BASE,则默认输出目录为 out
            out_dir="out"
        fi
    fi
    #如果 out_dir 不是绝对路径,将其设置为相对于 TOP 目录的路径
    if [[ "${out_dir}" != /* ]]; then
        out_dir="${TOP}/${out_dir}"
    fi
    #输出最终确定的输出目录路径
    echo "${out_dir}"
}

2. soong_build_go

用于将源码编译为二进制文件,有两个参数,第一个参数指定二进制文件的名称,第二个参数执行二进制文件编译所需的源码位置。

复制代码
# Bootstrap microfactory from source if necessary and use it to build the
# requested binary.
#
# Arguments:
#  $1: name of the requested binary
#  $2: package name
#它用于构建指定的 Go 语言编写的 Android 二进制文件。
#这个函数使用了 microfactory 工具来构建 Go 代码
function soong_build_go
{
    #调用 getoutdir 函数来确定构建输出目录
    BUILDDIR=$(getoutdir) \
      #Android 源代码树的顶部目录
      SRCDIR=${TOP} \
      #存放构建蓝图文件的目录
      BLUEPRINTDIR=${TOP}/build/blueprint \
      #构建额外参数 EXTRA_ARGS,用于指定 Go 包的路径。这里指定了两个包路径:android/soong 和
      #github.com/golang/protobuf,它们都指向 TOP 目录下的特定子目录
      EXTRA_ARGS="-pkg-path android/soong=${TOP}/build/soong -pkg-path github.com/golang/protobuf=${TOP}/external/golang-protobuf" \
      #调用 build_go 函数,并传递所有传入 soong_build_go 函数的参数($@ 表示所有参数)
      build_go $@
}

执行了一个source导入命令

复制代码
# 执行命令或导入函数变量
source ${TOP}/build/blueprint/microfactory/microfactory.bash

负责提供soong_build_go所需的build_go方法。

相关推荐
CYRUS_STUDIO1 小时前
利用 Linux 信号机制(SIGTRAP)实现 Android 下的反调试
android·安全·逆向
CYRUS_STUDIO2 小时前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
黄林晴5 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我6 小时前
flutter 之真手势冲突处理
android·flutter
法的空间6 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止6 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭6 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech6 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831676 小时前
为何Handler的postDelayed不适合精准定时任务?
android
侃侃_天下6 小时前
最终的信号类
开发语言·c++·算法