KensingtonWorks
Kensington 原本為旗下軌跡球提供兩套互不相關的工具程式,一套用於 Windows,一套用於 macOS。我們在九個月內以 KensingtonWorks 取代兩者:一套產品同時支援兩個平台,共用使用者介面與核心程式,搭配全新的通用 HID 驅動程式,以及具備數位簽署的自動化發行流程。
- 客戶
- Kensington
- 年份
- 2019
- 我們的角色
- 統包:系統架構、驅動程式、使用者介面實作、安裝程式與發行自動化
- 平台
- Windows, macOS
挑戰
Kensington 的軌跡球深受設計師、建築師與工程師喜愛。在非常大型的圖面上,從一端移動到另一端,軌跡球比滑鼠快得多。Kensington 的軌跡球與滑鼠也比一般產品多了兩個按鍵,共有四個,而且額外的按鍵可以重新設定功能。
這些使用者的工作有固定節奏:移動到圖面的另一個位置,然後執行指令。在 AutoCAD 等 CAD 軟體中,指令是從選單或透過鍵盤快捷鍵執行。透過 Kensington 的軟體,使用者可以將快捷鍵指派給軌跡球按鍵。按下按鍵時,軟體會注入按鍵輸入,效果就如同使用者親自在鍵盤上輸入一樣。
大多數使用者會同時使用多個軟體,而每個軟體的快捷鍵都不同。因此,軟體也必須知道目前前景執行的是哪一個應用程式,並送出為該應用程式指派的快捷鍵。
2019 年時,Kensington 有兩套各自獨立的工具程式。Windows 版名為 KensingtonWorks,支援依應用程式個別設定。macOS 版名為 TrackballWorks,使用者介面完全不同,也不支援依應用程式個別設定。
Kensington 的需求
- 一套使用者介面,在 Windows 與 macOS 上完全相同。
- 兩個平台都支援依應用程式設定按鍵對應。
- 設定儲存於雲端(Google Drive 與 Microsoft OneDrive),讓使用者換到另一台電腦也能沿用。
- 按鍵輸入必須由裝置驅動程式注入系統的輸入佇列,而不是由使用者模式的應用程式模擬。有些 CAD 軟體會直接讀取 HID 輸入,並忽略應用程式模擬的按鍵。從最底層進入的輸入看起來就像來自實體鍵盤,所有軟體都會接受。
- 通用 HID 驅動程式。 原有的驅動程式只支援以裝置 ID 識別的特定裝置。新的驅動程式必須支援任何 Kensington 裝置,包括未來推出的產品。
以上所有工作,都必須在一月到八月的九個月內完成。
我們的做法
如果開發兩套應用程式再設法保持同步,不但工作量加倍,也會重蹈 Kensington 委託我們解決的問題。因此,我們將產品分為三層架構,把各作業系統必須不同的程式碼減到最少,其餘部分全部共用。
- 裝置驅動程式(每個作業系統各一套)。 驅動程式讀取任何 Kensington HID 裝置的按鍵動作,並將按鍵輸入注入系統的輸入佇列。
- 背景常駐程式(C/C++,共用)。 背景常駐程式(daemon)持續執行,監看目前前景執行的應用程式,並接收來自驅動程式的按鍵事件。按鍵按下時,它會查詢目前應用程式中該按鍵對應的按鍵輸入,再交由驅動程式注入。作業系統專屬的程式碼集中在各平台一層小型的轉接層中,因此背景常駐程式的大部分程式碼在兩個平台上完全相同。
- 設定介面(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,該程式仍在測試階段。
有類似的專案嗎?
歡迎來信洽詢,我們將盡快回覆。