Build Process - langningchen/miniapp GitHub Wiki

编译流程详解

本指南详细介绍如何从源码编译 miniapp 项目,包括前端构建、后端编译和最终打包的完整流程。

🎯 编译概览

miniapp 的编译过程分为几个阶段:

  1. 环境准备 - 获取设备信息和依赖库
  2. 前端构建 - 编译 Vue.js 用户界面
  3. 后端编译 - 交叉编译 C++ 核心模块
  4. 资源整合 - 打包成 miniapp.amr 文件
  5. 部署安装 - 上传到设备并安装

📋 编译前准备

确认环境

在开始编译之前,确保您已经完成:

克隆项目

# 创建工作目录
mkdir -p ~/development
cd ~/development

# 克隆项目
git clone https://github.com/langningchen/miniapp.git
cd miniapp

# 检查项目结构
ls -la

🔧 第一步:获取设备信息

连接设备

# 确保设备已连接并授权
adb devices

# 应该看到设备列表,状态为 device

获取版本信息

# 进入设备 shell
adb shell

# 在设备上运行版本检测脚本
curl -k -s https://raw.githubusercontent.com/langningchen/miniapp/refs/heads/main/tools/getVersionInfo.sh | bash

# 退出设备 shell
exit

# 拉取生成的版本信息文件
adb pull /userdisk/Favorite/versionInfo.tar.gz ./versionInfo.tar.gz

提取版本信息

# 解压版本信息到 jsapi 目录
tar -xzf versionInfo.tar.gz -C ./jsapi

# 检查提取的文件
ls -la jsapi/include/
ls -la jsapi/lib/

您应该看到类似文件:

jsapi/include/
├── curl/
│   └── curl.h
├── sqlite3/
│   └── sqlite3.h
└── ...

jsapi/lib/
├── libcurl.so
├── libsqlite3.so
└── ...

🏗️ 第二步:下载和配置工具链

确定工具链版本

# 检查版本信息文件中的系统信息
find jsapi/ -name "*version*" -o -name "*system*" -type f | xargs cat

下载工具链

根据设备信息选择合适的工具链:

# 进入工具链目录
mkdir -p jsapi/toolchains
cd jsapi/toolchains

# 下载 GLIBC 工具链(大多数设备使用)
wget https://toolchains.bootlin.com/downloads/releases/toolchains/armv7-eabihf/tarballs/armv7-eabihf--glibc--stable-2018.11-1.tar.bz2

# 解压工具链
tar -xjf armv7-eabihf--glibc--stable-2018.11-1.tar.bz2

# 返回项目根目录
cd ../..

验证工具链

# 测试交叉编译器
jsapi/toolchains/armv7-eabihf--glibc--stable-2018.11-1/bin/arm-buildroot-linux-gnueabihf-gcc --version

# 检查目录结构
tree jsapi/ -L 3 -d

🎨 第三步:前端构建

安装前端依赖

# 进入 UI 目录
cd ui

# 安装依赖包
pnpm install

如果安装过程中出现错误,可能需要修改一些库文件(项目特定要求):

# 修改 rollup 配置以支持 TypeScript
sed -i "s/commonjs(),/commonjs(),require('@rollup\/plugin-typescript')(),/g" ./node_modules/aiot-vue-cli/src/libs/rollup.config.js

# 修改 Vue 编译器配置
sed -i "s/compiler.parseComponent(content, { pad: 'line' })/compiler.parse(content, { pad: 'line' }).descriptor/g" ./node_modules/aiot-vue-cli/web-loaders/falcon-vue-loader/lib/parser.js

# 更新编译器路径
sed -i "s/path.resolve(__dirname, '.\/vue\/packages\/vue-template-compiler\/index.js')/'@vue\/compiler-sfc'/g" ./node_modules/aiot-vue-cli/cli-libs/index.js

# 修复解析器
sed -i "s/compiler.parseComponent(content, { pad: true })/compiler.parse(content, { pad: true }).descriptor/g" ./node_modules/aiot-vue-cli/src/libs/parser.js

# 修复模板编译器
sed -i "s/compiler.compile/compiler.compileTemplate/g" ./node_modules/aiot-vue-cli/web-loaders/falcon-vue-loader/lib/template-compiler/index.js

# 添加 defineComponent 替换规则
sed -i "s/const replaceValues = {}/const replaceValues = { 'defineComponent': '' }/g" ./node_modules/aiot-vue-cli/src/libs/rollup.config.js

构建前端

# 构建前端资源
pnpm run build

# 检查构建输出
ls -la dist/

返回项目根目录

cd ..

⚙️ 第四步:后端编译

配置 CMake

# 进入 jsapi 目录
cd jsapi

# 创建构建目录
mkdir -p build
cd build

# 使用 CMake 配置项目
cmake ..

# 检查配置是否成功
echo "CMake 配置完成,返回码: $?"

编译 C++ 代码

# 编译项目(使用多核并行编译)
make -j$(nproc)

# 检查编译结果
ls -la

# 查看生成的可执行文件
file jsapi_langningchen  # 应该显示 ARM 架构

如果编译成功,您应该看到:

  • jsapi_langningchen - 主要可执行文件
  • 各种 .o 目标文件
  • 可能的库文件

返回项目根目录

cd ../..

📦 第五步:整体构建

使用构建脚本

项目提供了自动化构建脚本:

# 执行完整构建流程
./tools/build.sh

# 脚本会自动执行:
# 1. 前端构建
# 2. 后端编译
# 3. 资源整合
# 4. 生成 miniapp.amr 文件

手动构建(如果需要)

如果自动脚本失败,您可以手动执行各个步骤:

# 1. 前端构建
cd ui
pnpm run build
cd ..

# 2. 后端编译
cd jsapi/build
make -j$(nproc)
cd ../..

# 3. 创建发布目录
mkdir -p dist

# 4. 复制前端资源
cp -r ui/dist/* dist/

# 5. 复制后端可执行文件
cp jsapi/build/jsapi_langningchen dist/

# 6. 创建 AMR 包(这需要特定的打包工具)
# 具体步骤取决于 miniapp 平台的打包格式

✅ 验证编译结果

检查文件

# 检查构建输出
ls -la dist/

# 查看可执行文件信息
file dist/jsapi_langningchen

# 检查文件大小
du -h dist/*

测试可执行文件

# 如果有模拟器或本地测试环境,可以测试
# ./dist/jsapi_langningchen --help  # 可能不支持,因为是 ARM 架构

🚀 第六步:部署到设备

上传文件

# 上传 miniapp.amr 文件到设备
adb push dist/miniapp.amr /userdisk/Favorite/miniapp.amr

# 验证文件是否上传成功
adb shell ls -la /userdisk/Favorite/miniapp.amr

安装应用

# 进入设备 shell
adb shell

# 安装 miniapp
miniapp_cli install /userdisk/Favorite/miniapp.amr

# 检查安装状态
miniapp_cli list

# 退出设备 shell
exit

🔧 自定义构建配置

修改 CMake 配置

如果需要自定义编译选项,编辑 jsapi/CMakeLists.txt

# 添加调试信息
set(CMAKE_BUILD_TYPE Debug)

# 添加编译选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

# 添加预处理器定义
add_definitions(-DDEBUG_MODE=1)

修改前端构建

编辑 ui/package.json 中的构建脚本:

{
  "scripts": {
    "build": "aiot-vue-cli build",
    "build:debug": "aiot-vue-cli build --mode development",
    "watch": "aiot-vue-cli build --watch"
  }
}

🐛 编译问题排查

常见编译错误

1. 找不到头文件

# 检查 include 目录
ls -la jsapi/include/

# 确保版本信息正确解压
tar -tf versionInfo.tar.gz | grep include

2. 找不到库文件

# 检查 lib 目录
ls -la jsapi/lib/

# 检查库文件架构
file jsapi/lib/libcurl.so

3. 工具链问题

# 检查工具链路径
ls -la jsapi/toolchains/

# 测试编译器
jsapi/toolchains/armv7-eabihf--glibc--stable-2018.11-1/bin/arm-buildroot-linux-gnueabihf-gcc --version

清理和重建

# 清理构建文件
rm -rf jsapi/build
rm -rf ui/dist
rm -rf ui/node_modules/.cache

# 重新构建
mkdir -p jsapi/build
cd jsapi/build
cmake ..
make clean
make -j$(nproc)
cd ../..

# 重新构建前端
cd ui
pnpm install
pnpm run build
cd ..

📊 构建优化

并行编译

# 使用所有 CPU 核心
make -j$(nproc)

# 或指定核心数
make -j4

缓存优化

# 使用 ccache 加速编译
sudo apt install ccache

# 配置 CMake 使用 ccache
export CC="ccache gcc"
export CXX="ccache g++"

磁盘空间优化

# 清理 pnpm 缓存
pnpm store prune

# 清理 CMake 缓存
rm -rf jsapi/build/CMakeCache.txt

🚀 下一步

编译完成后,请继续:

❗ 常见问题

问题1:版本信息获取失败

解决方案

# 检查设备连接
adb devices

# 手动下载脚本
wget https://raw.githubusercontent.com/langningchen/miniapp/refs/heads/main/tools/getVersionInfo.sh
adb push getVersionInfo.sh /tmp/
adb shell "chmod +x /tmp/getVersionInfo.sh && /tmp/getVersionInfo.sh"

问题2:工具链下载失败

解决方案

# 使用国内镜像
# 或手动下载并传输文件

# 验证下载的文件
md5sum armv7-eabihf--glibc--stable-2018.11-1.tar.bz2

问题3:前端依赖安装失败

解决方案

# 清理缓存
rm -rf ui/node_modules
rm -f ui/pnpm-lock.yaml

# 使用镜像源
pnpm config set registry https://registry.npmmirror.com

# 重新安装
pnpm install

需要帮助? 查看 常见问题解决 获取更多解决方案。