我們的作品

KensingtonWorks

Kensington 原本為旗下軌跡球提供兩套互不相關的工具程式,一套用於 Windows,一套用於 macOS。我們在九個月內以 KensingtonWorks 取代兩者:一套產品同時支援兩個平台,共用使用者介面與核心程式,搭配全新的通用 HID 驅動程式,以及具備數位簽署的自動化發行流程。

客戶
Kensington
年份
2019
我們的角色
統包:系統架構、驅動程式、使用者介面實作、安裝程式與發行自動化
平台
Windows, macOS
  • C
  • C++
  • Electron
  • JavaScript
  • WiX
  • Python
前往網站

挑戰

Kensington 的軌跡球深受設計師、建築師與工程師喜愛。在非常大型的圖面上,從一端移動到另一端,軌跡球比滑鼠快得多。Kensington 的軌跡球與滑鼠也比一般產品多了兩個按鍵,共有四個,而且額外的按鍵可以重新設定功能。

這些使用者的工作有固定節奏:移動到圖面的另一個位置,然後執行指令。在 AutoCAD 等 CAD 軟體中,指令是從選單或透過鍵盤快捷鍵執行。透過 Kensington 的軟體,使用者可以將快捷鍵指派給軌跡球按鍵。按下按鍵時,軟體會注入按鍵輸入,效果就如同使用者親自在鍵盤上輸入一樣。

大多數使用者會同時使用多個軟體,而每個軟體的快捷鍵都不同。因此,軟體也必須知道目前前景執行的是哪一個應用程式,並送出為該應用程式指派的快捷鍵。

2019 年時,Kensington 有兩套各自獨立的工具程式。Windows 版名為 KensingtonWorks,支援依應用程式個別設定。macOS 版名為 TrackballWorks,使用者介面完全不同,也不支援依應用程式個別設定。

Kensington 的需求

  • 一套使用者介面,在 Windows 與 macOS 上完全相同。
  • 兩個平台都支援依應用程式設定按鍵對應。
  • 設定儲存於雲端(Google Drive 與 Microsoft OneDrive),讓使用者換到另一台電腦也能沿用。
  • 按鍵輸入必須由裝置驅動程式注入系統的輸入佇列,而不是由使用者模式的應用程式模擬。有些 CAD 軟體會直接讀取 HID 輸入,並忽略應用程式模擬的按鍵。從最底層進入的輸入看起來就像來自實體鍵盤,所有軟體都會接受。
  • 通用 HID 驅動程式。 原有的驅動程式只支援以裝置 ID 識別的特定裝置。新的驅動程式必須支援任何 Kensington 裝置,包括未來推出的產品。

以上所有工作,都必須在一月到八月的九個月內完成。

我們的做法

如果開發兩套應用程式再設法保持同步,不但工作量加倍,也會重蹈 Kensington 委託我們解決的問題。因此,我們將產品分為三層架構,把各作業系統必須不同的程式碼減到最少,其餘部分全部共用。

KensingtonWorks 架構:Electron 使用者介面、C/C++ 背景常駐程式,以及各作業系統專屬的核心驅動程式

使用者介面與背景常駐程式的核心,在兩個平台上是同一套程式碼。只有驅動程式,以及背景常駐程式中一層很薄的轉接層,是各平台專屬的。
  1. 裝置驅動程式(每個作業系統各一套)。 驅動程式讀取任何 Kensington HID 裝置的按鍵動作,並將按鍵輸入注入系統的輸入佇列。
  2. 背景常駐程式(C/C++,共用)。 背景常駐程式(daemon)持續執行,監看目前前景執行的應用程式,並接收來自驅動程式的按鍵事件。按鍵按下時,它會查詢目前應用程式中該按鍵對應的按鍵輸入,再交由驅動程式注入。作業系統專屬的程式碼集中在各平台一層小型的轉接層中,因此背景常駐程式的大部分程式碼在兩個平台上完全相同。
  3. 設定介面(Electron,共用)。 介面以 HTML 和 JavaScript 撰寫,因此在 Windows 與 macOS 上的外觀與操作完全一致。介面由一家獨立的設計公司設計,我們依照他們的設計稿實作。介面將設定以 JSON 檔案儲存在電腦上,背景常駐程式則讀取這些檔案來完成設定。

將使用者介面與背景常駐程式分為兩個獨立程式,是為了節省記憶體。Electron 內含完整的瀏覽器引擎,記憶體用量很大。設定畫面不需要一直開著:大多數人設定好按鍵後就很少更動。真正需要持續執行的是背景常駐程式。它以 C/C++ 撰寫,記憶體用量極低,能把電腦幾乎所有的記憶體留給使用者真正在用的軟體。

困難之處

在 macOS 核心延伸功能中實作 HID 堆疊。 macOS 不像 Windows 那樣支援 HID 驅動程式延伸。因此,我們的 macOS 核心延伸功能(kernel extension)必須內含自己的 HID 堆疊,並限定只處理 Kensington 的廠商 ID。我們找到一套授權寬鬆的 HID 解析器,並將它移植到 macOS。如今,任何符合 HID 標準的 Kensington 新裝置,都不需要新的驅動程式就能使用。

各層之間的通訊。 我們需要兩套通訊協定:一套用於背景常駐程式與驅動程式之間,另一套用於使用者介面與背景常駐程式之間。兩者都必須在兩個作業系統上以相同方式運作。使用者介面透過背景常駐程式內建、受保護的 HTTP 伺服器與其通訊。在任一作業系統上,任何 JavaScript 介面都能與 HTTP 伺服器溝通。

能因應實際狀況的雲端同步。 將設定儲存到 Google Drive 與 OneDrive 並不難,難的是保持同步。每當設定變更,介面都會自動同步,同時也必須能處理連線中斷與設定過期的情況。對於在兩台電腦上使用同一個軌跡球的使用者來說,這一點尤其重要。

慣性移動。 硬體本身不提供慣性移動,因此必須由驅動程式模擬。舊的 Windows 驅動程式雖有此功能,但不太穩定;macOS 則完全沒有原始程式碼,因此我們從零開始撰寫。

建置、封裝與測試

  • 從第一天起就自動化建置。 架構確定後,我們立即為 Windows 與 macOS 撰寫建置腳本。在此之前,Kensington 是在 Visual Studio 中建置執行檔,再以人工封裝。
  • 由建置腳本完成數位簽署。 建置腳本也會為安裝套件進行數位簽署。這項工作在 macOS 上特別繁瑣,如今在兩個平台上都已自動完成。
  • 原生安裝程式。 舊的 Windows 安裝程式以 InstallShield 製作,解除安裝時無法清除乾淨。我們改以 WiX 建置 MSI 套件,這是 Microsoft 建議的原生格式。在 macOS 上,我們採用最新的 .pkg 格式,並以 shell 腳本完成安裝設定。
  • 驅動程式測試。 時程不允許建立完整的測試套件。因此,我們以 Python 撰寫了一套測試框架,用來檢查驅動程式的按鍵注入功能,並在每次修改後用它找出驅動程式的問題。

成果

KensingtonWorks 比八月的目標晚了六週推出。在九個月內完成這麼多工作,些許延誤在預期之中。產品推出後廣受好評,Windows 與 macOS 使用者首次擁有功能相同的同一套軟體。

Kensington 特別滿意發行流程的自動化。只要一個腳本,就能為兩個平台完成建置、封裝與數位簽署,過去沒有任何一家合作廠商將發行流程自動化到這種程度。

KensingtonWorks 至今仍是 Kensington 軌跡球與滑鼠的官方支援軟體,可從 Kensington 網站下載。Kensington 目前正逐步轉換到新的應用程式 Kensington Konnect,該程式仍在測試階段。

有類似的專案嗎?

歡迎來信洽詢,我們將盡快回覆。

info@smallpearl.com

更多作品

QQDEN

專為物業管理公司打造的大樓管理平台:以單一入口網站管理旗下所有大樓,並為每棟大樓的住戶提供專屬 App。

PapaGuǎn

爸爸管協助台灣補習班與獨立教師將課程影片僅提供給所屬學生觀看,即時掌握學生的學習進度,並妥善保護學生與家長的個人資料。