ag:比grep、ack更快的递归搜索文件内容的命令行工具。The Silver Searcher(ag)是一款用 C 编写的快速且对开发人员友好的文本搜索工具,针对源代码搜索进行了优化。它与 ack 类似,但速度更快,因此深受开发人员喜爱,可用于搜索代码库。在典型使用中,ag 比 ack 快 5-10 倍,默认情况下,ag 将忽略文件名匹配 .gitignore、.hgignore 或 .ignore。
一、前言
Silver Searcher(ag)是新一代代码搜索工具,其基于PCRE正则引擎和LZMA压缩算法,相比传统grep提速10倍以上。作为开发者的生产力利器,ag在大型代码库检索、日志分析和分布式搜索场景中表现卓越。本文将详解如何将ag-2.2.0移植到鸿蒙PC平台。
移植效果验证:

1.1 核心价值
ag在即时检索速度 、智能忽略规则 和多格式支持方面优势明显,移植到鸿蒙平台将为代码审查、系统调试等场景提供高效搜索能力。
官网地址:https://github.com/ggreer/the_silver_searcher
源码仓库:https://gitcode.com/qq8864/the_silver_searcher
1.2 项目信息表
| 关键信息 | 技术参数 |
|---|---|
| 工具名称 | ag命令(The Silver Searcher ) |
| 开源协议 | Apache-2.0 |
| 源码版本 | 2.2.0 |
| 目标平台 | OpenHarmony PC (aarch64) |
| 核心依赖 | PCRE-8.45、XZ-5.8.2 、 zlib-1.3.1 |
注:该库依赖了PCRE库、XZ库和libz库。移植该库前需要先移植好对应的依赖。移植方法参见猫哥前面的博文。
二、适配设计
2.0 环境准备(Ubuntu 24.04)
bash
sudo apt update
sudo apt install -y git curl cmake ninja-build gcc g++ make autoconf automake libtool yasm nasm
sudo apt install -y gettext autopoint
sudo apt install python3 python3-pip
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1
2.1配置ohos-sdk
bash
sdk_download_url="https://cidownload.openharmony.cn/version/Daily_Version/OpenHarmony_6.1.0.27/20260111_020523/version-Daily_Version-OpenHarmony_6.1.0.27-20260111_020523-ohos-sdk-public.tar.gz"
curl -o ohos-sdk-public.tar.gz $sdk_download_url
mkdir ohos-sdk
tar -zxf ohos-sdk-public.tar.gz -C ohos-sdk
cd ~/ohos-sdk/linux
unzip native-linux-x64-6.1.0.27-Beta1.zip
unzip toolchains-linux-x64-6.1.0.27-Beta1.zip
这段代码的作用是从指定的 URL 下载 SDK 压缩包,然后创建一个名为 ohos-sdk 的目录,并将压缩包解压到该目录下。
2.2 技术挑战
- 双重依赖管理:PCRE正则库与XZ压缩库的兼容性验证
- 路径适配:鸿蒙专用文件系统路径规则适配
- 静态链接:多库联合静态编译的符号冲突解决
- 性能调优:ARM64架构下的搜索算法优化
2.3 环境校验
确认前置依赖库已完成移植:
bash
ls /data/service/hnp/pcre.org/pcre_8.45.0/lib/libpcre.a
ls /data/service/hnp/xz.org/xz_5.8.2/lib/liblzma.a
ls /data/service/hnp/zlib.org/zlib_1.3.1/lib/libz.a
三、实现细节
3.0 环境脚本exports.sh
bash
source exports.sh
猫哥的通用脚本(exports.sh),用于一键配置交叉编译环境:
bash
echo "hello exports,交叉编译环境配置"
## SDK路径,你唯一需要根据实际的改的地方
SDK_PATH="/root/ohos-sdk/linux"
echo "SDK_PATH:$SDK_PATH"
export OHOS_SDK="$SDK_PATH"
export HNP_PERFIX=
export COMPILER_TOOLCHAIN=${OHOS_SDK}/native/llvm/bin/
BUILD_OS=$(uname)
PYTHON=$(python --version)
echo "python : $PYTHON"
export CC=${COMPILER_TOOLCHAIN}clang && echo "CC : ${CC}"
export CXX=${COMPILER_TOOLCHAIN}clang++ && echo "CXX : ${CXX}"
export HOSTCC=${CC} && echo "HOSTCC : ${HOSTCC}"
export HOSTCXX=${CXX} && echo "HOSTCXX : ${HOSTCXX}"
export CPP="${CXX} -E" && echo "CPP : ${CPP}"
export AS=${COMPILER_TOOLCHAIN}llvm-as && echo "AS : ${AS}"
export LD=${COMPILER_TOOLCHAIN}ld.lld && echo "LD : ${LD}"
export STRIP=${COMPILER_TOOLCHAIN}llvm-strip && echo "STRIP : ${STRIP}"
export RANLIB=${COMPILER_TOOLCHAIN}llvm-ranlib && echo "RANLIB : ${RANLIB}"
export OBJDUMP=${COMPILER_TOOLCHAIN}llvm-objdump && echo "OBJDUMP : ${OBJDUMP}"
export OBJCOPY=${COMPILER_TOOLCHAIN}llvm-objcopy && echo "OBJCOPY : ${OBJCOPY}"
export NM=${COMPILER_TOOLCHAIN}llvm-nm && echo "NM : ${NM}"
export AR=${COMPILER_TOOLCHAIN}llvm-ar && echo "AR : ${AR}"
export SYSROOT=${OHOS_SDK}/native/sysroot
export PKG_CONFIG_SYSROOT_DIR=${SYSROOT}/usr/lib/aarch64-linux-ohos
export PKG_CONFIG_PATH=${PKG_CONFIG_SYSROOT_DIR}
export PKG_CONFIG_EXECUTABLE=${PKG_CONFIG_SYSROOT_DIR}
export HNP_TOOL=${OHOS_SDK}/toolchains/hnpcli
export CMAKE=${OHOS_SDK}/native/build-tools/cmake/bin/cmake
export TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake
export WORK_ROOT=${PWD}
export ARCHIVE_PATH=${WORK_ROOT}/output
export COMM_DEP_PATH=${WORK_ROOT}/deps_install
export HNP_PUBLIC_PATH=${HNP_PERFIX}/data/service/hnp/
export MAKE_QUITE_PARAM=" -s "
export CONFIGURE_QUITE_PARAM=" --quiet "
export TARGET_PLATFORM=aarch64-linux-ohos
export TARGET=aarch64-linux-ohos
export CFLAGS="-fPIC -D__MUSL__=1 -D__OHOS__ -fstack-protector-strong --target=${TARGET_PLATFORM} --ld-path=${LD} --sysroot=${SYSROOT} -stdlib=libc++ "
export CXXFLAGS="${CFLAGS} "
export LD_LIBRARY_PATH=${SYSROOT}/usr/lib:${LD_LIBRARY_PATH}
export LDFLAGS="--ld-path=${LD} -Wc,--target=${TARGET_PLATFORM} --sysroot=${SYSROOT} -fuse-ld=lld "
export HOST_TYPE="--host=aarch64-linux --build=aarch64-linux"
#export NCURSES_INSTALL_HNP_PATH="${HNP_PUBLIC_PATH}/ncurses.org/ncurses_v6.4"
mkdir -p ${HNP_PUBLIC_PATH}
mkdir -p ${ARCHIVE_PATH}
chmod 777 -R ${HNP_PUBLIC_PATH}
mkdir -p code
echo "LDFLAGS:${LDFLAGS}"
#export PKG_CONFIG_PATH="${CUSTOM_PREFIX}/lib/pkgconfig:$PKG_CONFIG_PATH"
3.1 编译脚本(build_ohos.sh)
放置在源码的根目录下。
bash
#!/bin/bash
export AG_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/ag.org/ag_2.2.0
make clean
# 设置依赖库路径(需预先编译完成)
#PCRE库路径
PCRE_PATH=${HNP_PUBLIC_PATH}/pcre.org/pcre_8.45.0
#XZ库路径
XZ_PATH=${HNP_PUBLIC_PATH}/xz.org/xz_5.8.2
#Zlib库路径
ZLIB_PATH=${HNP_PUBLIC_PATH}/zlib.org/zlib_1.3.1
# 配置依赖查找路径
export PKG_CONFIG_PATH="${PCRE_PATH}/lib/pkgconfig:${XZ_PATH}/lib/pkgconfig"
# ag安装目录
mkdir -p ${AG_INSTALL_HNP_PATH}
#包含依赖库的头文件
CFLAGS="-I${PCRE_PATH}/include -I${XZ_PATH}/include"
#static静态链接,这样直接出来命令可执行文件,避免依赖问题
LDFLAGS="-static -L${PCRE_PATH}/lib -L${XZ_PATH}/lib -L${ZLIB_PATH}/lib"
#configure 构建脚本
./configure --host=aarch64-linux-musl \
--prefix=${AG_INSTALL_HNP_PATH}
make VERBOSE=1 -j$(nproc)
make install
# 生成鸿蒙HNP软件包
cp hnp.json ${AG_INSTALL_HNP_PATH}/
pushd ${AG_INSTALL_HNP_PATH}/../
${HNP_TOOL} pack -i ${AG_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
tar -zvcf ${ARCHIVE_PATH}/ohos_ag_2.2.0.tar.gz ag_2.2.0/
popd
3.2 关键配置解析
| 配置项 | 技术作用 | 必要性 |
|---|---|---|
PKG_CONFIG_PATH |
指定PCRE/XZ库的元数据查找路径 | 关键 |
-static |
强制静态链接避免运行时依赖 | 必需 |
CFLAGS/LDFLAGS |
显式声明头文件与库文件的物理路径 | 必需 |
--host |
指定交叉编译的目标平台架构 | 必需 |
四、部署验证
4.1 文件结构
ag_2.2.0/
├── bin/
│ └── ag # 核心搜索工具
└── share/
└── man/ # 使用手册
4.2 功能测试
bash
# 版本验证
ag --version
ag version 2.2.0
# 代码搜索测试
ag -G '\.h$' HARMONY_OS
./kernel/include/HARMONY_OS.h
1:#define HARMONY_OS_VERSION "OpenHarmony 4.0"
鸿蒙容器中验证截图:

鸿蒙PC容器介绍:低成本搭建鸿蒙PC运行环境:基于 Docker 的 x86_64 服务器
五、常见问题解决
5.1 依赖库缺失错误
bash
error: libpcre.so.1: cannot open shared object file
解决方案:确认静态链接参数生效,重新执行make clean && make
5.2 正则匹配异常
检查PCRE库版本兼容性:
bash
ag --pcre-version
# 应显示PCRE 8.45
六、优化方向
- 索引加速:集成鸿蒙分布式数据库实现预索引
- 安全增强:支持鸿蒙权限管理系统进行访问控制
- 异构搜索:通过软总线实现跨设备联合搜索
- 算法优化:针对YAFFS2文件系统优化inode遍历
移植要点 :通过
PKG_CONFIG_PATH精确控制依赖关系,-static参数可规避动态库路径问题,建议优先采用静态编译方案。
附件资源:
通过移植实践,我们将专业的代码搜索工具带入鸿蒙生态。
欢迎加入鸿蒙开发者社区,共同打造开发者工具生态: 鸿蒙开发者社区