Garmin 新手维护升级SDK记录

官网:首页 |Garmin 开发者

目录

[1. 环境搭建(windows)](#1. 环境搭建(windows))

[Connect IQ SDK | Garmin Developers 下载SDK](#Connect IQ SDK | Garmin Developers 下载SDK)

[Visual Studio Code - 开源的 AI 代码编辑器 VScode下载](#Visual Studio Code - 开源的 AI 代码编辑器 VScode下载)

java环境下载

如何验证安装成功?

[2. 工程创建和编译](#2. 工程创建和编译)

创建工程(vscode的插件都下载了就可以)

编译key

进行编译工程

[3. 模拟器测试](#3. 模拟器测试)

[4. 真机测试](#4. 真机测试)

[5. 发布IQ应用](#5. 发布IQ应用)


1. 环境搭建(windows)

下载3个环境:

  1. SDK

2.VScode

  1. Java

Connect IQ SDK | Garmin Developers 下载SDK

  1. 选择安装器:根据你的操作系统下载对应的安装程序。

    • Windows : .exe 安装程序,推荐使用默认路径(如 C:\Garmin\ConnectIQ-Sdk)。

    • macOS : .dmg 镜像文件。

    • Linux : .sh 脚本文件或 .tar.gz 压缩包。

  2. 运行安装:按照向导完成安装。安装程序会自动配置部分环境。(SDK下载后,需要申请一个账号,有了就可以进去下载对应的SDK)

Visual Studio Code - 开源的 AI 代码编辑器VScode下载

  1. 安装插件 :在 VS Code 扩展商店中搜索并安装 "Garmin Connect IQ" 官方插件。

  2. 创建key:ctrl+shift+P;选择monkeyc:generate a Developer Key (这个一般你需要你下载好SDK)

  3. 配置 SDK 路径

    你下载的SDK路径需要加到工程编译中;

    1. SDK:C:\Garmin\ConnectIQ\Sdks\connectiq-sdk-win-8.4.0-2025-12-03-5122605dc
    2. key:C:\work-monkeyC\work\App\new_program\key

java环境下载

  1. Oracle Java 11 :可从 Oracle官网 下载(可能需要注册账户)。
  2. OpenJDK 11 :推荐从 Adoptium(Temurin) 下载,这是开源免费的发行版。
如何验证安装成功?
复制代码
为了确保一切就绪,你可以检查以下几点:
Java 版本:终端中 java -version 输出为 11。
SDK 命令:在终端中运行 monkeyc -v 能输出编译器版本号。
IDE 插件:VS Code 或 Eclipse 中已安装 Connect IQ 插件且 SDK 路径正确。
设备连接:手表在 Garmin 模式下能被 monkeydo -d 命令识别。
模拟器运行:按 F5 可以成功启动模拟器并看到示例应用。

2. 工程创建和编译

在 VS Code 中操作最为直观:

创建工程(vscode的插件都下载了就可以)

  1. 创建项目 :按下 Ctrl+Shift+P (Cmd+Shift+P),输入 "Monkey C:new Project" 并选择。

  2. 填写信息 :按向导填写项目名(如 MyFirstApp)、设备类型(选择 venu3)等。

  3. 运行与调试

    • 在模拟器中运行 :按 F5 或点击运行按钮,SDK 模拟器将启动并运行你的应用。所有 System.println() 的调试信息会实时输出在 VS Code 的 "输出" 面板中(选择 "Connect IQ" 频道)。

    • 在真机中运行 :确保手表已连接,在 VS Code 底部的状态栏,将运行目标从模拟器切换到你的设备(如 venu3),再次运行即可安装到手表。

创建Garmin APP工程

编译key

  1. 创建开发者key:按下 Ctrl+Shift+P (Cmd+Shift+P),输入"MonkeyC:generate a developer Key" 点击确认,选择一个保存你key的文件下。(这步的操作是在你安装好你的SDK的情况下,不要关闭它去产生的)

进行编译工程

我写了一个python脚本进行编译,可以编译出iq(发行版用)和prg(测试用)文件;

复制代码
import subprocess
import time
import os
import sys

def execute_command(command, description):
    """执行命令并返回结果"""
    print(f"\n{'='*50}")
    print(f"执行: {description}")
    print(f"命令: {command}")
    print('='*50)
    
    try:
        result = subprocess.run(
            command,
            shell=True,
            check=True,
            capture_output=True,
            text=True,
            encoding='utf-8',
            errors='ignore'
        )
        print("执行成功!")
        if result.stdout:
            print("\n输出:")
            print(result.stdout)
        return True
    except subprocess.CalledProcessError as e:
        print(f"\n执行失败!错误码: {e.returncode}")
        if e.stdout:
            print("\n标准输出:")
            print(e.stdout)
        if e.stderr:
            print("\n错误输出:")
            print(e.stderr)
        return False
    except Exception as e:
        print(f"\n执行出错: {str(e)}")
        return False

def main():
    """主函数"""
    #下面的是需要你自己根据自己工程实际情况的,sdk,key的位置决定的
    #工程路径:C:\work-monkeyC\work\App\new_program\APP2\APP2
    #SDK路径:C:\Garmin\ConnectIQ\Sdks\connectiq-sdk-win-8.4.0-2025-12-03-5122605dc\bin
    #key路径:key\developer_key
   

    config = {
        'project_path': r'C:\work-monkeyC\work\App\new_program\APP2\APP2',     
        'sdk_path': r'C:\Garmin\ConnectIQ\Sdks\connectiq-sdk-win-8.4.0-2025-12-03-5122605dc\bin',    
        'real_device_output': r'bin\APP2V251230.iq',
        'simulator_output': r'bin\APP2V251230.prg',
        'device': 'venu3',
        'jungle_file': 'monkey.jungle',
        'key_file': r'key\developer_key'
    }

    print("Garmin ConnectIQ 自动化编译与测试工具")
    print("="*60)

    # 检查路径是否存在
    if not os.path.exists(config['project_path']):
        print(f"错误:项目路径不存在 - {config['project_path']}")
        sys.exit(1)

    monkeyc_path = os.path.join(config['sdk_path'], 'monkeyc.bat')
    if not os.path.exists(monkeyc_path):
        print(f"错误:monkeyc.bat 不存在 - {monkeyc_path}")
        sys.exit(1)

    simulator_path = os.path.join(config['sdk_path'], 'simulator.exe')
    if not os.path.exists(simulator_path):
        print(f"错误:simulator.exe 不存在 - {simulator_path}")
        sys.exit(1)

    monkeydo_path = os.path.join(config['sdk_path'], 'monkeydo.bat')
    if not os.path.exists(monkeydo_path):
        print(f"错误:monkeydo.bat 不存在 - {monkeydo_path}")
        sys.exit(1)
    

    
    # 0. clean 编译内容
    clean_command = (
        f'powershell -Command "Remove-Item \'{os.path.join(config["project_path"], "bin", "*.prg")}\' -Force -ErrorAction SilentlyContinue; '
        f'Remove-Item \'{os.path.join(config["project_path"], "bin", "*.bar")}\' -Force -ErrorAction SilentlyContinue; '
        f'Remove-Item \'{os.path.join(config["project_path"], "bin", "external-mir")}\' -Recurse -Force -ErrorAction SilentlyContinue; '
        f'Remove-Item \'{os.path.join(config["project_path"], "bin", "gen")}\' -Recurse -Force -ErrorAction SilentlyContinue; '
        f'Remove-Item \'{os.path.join(config["project_path"], "bin", "mir")}\' -Recurse -Force -ErrorAction SilentlyContinue; '
        f'Write-Host \'Clean completed\'"'
    )
    execute_command(clean_command, "清理旧的编译产物")
    
    
    
    # 1. 编译真实板子版本
    real_device_compile_command = (
        f'powershell -Command "cd \'{config["project_path"]}\'; '
        f'& \'{monkeyc_path}\' -e -o \'{config["real_device_output"]}\' '
        f'-d {config["device"]} -f \'{config["jungle_file"]}\' '
        f'-y \'{config["key_file"]}\'"'
    )
    if not execute_command(real_device_compile_command, "编译真实板子版本"):
        sys.exit(1)
    
    # 2. 编译模拟器版本
    simulator_compile_command = (
        f'powershell -Command "cd \'{config["project_path"]}\'; '
        f'& \'{monkeyc_path}\' -o \'{config["simulator_output"]}\' '
        f'-d {config["device"]} -f \'{config["jungle_file"]}\' '
        f'-y \'{config["key_file"]}\'"'
    )
    if not execute_command(simulator_compile_command, "编译模拟器版本"):
        sys.exit(1)

    # 3. 启动模拟器
    simulator_command = (
        f'powershell -Command "Start-Process -FilePath \'{simulator_path}\'"'
    )
    if execute_command(simulator_command, "启动模拟器"):
        print("\n等待模拟器启动...")
        time.sleep(5)  # 等待模拟器完全启动
    else:
        print("\n模拟器启动失败,跳过模拟测试")
        sys.exit(1)

    # 4. 模拟测试
    run_command = (
        f'powershell -Command "cd \'{config["project_path"]}\'; '
        f'& \'{monkeydo_path}\' \'{config["simulator_output"]}\' {config["device"]}"'
    )
    execute_command(run_command, "运行模拟测试")

    print("\n" + "="*60)
    print("所有命令执行完成!")
    print("="*60)

if __name__ == "__main__":
    main()

这个脚本你要关注的是

你要根据实际的情况下你的路径,修改就可以了,它可以直接在powershell中进行编译。

如果你疑惑我为啥不拿vscode编译,是因为vscode用的少,自己会脚本所以就使用了比较熟悉的方法,你如果擅长vscode,那你就使用vscode编译就好。

得修改两个参数,不然创建工程的图位置放的不对

编译产生的执行文件

3. 模拟器测试

如果进行编译工程你是成功的,那就可以测试你的APP工程了。

我是用的方案是log信息;因为我主要是维护,开发的话,应该还会有更好的方案;

复制代码
 System.println("item 1")

4. 真机测试

这个最花我时间,我给大家节省下时间,因为这个就是信息差。(信息平权)

  1. 手表和电脑USB连接

  2. 电脑等1-3秒会弹出一个文件夹

  3. 继续打开文件,在我写的路径位置下五角星的地方放置你的工程产生的后缀prg的文件(假设五角星是AAA.prg)

  4. 接下来最关键的你需要保留下来你真机测试的log信息来分析,进入LOGS文件夹,在里面创建一个文件,它的名字是(假设你五角星处放的是AAA.prg),所以你的LOGS文件夹中就需要创建一个AAA.txt文件,这个文件就会保留你的log信息出来(其他名字就不会保存你的APP log信息)。

  5. 放好AAA.prg和创建好AAA.txt文件,你就可以断开手表USB,等1-3秒,就会显示你的应用安装成功。

  6. 接下来你就可以按照这个操作反复去迭代测试了。

5. 发布IQ应用

这个你有开发者账户就可以去做了。(这个我不负责,所以就不写了)

参考:

(99+ 封私信 / 80 条消息) 2023Garmin watch App开发指南 - 知乎

欢迎有任何garmin安装维护相关问题,可以讨论;不过我维护只做了2-3周,目前正提交出去给测试去测试了,测试好了就发布了,应该后期不再做这个了。