本系列的 第 1 部分 和 第 2 部分 讓您從應用程序開發人員的角度初步認識 OpenCable Application Platform Reference Implementation (OCAP RI)。您學到了如何在 RI 平台上運行應用程序,以及如何為 RI 或其他 OCAP 設備創建新的應用程序。本文是最後一期,文中從平台的角度描述 OCAP RI,並展示如何從源文件構建 RI。通過本文對 OCAP RI 棧有了深入理解後,就可以優化或增強該平台,或者將它移植到自己選擇的硬件上。
RI 架構
OCAP RI 使用圖 1 中顯示的架構:
圖 1. OCAP RI 架構
下面的信息對圖 1 作了說明:
OCAP 棧運行在 JVM 上,但是有些方法是用本地代碼實現的。相應地,圖 1 將 OCAP 棧的 Java 語言部分與 OCAP 棧的本地部分分開來。
JVM 運行 Connected Device Configuration (CDC)、Foundation Profile (FP)和 Personal Basis Profile (PBP),第 1 部分 對此作了描述。OCAP RI 的 JVM 使用一個開放源代碼項目 phoneME Advanced 的修改版。
OCAP 棧的本地實現和 JVM 本身被移植到一個獨立於平台的代碼層,即 Multimedia Platform Extensions (MPE)。
而 MPE 又調用 MPEOS 層的獨立於平台的代碼。MPEOS 需要移植到在 OCAP 棧上運行的設備。
RI 平台是一種虛擬設備或設備模擬器。RI 平台本身可以在 Windows 或 Linux 平台上構建和運行,形成一個設備模擬器。當使用基於 RI 平台的 MPEOS 實現時,可得到一個在桌面計算機上的設備模擬器上運行的實用 OCAP 棧。
接下來,我將展示如何在 Windows 上構建 OCAP RI。
工具
OCAP RI 必須在類 Linux 環境中構建。基本構建工具有:
make
gcc
Java 編譯器
Ant
要在 Windows 上構建 OCAP RI,需要安裝 3 個包:
Cygwin
Java Development Kit (JDK)
Ant
Cygwin
第一步是安裝 Cygwin,它在 Windows 上提供一個類 Linux 環境。OCAP RI 項目提供了 Cygwin 的一個版本,它已經包括所有必需的附加包。正確安裝 Cygwin 的方式是下載並安裝它,然後根據 OCAP RI 文檔將一組必需的包安裝到 Cygwin。
首先 下載 Cygwin 的定制版。它是一個 ZIP 文件,大約 64MB。下載後,將它解壓到硬盤上某個地方。這樣將得到一個 cygwin-minimal-20090611 目錄。打開該目錄,然後運行其中的 setup.exe 文件。
大部分情況下,可以接受安裝程序中的默認設置,但是有一個地方必須更改,那就是在 Choose A Download Source 屏幕上選擇 Install from Local Directory 選項,如圖 2 所示:
圖 2. 從本地目錄安裝 Cygwin
此外,必須告訴安裝程序安裝所有的包。在 Select Packages 屏幕,在 All 旁邊單擊鼠標,使之顯示 Install 而不是 Default,如圖 3 所示:
圖 3. 告訴安裝程序安裝包
JDK
接下來,需要一個 JDK。我使用 Sun(Oracle)工具包。首先 下載安裝程序包。
JDK 提供 javac(Java 編譯器)、jar(用於創建 JAR 文件的工具)和其他工具。
運行安裝程序。可以接受大部分默認設置,但是強烈建議更改安裝目錄,默認目錄為 C:\Program Files。帶空格的路徑名稱可能使您和您的工具感到困惑,所以選擇一個更簡單的目錄。我選擇 C:\jdk1.6.0_18。
Ant
Ant 是一個高級的構建工具,特別適合構建 Java 代碼。OCAP RI 的構建系統由 Ant 和 make 混合而成。make 是隨 Cygwin 包一起安裝的,但是 Ant 需要單獨下載和安裝。
從 Ant 站點 下載一個二進制安裝程序。將它解壓到一個位置。同樣,強烈建議選擇一個簡單的路徑(不包含空格),例如 C:\apache-ant-1.8.0。
雖然將 JDK 和 Ant 安裝在更少見的位置,例如 C:\Program Files 時,也可以構建 OCAP RI,但是那樣更麻煩一點。
獲得源文件
現在所有工具都已就緒,接下來通過選擇 Start > All Programs > Cygwin > Cygwin Bash Shell 打開一個 Cygwin 終端。然後就可以獲得 OCAP RI 源文件了。
與之前一樣,建議使用一個簡單的路徑。我將 OCAP RI 源文件放在 Cygwin 安裝目錄的根目錄下。這些源文件包含在一個 Subversion 庫中,可以使用 guest 憑證(用戶名和密碼都是 cruise)來訪問這些文件。在 Cygwin Shell 中使用下面的序列簽出(check out)代碼,並放入 Cygwin 安裝目錄的根目錄中:
$ cd /
$ export SVN_USER=cruise
$ export SVN_PASSWORD=cruise
$ svn checkout -N https://community.cablelabs.com/svn/OCAPRI
Subversion 可能顯示一條關於識別 CableLabs 服務器的消息,因為這可能是第一次訪問該機器。在此情況下,需要接受服務器的憑證,才能繼續。在看到 (R)eject, accept (t)emporarily or accept (p)ermanently? 提示時,輸入 p 作為響應:
Error validating server certificate for 'https://community.cablelabs.com:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: community.cablelabs.com
- Valid: from Tue, 15 Dec 2009 00:00:00 GMT until Wed, 15 Dec 2010 23:59:59 GMT
- Issuer: www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign,
VeriSign International Server CA - Class 3,
VeriSign, Inc., VeriSign Trust Network
- Fingerprint: 8a:02:31:2e:5d:3b:5b:6c:c8:70:85:e6:4d:8b:02:1f:93:1c:f3:cf
(R)eject, accept (t)emporarily or accept (p)ermanently? p
A OCAPRI/checkout_dev_env.sh
A OCAPRI/README
U OCAPRI
Checked out revision 7167.
$
簽出的第一部分很快完成,並從 Subversion 庫獲得兩個文件。
接下來,運行腳本 checkout_dev_env.sh 獲取需要的其他源文件:
$ cd OCAPRI
$ ./checkout_dev_env.sh trunk
這個簽出步驟需要較長的時間,在我的計算機上大約是 90 分鐘。具體時間視計算機的速度、網絡連接的速度以及 CableLabs 服務器的狀態而定。
我收到了一些關於網絡超時的消息,並且沒有得到所有需要的文件。如果再次運行 checkout_dev_env.sh 腳本時沒有獲取任何文件,那麼可以確信已經得到了一組完整的源文件。
構建
構建需要兩步,每一步可通過一個構建命令完成。首先,需要構建 RI 平台本身,它是位於設備操作系統之上的最接近底層的一層,為 OCAP 棧提供支撐。第二步是構建 OCAP 實現。
設置環境變量
在構建任何東西之前,必須告訴構建系統從哪裡找到它需要的東西。構建系統依賴於一些環境變量來達到這個目的:
OCAPROOT 是最重要的變量。它指向 OCAP 實現的頂層目錄。
OCAPTC 是 OCAP Target Configuration,它是要運行 OCAP 實現的設備。
PLATFORMHOST 表明將執行構建的計算機的類型。
PLATFORMROOT 是 RI 平台的基本目錄。
幸運的是,已經有一個腳本 — trunk/setEnv — 可用於設置環境變量。setEnv 是之前運行的 checkout_dev_env.sh 腳本生成的。但是,在准備構建之前,需要編輯一下 setEnv:必須增加 JAVA_HOME 和 ANT_HOME 的定義。清單 1 中加粗的行是需要添加的行:
清單 1. 添加 JAVA_HOME 和 ANT_HOME 定義到 setEnv 中
export PLATFORMROOT=C:/cygwin/OCAPRI/trunk/ri/RI_Platform
export OCAPROOT=C:/cygwin/OCAPRI/trunk/ri/ODLSrc/OCAP-1.0
export RICOMMONROOT=C:/cygwin/OCAPRI/trunk/common
export OCAPHOST=Win32-Cygwin
export OCAPTC=CableLabs/simulator/Win32/debug
export PLATFORMHOST=Win32-Cygwin
export PLATFORMTC=Win32/debug
export TWB_TOOLROOT=C:/cygwin/OCAPRI/trunk/ri/RI_Platform
export JAVA_HOME=C:/jdk1.6.0_18
export ANT_HOME=C:/apache-ant-1.8.0
if [ -z "${PATH_UR}" ]
then
export PATH_UR=$PATH
fi
export PATH=`cygpath -u ${ANT_HOME}`/bin:`cygpath -u ${JAVA_HOME}`/bin:${PATH_UR}
當然,對於您的計算機而言,這些路徑可能不同。
我增加了一些額外的代碼,用於 Windows 路徑與 Cygwin 路徑之間的轉換。但是,重點是必須定義 JAVA_HOME 和 ANT_HOME,並將它們添加到 PATH 中。
設置好 setEnv 後,運行它:
$ cd trunk
$ source setEnv
運行 Ant 構建腳本
現在可以開始構建了。OCAP RI 包括一個 Ant 腳本,它可以構建任何東西,包括 RI 平台和 OCAP 實現。現在運行它:
$ cd ri
$ ant build
在我的計算機上這大約需要 13 分鐘。完成後,便可以運行 OCAP RI:
$ cd $PLATFORMROOT
$ ./runRI.sh -tunetest -setup
可能需要讓防火牆允許一些網絡連接,這樣在一分鐘內應該可以看到模擬的電視,如圖 4 所示:
圖 4. OCAP 中的 Smallville
構建系統如何發現目標
下面仔細分析構建系統用於幫助決定如何執行構建的那些環境變量。
PLATFORMHOST 是一個真正的路徑。構建系統在 $OCAPROOT/hostconfig/$PLATFORMHOST 中查找設置。這主要用於定義構建期間使用的工具。
構建系統使用 OCAPTC 查找配置信息和放置輸出文件。OCAPTC 也是一個路徑。構建系統通過在 $OCAPROOT/target/$OCAPTC 中進行查找,發現與目標配置相關的配置文件。它在 $OCAPROOT/gen/$OCAPTC 中創建中間構建文件,而將構建的最終結果放在 $OCAPROOT/bin/$OCAPTC 中。
OCAPTC 確定的最重要的一點是使用哪種 MPEOS 實現。例如,在 Windows OCAP RI 構建中,OCAPTC 是 CableLabs/simulator/Win32/debug。如果查看$OCAPROOT/target/CableLabs/simulator/Win32/debug/buildrules.properties,可以發現下面的定義:
build.mpeos.BUILDOS=RI_Win32
這告訴構建系統構建 MPEOS 的 RI_Win32 實現,它是用 RI 平台實現的。可以在 $OCAPROOT/mpe/os/RI_Win32 中發現相應的源文件。
了解 $OCAPROOT 目錄
您已經理解了構建系統使用的一些位置,但是其他目錄呢?下面簡要描述了 $OCAPROOT 中一些重要的目錄:
apps 包含示例應用程序,包括 apps/qa 中的一套測試應用程序。
bin 包含構建的結果。構建結果放在 bin/$OCAPTC 中。
docs 是與 OCAP 平台相關的文檔和 API 參考的主目錄。
gen 包含中間構建文件。一般不需要進入這個目錄。
hostconfig 存放構建主機的配置文件。
java 包含 OCAP 棧的 Java 語言層的源代碼。
jni 存放 OCAP 棧的本地實現層的源代碼。
jvm 是存放 JVM 源文件的地方。這是 phoneME Advanced 項目經過修改的一個版本。
mpe 包含 MPE 層的源代碼。其中的 mpe/os 還包含 MPEOS 層的各種實現。
target 是存放特定於目標的配置文件。
thirdparty 包含屬於 OCAP 實現或 OCAP RI 的各種開放源碼包,例如 DirectFB、Freetype2、zlib 等的源代碼。
正如您所知的,構建的輸出在 $OCAPROOT/bin/$OCAPTC 中。
JVM 本身的源代碼包含在 $OCAPROOT/jvm 中。它的二進制庫,特別是 libcvm,被復制到 $OCAPROOT/bin/$OCAPTC/bin,其他支持文件被復制到 $OCAPROOT/bin/$OCAPTC/env/cvm。
OCAP 的本地代碼層,即 MPE 層,以及 MPEOS 層都被構建到一個單獨的庫 libmpe 中,這個庫存放在 $OCAPROOT/bin/$OCAPTC/bin 中。
OCAP 的 Java 語言層被構建到 $OCAPROOT/bin/$OCAPTC/env/sys/ocap-classes.jar 中。
結束語
至此,您對 OCAP RI 有了全面的了解。本系列的 第 1 部分 解釋了 OCAP 棧的架構,介紹了 OCAP RI,以及如何在 Windows 上使用 OCAP RI 運行應用程序。第 2 部分 解釋了如何使用命令行工具或 Eclipse 插件為 OCAP 棧創建自己的應用程序。
最後,在本文中,您學習了如何構建 OCAP RI 本身。對於有興趣使用 OCAP 的人來說,這是最高級的控制。基於本文對構建系統和源目錄的解釋,您現在可以隨意對 RI 代碼進行更改(當然要遵從許可條款),然後看看效果如何。享受編程吧!