Tizen:Samsung Watch 和 Smart TV 开发的本质

作者: IT Sectr 发布日期: 2026-02-07 阅读时间: 13 分钟

Tizen 是一个基于 Linux 的开源操作系统,由三星和 Linux 基金会开发。用于 Galaxy Watch 智能手表、三星 Smart TV、家用电器和 IoT 设备。原生应用程序用 C/C++ 开发,Web 应用程序用 HTML5/JavaScript 开发。Tizen SDK 提供模拟器以及基于 Visual Studio Code 的 IDE。根据 Tizen 协会 的数据,该生态系统拥有超过 2 亿台设备。

要点

  • Tizen — 三星在 Linux 内核上的开源操作系统,适用于手表、电视、家用电器和 IoT
  • C/C++ — 用于高性能原生应用程序的主要语言,具有完整的硬件访问权限
  • HTML5/JS — 用于 Web 应用程序的技术栈,具有 Tizen Device API 和快速原型设计能力
  • Tizen Studio — 带有手表和电视模拟器、性能分析器和调试器的 SDK,基于 VS Code
  • Galaxy Store — 三星的应用商店,具有审核、签名和 30/25% 的佣金

什么是 Tizen?

Tizen 是一个开源操作系统,由三星和 Linux 基金会监督。首个商业版本 Tizen 1.0 于 2012 年发布。该系统基于 Linux 内核,并为不同类型的设备使用自己的框架架构:Tizen Mobile(智能手机 — 项目于 2017 年关闭)、Tizen Watch(手表)、Tizen TV(电视)和 Tizen IoT(智能家居)。

自 2021 年以来,三星主要在可穿戴设备和电视中使用 Tizen。2021 年之前的所有 Galaxy Watch 智能手表都运行 Tizen(Galaxy Watch、Watch Active、Watch 3)。从 Galaxy Watch 4 开始,三星已转向带有 One UI Watch 的 Wear OS,但 Tizen 继续为现有设备和电视提供支持。根据三星的数据(Tizen 生态系统报告,2025),全球超过 1.8 亿台电视安装了 Tizen TV。

Tizen 的一个关键特性是支持两种开发范式:具有最高性能的原生应用程序(C/C++)和用于快速开发的 Web 应用程序(HTML5、CSS、JavaScript)。两种类型都可以访问 Tizen Device API — 用于处理蓝牙、NFC、Wi-Fi、传感器、摄像头和多媒体的封装器。

Tizen 版本历史

Tizen 2.3(2014)— 首款针对三星 Z 智能手机的稳定版本。Tizen 3.0(2017)— 改进的多任务处理、支持 Vulkan、64 位架构。Tizen 4.0(2018)— 重新设计的框架、NPU 上的 AI 加速支持。Tizen 5.5(2020)— 带有 AVPlay 2.0、WebAssembly、改进渲染的 Tizen TV。Tizen 6.0(2022)— 设备上 ML 推理支持、适用于 IoT 的 Matter 协议。

Tizen 版本年份设备关键创新
2.32014智能手机首款商业版本在三星 Z 上发布
3.02017智能手机、手表Vulkan、64 位、Galaxy Watch
4.02018手表、电视、IoTAI 框架、Tizen TV 2019
5.52020电视、IoTAVPlay 2.0、WebAssembly、改进的 WebGL
6.02022电视、IoTML 推理、Matter 协议

Tizen 架构:Linux 内核和框架

Tizen 架构 采用模块化原则构建,具有多层结构。最底层是 Linux 内核,带有针对能效和实时任务(电视和音频的 RT_PREEMPT)的补丁。内核之上是硬件抽象层(HAL),提供对相机、传感器、蓝牙、Wi-Fi、NFC 和显示驱动程序的统一访问(通过 DirectFB 或 Wayland)。

核心框架层

核心框架层包括 应用程序框架(应用程序生命周期管理)、UI 框架(EFL — 用于 UI 的 Enlightenment Foundation Libraries,DALi — 用于游戏和动画的 3D 引擎)、多媒体框架(通过 GStreamer 和 MediaCodec 提供相机、音频、视频)、网络框架(蓝牙、Wi-Fi、NFC、HTTP、WebSocket)和 安全框架(SELinux、Smack、Tizen 权限系统)。

服务层

服务层提供系统服务:应用程序管理器(启动、停止、多任务)、包管理器(安装/卸载应用程序、.tpk 和 .wgt 格式)、位置管理器(GPS、Wi-Fi 定位、地理围栏)、传感器管理器(加速度计、陀螺仪、气压计、心率监视器)、上下文管理器(用户活动识别:步行、跑步、睡眠)。

用于 Web 应用程序的 Device API

Tizen 提供 Device API — 用于 Web 应用程序的 JavaScript 接口,提供与原生 API 相同的功能访问。API 分为模块:Application API、Bluetooth API、Calendar API、Call History API、Contact API、Content API、Data Control API、Download API、Gallery API、Media Controller API、Message API、NFC API、Notification API、Power API、Push API、System Info API、Time API、Web Setting API。

C/C++ 中的 Tizen 原生应用程序

Tizen 原生应用程序 编译为 .tpk 格式(Tizen Package Kit)的可执行文件。主要语言是带有 GCC 或 Clang 编译器的 C++11/14。开发在 Tizen Studio 或带有 Tizen 扩展的 Visual Studio Code 中进行。原生应用程序可以直接访问 EFL、DALi、GStreamer 和所有系统 API,无需中介,确保最高性能。

原生应用程序结构

原生应用程序包含 tizen-manifest.xml 文件(类似于 AndroidManifest.xml)、一个或多个共享库(.so)和资源(图像、字体、本地化)。生命周期通过 app_event_cb 管理:APP_EVENT_CREATE、APP_EVENT_RESUME、APP_EVENT_PAUSE、APP_EVENT_DESTROY。UI 通过 EFL(Edje + Elementary)构建,用于窗口应用程序,或通过 DALi 用于 3D 图形。

cpp
// 使用 EFL UI 的 C++ Tizen 原生应用程序
#include <app.h>
#include <efl_extension.h>
#include <dlog.h>

typedef struct appdata {
    Evas_Object *win;
    Evas_Object *conform;
    Evas_Object *label;
} appdata_s;

static void
win_delete_cb(void *data, Evas_Object *obj, void *event_info) {
    ui_app_exit();
}

static void
create_base_gui(appdata_s *ad) {
    // 创建 Tizen 窗口
    ad->win = efl_add(EFL_UI_WIN_CLASS, nullptr,
                      efl_ui_win_typename_set(efl_add(EFL_UI_WIN_CLASS, nullptr), "tizen-hello"));

    // 窗口标题
    efl_text_set(ad->win, "Hello Tizen");
    efl_event_callback_add(ad->win, EFL_UI_WIN_EVENT_DELETE_REQUEST, win_delete_cb, ad);

    // Conformant — 适用于可穿戴设备的标准 Tizen 容器
    ad->conform = efl_add(EFL_UI_CONFORMANT_CLASS, ad->win);
    efl_content_set(ad->win, ad->conform);
    efl_gfx_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

    // 文本标签
    ad->label = efl_add(EFL_UI_LABEL_CLASS, ad->conform);
    efl_text_set(ad->label, "欢迎来到 Tizen!");
    efl_content_set(ad->conform, ad->label);

    // 显示窗口
    efl_gfx_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    efl_gfx_size_hint_align_set(ad->label, EVAS_HINT_FILL, EVAS_HINT_FILL);
}

static void
app_get_resource_cb(void *data) {
    // 应用程序资源获取处理器
    appdata_s *ad = (appdata_s *)data;
    create_base_gui(ad);
}

static bool
app_create_cb(void *data) {
    // 创建应用程序时调用
    appdata_s *ad = (appdata_s *)data;
    create_base_gui(ad);
    return true;
}

int
main(int argc, char *argv[]) {
    appdata_s ad = {0,};
    ui_app_lifecycle_callback_s event_callback = {0,};

    event_callback.create = app_create_cb;
    return ui_app_main(argc, argv, &event_callback, &ad);
}

原生 Tizen Hello World 应用程序使用 EFL(Enlightenment Foundation Libraries)作为 UI。ui_app_main 是 Tizen 的入口点,接受生命周期回调。efl_add 通过 Win → Conformant → Label 层次结构创建 UI 对象。EFL UI 基于 Edje 复合模型 — 主题描述用 .edc 文件编写并编译为 .edj。

Tizen 清单(tizen-manifest.xml)

tizen-manifest.xml 文件是原生应用程序的配置。它指定 id(反向域格式的唯一标识符)、package(包名)、version、label(显示名称)、author 和 description。权限声明 API 访问:http://tizen.org/privilege/bluetooth、http://tizen.org/privilege/location、http://tizen.org/privilege/camera。如果不指定权限,调用相应的 API 将导致 SECURITY_ERR 错误。

HTML5 和 JavaScript 中的 Tizen Web 应用程序

Tizen Web 应用程序 是打包为 .wgt 格式(W3C Widget)的 HTML5 应用程序。开发过程与创建普通网站相同,但通过全局 tizen 对象额外访问 Tizen Device API。Web 应用程序在自己的 Web Runtime(WRT)进程中运行,基于 WebKit 引擎(Tizen 2.x-4.x)或 Chromium(Tizen 5.5+)。

Web 应用程序结构

Web 应用程序包含 index.html(入口点)、config.xml(W3C Widget 配置)、CSS、JavaScript 和图像。config.xml 文件类似于 KaiOS 中的 manifest.webapp:必填字段包括 widget(id、version、手表的 height/width)、name、description 和 author。Device API 的权限通过 tizen:privilege 元素指定。CSP(内容安全策略)部分限制脚本来源。

javascript
// 用于 Tizen Watch Web 应用程序的 config.xml
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns="http://www.w3.org/ns/widgets"
        xmlns:tizen="http://tizen.org/ns/widgets"
        id="com.example.heartrate"
        version="1.0.0"
        height="360" width="360">
    <tizen:application id="com.example.heartrate"
                       package="com.example.heartrate"
                       required_version="4.0"/>
    <name>心率计</name>
    <description>在 Galaxy Watch 上测量心率</description>
    <author>Developer</author>
    <tizen:privilege name="http://tizen.org/privilege/healthinfo"/>
    <tizen:privilege name="http://tizen.org/privilege/sensor"/>
    <tizen:profile name="wearable"/>
    <tizen:content-security-policy>
        default-src 'self'; script-src 'self'; style-src 'self'
    </tizen:content-security-policy>
</widget>

最小的 config.xml 片段展示了关键元素:带有 id 和版本的 widget、带有 wearable 配置文件的 tizen:application(用于圆形手表屏幕)、用于 healthinfo 和 sensor API 的 tizen:privilege,以及将内容加载限制为仅来自应用程序包的内容安全策略。

javascript
// Tizen Watch Web 应用程序:心率监测
const HeartRateMonitor = {
    hrSensor: null,
    isMonitoring: false,

    async init() {
        try {
            // 检查 HRM 传感器支持
            const sensors = tizen.sensorservice.getAvailableSensors();
            if (!sensors.includes('HRM')) {
                throw new Error('未找到 HRM 传感器');
            }

            // 获取心率传感器访问权限
            this.hrSensor = tizen.sensorservice.getDefaultSensor('HRM');
            console.log('HRM 传感器已初始化');
        } catch (err) {
            console.error('初始化错误:', err.message);
        }
    },

    startMonitoring() {
        if (!this.hrSensor) return;

        this.isMonitoring = true;
        this.hrSensor.startSensor({
            interval: 1000,  // 每秒测量
            callback: {
                onsuccess: (data) => {
                    const heartRate = data.heartRate;
                    document.getElementById('hr-value').textContent = heartRate;
                    this.updateDisplay(heartRate);
                },
                onerror: (err) => {
                    console.error('传感器错误:', err.message);
                }
            }
        });
    },

    stopMonitoring() {
        if (this.hrSensor && this.isMonitoring) {
            this.hrSensor.stopSensor();
            this.isMonitoring = false;
        }
    },

    updateDisplay(heartRate) {
        // 在 360x360 圆形屏幕上显示心率
        const canvas = document.getElementById('hr-canvas');
        const ctx = canvas.getContext('2d');
        ctx.clearRect(0, 0, 360, 360);

        // 圆形心率指示器
        ctx.beginPath();
        ctx.arc(180, 180, 120, 0, 2 * Math.PI);
        ctx.strokeStyle = '#ff4444';
        ctx.lineWidth = 8;
        ctx.stroke();
    }
};

document.addEventListener('DOMContentLoaded', () => {
    HeartRateMonitor.init().then(() => {
        HeartRateMonitor.startMonitoring();
    });
});

HeartRateMonitor 应用程序使用 Tizen Sensor API 访问 Galaxy Watch 的 HRM 传感器。tizen.sensorservice.getDefaultSensor('HRM') 获取心率传感器,startSensor 以 1 秒间隔开始测量。360×360 的 canvas 绘制圆形指示器 — 这是圆形 Tizen 手表屏幕的典型 UI 范例。

Tizen Watch 开发:Circle UI 和 Rotary

Tizen Watch 具有独特的 UI 特性:圆形屏幕(Galaxy Watch 上为 360×360 像素)、用于导航的物理表圈(rotary bezel)和三个硬件按钮:Home、Back 和 Custom。开发人员必须针对圆形区域调整界面 — 角落元素可能被裁剪。Circle UI 是三星的一个库,提供用于圆形屏幕的现成组件。

Rotary Bezel

Rotary Bezel — Galaxy Watch 屏幕周围的物理环,用于列表导航、音量调节和缩放。在 Tizen 中,旋转事件通过 rotarydetector 或 EFL edje 信号处理。每个表圈凹口都会生成一个带有旋转角度(0-360 度)的事件。Web 应用程序通过 rotarydetector API 处理表圈:tizen.rotarydetector。

javascript
// Tizen Watch 中的 Rotary Bezel 处理
class RotaryNavigation {
    constructor() {
        this.currentAngle = 0;
        this.sections = document.querySelectorAll('.rotary-section');
        this.currentSection = 0;
        this.init();
    }

    init() {
        // 订阅表圈旋转事件
        const detector = tizen.rotarydetector;

        detector.addEventListener('rotarydetector', (event) => {
            // event.angle — 当前角度(0-360)
            // event.direction — 'cw'(顺时针)或 'ccw'(逆时针)
            this.handleRotation(event);
        });

        // 激活 rotarydetector
        detector.start();
    }

    handleRotation(event) {
        const delta = event.delta;  // 角度变化
        this.currentAngle += delta;

        // 确定方向和移动
        if (delta > 0) {
            // 顺时针旋转 — 下一个元素
            this.currentSection = Math.min(this.currentSection + 1, this.sections.length - 1);
        } else {
            // 逆时针旋转 — 上一个元素
            this.currentSection = Math.max(this.currentSection - 1, 0);
        }

        this.updateUI();
    }

    updateUI() {
        this.sections.forEach((el, i) => {
            el.classList.toggle('active', i === this.currentSection);
            el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
        });
    }

    destroy() {
        tizen.rotarydetector.removeEventListener('rotarydetector');
        tizen.rotarydetector.stop();
    }
}

// 加载应用程序时初始化
document.addEventListener('tizen-rotary-ready', () => {
    const nav = new RotaryNavigation();
});

RotaryNavigation 类通过 tizen.rotarydetector.addEventListener 订阅 rotarydetector 事件。当表圈旋转时,计算方向(cw/ccw)和角度增量。当前部分使用 active 类突出显示。rotarydetector.start() 是必需的 — 没有它,事件不会生成。destroy() 取消订阅并停止检测器以防止内存泄漏。

手表的 UI 特性

Tizen Watch 界面使用以下组件:RotarySelector(由表圈控制的圆形列表)、CircularList(带圆形滚动的列表)、RadialMenu(带圆形排列图标的径向菜单)、EdgePanel(从屏幕边缘滑出的面板)和 CircleProgressBar(圆形进度指示器)。所有组件都针对 360×360 分辨率进行了优化,并考虑了屏幕缺少角落的情况。最小触摸目标尺寸为 48 像素。

Tizen TV 开发:Smart TV 应用程序

Tizen TV — 适用于三星 Smart TV 的平台,拥有自己的 SDK 和模拟器。电视应用程序分为两种类型:Web 应用程序(HTML5/JS)和原生应用程序(C/C++)。电视的 Web 应用程序开发更快、更容易,但原生应用程序为视频和游戏提供更好的性能。Tizen TV 使用带 D-pad 的遥控器进行导航。

用于视频的 AVPlay API

AVPlay API — Tizen TV 用于视频播放的关键 API。支持 H.264、H.265(HEVC)、VP9、AV1 格式。2024+ 电视上最高支持 8K 分辨率。AVPlay API 提供硬件解码、HDR10+、Dolby Atmos、字幕和多音轨。通过 play()、pause()、stop()、seekTo(position)、setDisplayRect() 控制。流可以是本地文件或 HLS/DASH URL。

javascript
// 用于 Tizen TV 的视频播放器,带有 AVPlay API
class TizenVideoPlayer {
    constructor(videoElementId) {
        this.videoElement = document.getElementById(videoElementId);
        this.avplay = null;
        this.isReady = false;
    }

    async init(url) {
        try {
            // 检查 AVPlay 可用性
            if (typeof webapis === 'undefined' ||
                !webapis.avplay) {
                throw new Error('AVPlay API 不可用');
            }

            this.avplay = webapis.avplay;
            this.avplay.open(url);

            // 设置显示为电视全屏
            this.avplay.setDisplayRect(0, 0, 3840, 2160);
            this.avplay.setDisplayMethod(webapis.avplay.AVPLAY_DISPLAY_METHOD_PLAYER);

            // 音频配置(Dolby Atmos,如果支持)
            this.avplay.setStreamingProperty('ADAPTIVE_INFO', JSON.stringify({
                width: 3840,
                height: 2160,
                bitrate: 25000000
            }));

            this.avplay.prepareAsync(
                () => {
                    this.isReady = true;
                    console.log('视频已准备好播放');
                },
                (error) => {
                    console.error('准备错误:', error);
                }
            );
        } catch (err) {
            console.error('初始化错误:', err);
        }
    }

    play() {
        if (this.isReady) this.avplay.play();
    }

    pause() {
        this.avplay.pause();
    }

    seekTo(positionMs) {
        this.avplay.seekTo(positionMs);
    }

    setSubtitle(url, encoding) {
        this.avplay.setStreamingProperty('SUBTITLE', JSON.stringify({
            url: url,
            encoding: encoding || 'UTF-8'
        }));
    }
}

// 使用
const player = new TizenVideoPlayer('video-area');
player.init('https://example.com/stream.m3u8');
player.setSubtitle('https://example.com/subs.vtt', 'UTF-8');

TizenVideoPlayer 类演示了 AVPlay API 的使用。webapis.avplay.open() 打开媒体流(本地或 HLS/DASH)。setDisplayRect 设置渲染区域 — 在电视上通常是 3840×2160 的全屏。prepareAsync 是带回调的异步准备。AVPlay 通过 ADAPTIVE_INFO 支持自适应比特率,通过 SUBTITLE 属性支持字幕。

Galaxy Store 和应用程序发布

Samsung Galaxy Store — Tizen(手表、电视、IoT)的官方应用商店。开发人员注册通过三星开发者计划免费。开发人员上传 .tpk(原生)或 .wgt(Web)格式的应用程序,并使用三星证书签名。审核需要 2-5 个工作日。Galaxy Store 在 190 个国家/地区可用。

应用程序签名

Tizen 需要使用三星证书对应用程序进行数字签名。过程:通过 Samsung Certificate Manager 生成作者证书,为商店创建分发者证书,通过 Tizen Studio 签名包(Build Signed Package)。证书与开发者帐户关联。如果没有签名,应用程序只能在启用开发者模式的开发设备上安装。

盈利模式

Galaxy Store 支持付费应用程序(前 10,000 美元收取 30% 佣金,之后 25%)、订阅(25%)、通过 Samsung Ads 广告和通过 Samsung IAP 的应用内购买。对于电视应用程序,可使用 Smart TV Premium Channels 模式。最低价格为 0.99 美元。达到 100 美元门槛后每月付款。

要求原生(.tpk)Web(.wgt)
语言C/C++HTML5, CSS, JS
UI 框架EFL, DALi, Tizen Circle UICircle UI (JS)
API 访问完整系统Device API
性能最高较低(Web Runtime)
包大小最大 100 MB最大 10 MB
起始模板Tizen Native AppTizen Web App

常见问题

Tizen 开发使用哪些语言?

原生应用程序 使用 C/C++ 编写,使用 EFL 或 DALi 作为 UI。Web 应用程序使用 HTML5、CSS 和 JavaScript 以及 Tizen Device API。对于 Tizen TV,可以通过 Tizen .NET 使用 .NET(C#)进行开发。三星建议对高性能应用程序使用 C++,对简单界面使用 JavaScript。

Tizen 与 Wear OS 有何不同?

Tizen 使用针对三星硬件优化的自己的 C/C++ 框架。Wear OS 基于 Android 使用 Kotlin/Java。Tizen 在相同硬件上功耗降低 30%,但商店中的应用程序较少。自 2021 年起,三星在新手表上转向了 Wear OS,但 Tizen 继续得到支持。

如何为 Tizen TV 创建 Web 应用程序?

Tizen TV 创建的 Web 应用程序使用 HTML5/JavaScript 和 Tizen Device API。开发在带电视模拟器的 Tizen Studio 中进行。应用程序打包为 .wgt 包。关键 API:AVPlay(视频)、TVInfoDevice(电视规格)、TVInputDevice(遥控器)、WebAudio(声音)。通过遥控器的 D-pad 导航。

Tizen 中的 Rotary Bezel 是什么?

Rotary Bezel — Galaxy Watch 屏幕周围的物理旋转环,用于导航。事件通过 tizen.rotarydetector API 处理。每个凹口生成一个带有旋转角度和方向(cw/ccw)的事件。Rotary Bezel 用于滚动列表、调节音量、缩放和菜单导航。

如何发布 Tizen 应用程序?

通过 Samsung Galaxy Store 发布。开发人员注册免费。应用程序(.tpk 或 .wgt 格式)使用三星证书签名。审核 2-5 天。前 10,000 美元收入佣金 30%,之后 25%。最低价格 0.99 美元。100 美元起每月付款。

总结

  • Tizen — 三星在 Linux 内核上的开源操作系统,适用于手表、电视、IoT 和家用电器,支持原生和 Web 应用程序
  • 原生应用程序(C/C++、EFL/DALi、.tpk 格式)提供最高性能和完整的硬件访问权限
  • Web 应用程序(HTML5/JS、.wgt 格式、基于 Chromium 的 Web Runtime)— 使用 Device API 快速开发
  • Tizen Watch 使用 360×360 圆形屏幕、Rotary Bezel、Circle UI 以及 RotarySelector/CircularList 组件
  • Tizen TV 使用 AVPlay API 对 H.264/H.265/VP9 进行硬件解码,支持高达 8K、HDR10+、Dolby Atmos
  • Galaxy Store — 免费注册、.tpk/.wgt 格式、三星证书签名、2-5 天审核
  • Tizen Studio — 基于 VS Code 的 SDK,带有手表和电视模拟器、性能分析器和调试器

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读