新聞中心
今天,軟件開發(fā)中的大部分有趣工作都出現(xiàn)在兩個極端上:巨型云服務(wù)器和微型移動設(shè)備。這些領(lǐng)域解決完全不同的問題,相應(yīng)地,也就擁有不同的工具支 持。服務(wù)器開發(fā)往往使用腳本語言將不同的組件捆綁在一起并完成復(fù)雜的自動化任務(wù),而移動開發(fā)主要關(guān)注某個特殊設(shè)備和用戶的特定功能和需求。

創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的河曲網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
但是,這兩個極端共享一種常用語言:Java。無論 Android 還是 Spring 框架,當(dāng)今許多最流行的技術(shù)都采用一種全世界廣泛理解和支持的語言。這種常用語言可能會導(dǎo)致一些您原以為存在天壤之別的領(lǐng)域之間出現(xiàn)令人驚訝的交集。Java 編程打開了許多跨平臺選項的大門,比如將服務(wù)器代碼輕松移植到 Android 設(shè)備上,或從現(xiàn)有組件綁定原生平臺功能。
本文將探索 Ruboto 項目,該項目致力于在腳本語言和 Android 之間搭建一座橋梁。您將了解到 Ruby 和 Android 相關(guān)信息,它們?nèi)绾卧?Dalvik 虛擬機中協(xié)同工作,如何構(gòu)建和部署您的腳本,以及這種技術(shù)提高程序員生產(chǎn)力和應(yīng)用程序靈活性的潛力。
Ruby 背景知識
許多腳本語言都想獲得程序員的青睞,但 Ruby 目前處于有利位置。最著名的是,它支持 Rails web 框架,但很多開發(fā)人員還喜歡 Ruby 的簡潔性和優(yōu)雅。作為一種擁有 duck typing 和元編程(metaprogramming)等現(xiàn)代功能的面向?qū)ο竽_本語言,Ruby 不僅很強大,足以支持各種復(fù)雜架構(gòu);而且還很簡單,能執(zhí)行各種特殊任務(wù)。
Ruby 有幾種衍生版本,包括流行的 JRuby。JRuby 是一個功能齊備的 Ruby 解釋器,用 Java 語言編寫,可以在 Java Virtual Machine (JVM) 中運行。與官方 Ruby 不同,JRuby 支持從 Java 代碼中調(diào)用 Ruby 腳本和從 Ruby 腳本中調(diào)用 Java API。
Android 背景知識
Android 由 Open Handset Alliance 開發(fā),但經(jīng)常被視為一個 Google 項目。今天,Android 幾乎驅(qū)動所有新智能手機的四分之一,它的市場份額持續(xù)增長。
在內(nèi)部,Android 在一個經(jīng)過修改的 Linux 內(nèi)核上運行。大多數(shù)應(yīng)用程序都在 Dalvik 虛擬機上運行,這個虛擬機完全由 Google 設(shè)計開發(fā),旨在優(yōu)化移動設(shè)備上的性能。要了解更多 Dalvik 信息。
許多新 Android 開發(fā)人員忽略的一點是他們編寫的 Java 源代碼并不作為 Java 字節(jié)碼運行。相反,Android 工具包將 Java 字節(jié)碼轉(zhuǎn)換為 Dalvik 字節(jié)碼。這些經(jīng)過轉(zhuǎn)換的文件(擴展名為 .dex)被打包到部署到設(shè)備上的應(yīng)用程序中。等到設(shè)備運行您的程序時,將不會留下任何 Java 字節(jié)碼。
Android + Ruby = Ruboto
JRuby 團隊成員 Charles Nutter 有一天突然意識到:既然 Android 工具包能將編譯后的 Java 代碼轉(zhuǎn)換為 Dalvik 文件,而且由于 JRuby 在編譯后的 Java 字節(jié)碼中有一個 Ruby 解釋器,那么應(yīng)該能夠在 Android 上運行 Ruby。在極短的時間內(nèi),他執(zhí)行了這個任務(wù),Ruboto 隨之誕生了。 在其他幾位開發(fā)人員的共同努力下,Ruboto 成為了一個活躍的項目,Android 和 Ruby 開發(fā)人員對該項目的興趣與日俱增。
今天,Ruboto 具有兩種版本:ruboto-irb 和 ruboto-core。ruboto-irb 是在 Android 上運行的一個交互式 Ruby shell。這個項目允許運行任何能訪問 Android API 的 Ruby 腳本。這個工具對于想在他們的設(shè)備上運行測試或執(zhí)行任務(wù)的開發(fā)人員而言非常有用,但可能不適合編寫今后用于分發(fā)的應(yīng)用程序。
相比之下,ruboto-core 提供一個允許創(chuàng)建 Ruboto 項目的框架。使用 ruboto-core,可以向您的項目添加強大靈活的腳本支持,同時保留對 Android API 的訪問能力。圖 1 展示 ruboto-core 構(gòu)建過程:自動生成的 Java 源文件和定制編寫的 Ruby 腳本打包到一個將在設(shè)備上運行的 Android APK 中。
圖 1. 構(gòu)造一個 Ruboto 應(yīng)用程序
本文余下部分主要關(guān)注創(chuàng)建一個基于 Ruboto 的自定義項目。Ruboto 還是一個早期軟件,在本文撰寫之時,它的版本編號是 0.0.2。該項目發(fā)展很快,等到您閱讀本文之時,它可能已經(jīng)發(fā)生了輕微的變化。
編寫 SMS
將 Ruby 和 Android 結(jié)合起來,就能創(chuàng)建能訪問 Android 的強大功能的簡單腳本。我們將編寫一個 Ruboto 腳本,允許用戶從一家快遞服務(wù)公司預(yù)訂海鮮。這個簡單的應(yīng)用程序?qū)⒗妹總€平臺的優(yōu)點。在 Android 端,您擁有一種簡單的方法來創(chuàng)建一個包含您的訂單的 SMS 消息,應(yīng)用程序甚至無需請求服務(wù)器就可以下訂單。在 Ruby 端,您將重用一個現(xiàn)有的語言處理庫,該庫將您的訂單規(guī)范化為一種可閱讀格式。
開始
要構(gòu)建 Ruby 腳本并將其部署到 Android 上,需要幾個組件。您可能已經(jīng)安裝了部分組件,如果是這樣,您可以繼續(xù)使用它們。
由于 Android 和 Ruby 是多平臺的,因此可以在 Linux、Mac OS X 或 Windows 上運行 Ruboto。本文完全使用命令行。
如果您在 Windows 上使用 cygwin,則可能會在運行某些 JRuby 命令時遇到問題。為安全起見,如果您在運行 Windows,請務(wù)必嚴(yán)格遵守標(biāo)準(zhǔn) Windows CMD shell。
Java
您的開發(fā)機器上需要一個 Java Development Kit (JDK)。要檢查該工具包是否已安裝,請輸入以下命令:
- $ javac -version
如果此命令發(fā)現(xiàn)一個 JDK 版本,那么可以繼續(xù)使用。否則,請參見 參考資料 中的鏈接安裝最新版 JDK。安裝完成后,將 JDK 的 bin 文件夾添加到您的 PATH 并重復(fù)上述命令。
Ant
Android 附帶了自己的 Ant 版本,但 Ruboto 還需要從它自己的腳本訪問 Ant。如果您沒有安裝獨立版 Ant。同樣,將它的 bin 文件夾添加到您的 PATH。確保能夠運行 Ant 命令。
Android
訪問 Android Developer Site,安裝適用于您的操作系統(tǒng)的 Android SDK(參見 參考資料)。安裝完成后,運行 Android 的 tools 文件夾中的 android 命令。這將啟動 SDK 管理器,如圖 2 所示。您可能想安裝以下包,它們列示在 Available packages 下方。
SDK Platform Android 2.2, API 8
Android SDK Tools(修訂版 8)
Android SDK Platform-tools(修訂版 1)
圖 2. Android SDK and AVD Manager
打開 Android SDK and AVD Manager 的 Virtual devices 部分,創(chuàng)建一個用于開發(fā)的 Android 映像。如圖 3 所示,創(chuàng)建一個針對 Android 2.2 - API Level 8 的虛擬設(shè)備 Froyo。如果愿意,也可以創(chuàng)建一個虛擬 SD Card。
圖 3. 創(chuàng)建一個模擬器
Ruboto 將在您的設(shè)備上運行,但是,如果您擁有對任何文件夾的寫權(quán)限,那么開發(fā)工作將會輕松得多,這就需要使用模擬器或 root 設(shè)備。本文余下部分將討論如何使用模擬器。這個項目完成后,它在運行軟件版本 2.2 或更高版本的 Android 設(shè)備上的效果一樣好。
將 Android 的 platform-tools 和 tools 目錄添加到您的 PATH?,F(xiàn)在,您應(yīng)該能在命令提示中運行清單 1 中的命令。
清單 1. 從您的命令提示運行命令
- $ aapt version
- $ adb --version
JRuby
JRuby 提供一個非常簡單的安裝方法:只需訪問 http://jruby.org/getting-started 并遵循安裝說明即可。通過運行以下命令驗證安裝是否成功:
- $ jruby -v
由于 Ruboto 被托管在一個安全服務(wù)器上,因此需要安裝 jruby-openssl gem 以下載它。為此,執(zhí)行以下命令:
- $ gem install jruby-openssl
您可能還想安裝 rake,這是 make 或 ant 的 Ruby 對等物。輸入以下命令:
- $ gem install rake
最后,是時候安裝 Ruboto 本身了。Ruboto 被打包為一個 gem,因此安裝很容易。輸入以下命令:
- $ gem install ruboto-core
創(chuàng)建 Ruboto 項目
Ruboto 將為您從頭創(chuàng)建一個 Android 項目,這將確保您的清單文件(manifest)正確設(shè)置,腳本被放置到正確的集合中,且您能訪問必要的庫。您應(yīng)該采用這種方法,而不是試圖自己創(chuàng)建或修改一個現(xiàn)有 Android 項目。
要創(chuàng)建項目,切換到 project 文件夾,輸入以下命令:
- $ ruboto gen app
- --package us.cirion.ruboto.demo
- --path fishmonger
- --name Fishmonger
- --target android-8
- --activity Fishmonger
這條命令將執(zhí)行以下操作:
gen app 告知 Ruboto 從頭開始創(chuàng)建一個新 Android 項目。
--package 提供唯一的 Android 包名。
--path 告知 Ruboto 將項目存儲在哪里;這必須是一個新文件夾名。
--name 定義用戶可見的應(yīng)用程序名;這不需要是唯一的。
--target 指定針對哪個 Android 版本編譯項目。對于本文,您必須使用 android-8。一個可選參數(shù) --min_sdk 聲明您的應(yīng)用程序可以在較早的 Android 版本上運行,這里省略此參數(shù)。
--activity 是一個可選參數(shù),它告知 Ruboto 生成一個新的 Android Activity 并初始化它。
您可以探索 fishmonger 目錄的內(nèi)容。Ruboto 已經(jīng)自動生成了構(gòu)建和運行一個基本 Activity 所需的所有 Android 文件。由于此應(yīng)用程序?qū)l(fā)送 SMS 消息,您需要在 AndroidManifest.xml 文件中進行一個更改。在該文件中,將下面這個標(biāo)記插入為 元素的第一個子元素:
如果您省略這個權(quán)限,您仍然能夠構(gòu)建并加載您的腳本,當(dāng)您的應(yīng)用程序試圖發(fā)送一條 SMS 消息時,您將遇到一個運行時錯誤。
運行默認(rèn)項目
Ruboto 以開箱即用的方式生成了一個 Activity 和腳本,它們將在設(shè)備或模擬器上安裝和運行。如果您的模擬器還沒有運行,可以使用以下命令啟動它:
- $ emulator -avd Froyo
等待模擬器啟動到主屏幕。要確保所有 Ruboto 文件正確構(gòu)建并部署,cd 到 fishmonger 目錄并運行以下命令:
- $ rake install
如果遇到錯誤,嘗試再次運行此命令;有時連接在構(gòu)建過程中會超時。最初構(gòu)建需要一些時間,但后續(xù)更新速度就快得多。安裝完成后,在您的模擬器中查找標(biāo)簽為 Fishmonger 的圖標(biāo)。啟動它并等待一會兒。在本文撰寫之時,Ruboto 引擎加載需要一點時間。最終,您將看到與圖 4 類似的屏幕。
圖 4. 模板 Ruboto 活動
定制項目
現(xiàn)在我們設(shè)置 Fishmonger 應(yīng)用程序。首先,您將添加自然語言支持。Ruby 擁有一個名為 linguistics 的優(yōu)秀 gem,提供許多英語語言功能。在本文撰寫之時,Ruboto 還不能處理 linguistics 庫的嵌套目錄結(jié)構(gòu),因此,請您下載本文的 linguistics zip 文件,將其內(nèi)容解壓到 fishmonger\assets\scripts 中(參見 下載 部分的鏈接)。這是一個庫存 linguistics gem,被修改來扁平化目錄結(jié)構(gòu)。將來,您應(yīng)該能夠只綁定這個 gem 和您的 Ruboto 腳本。
編寫腳本
現(xiàn)在您準(zhǔn)備好處理項目核心部分了。Ruboto 框架負(fù)責(zé)處理所有 Java 代碼和 Android 基礎(chǔ)架構(gòu),因此,您的所有工作都可以在 fishmonger.rb 中完成。清除該文件的默認(rèn)內(nèi)容。首先添加清單 2 中的文本。
清單 2. 腳本依賴項
- require 'ruboto.rb'
- require 'linguistics'
- include Linguistics::EN
- import "android.telephony.SmsManager"
- ruboto_import_widgets :Button, :EditText, :LinearLayout, \
- :RadioGroup, :RadioButton, :TextView
前兩行加載 ruboto 和 linguisitics 庫。include 命令將使英語語法在您的模塊中可用。
第一個導(dǎo)入對于 JRuby 用戶比較眼熟:您正在添加對另一個庫的支持。注意,在本例中,您實際上正在使用一個 Android Dalvik 庫,而不是標(biāo)準(zhǔn) Java 庫的一部分。Ruboto 將在運行時使用反射(reflection)來加載這個類并使其對您可用。
ruboto_import_widgets 的功能與 import 相似。在本例中,您正在添加一些 Android 特有 UI 小部件。這些小部件通常用于 Android 活動中,Ruboto 添加一些方便的方法,便于您輕松配置 UI。
下面,定義腳本的 handle_create 方法,如清單 3 所示。
清單 3. 配置屏幕
- $activity.handle_create do |bundle|
- setTitle 'Freddy\'s Fresh Fish'
- setup_content do
- linear_layout :orientation => LinearLayout::VERTICAL do
- text_view :text => "What would you like to order?"
- @group = radio_group do
- radio_button :text => "Tuna", :id => 0
- radio_button :text => "Trout", :id=> 1
- radio_button :text => "Salmon", :id => 2
- radio_button :text => "Crab", :id => 3
- radio_button :text => "Lobster", :id => 4
- end
- @quantity = edit_text :hint => "Quantity"
- button :text => "Place Order"
- end
- end
handle_create 在用戶啟動應(yīng)用程序時調(diào)用。在 Android 中,這是您處理必要設(shè)置的地方。標(biāo)準(zhǔn) Android 應(yīng)用程序通常使用 XML 定義布局,但在 Ruboto 中,需要通過腳本定義布局。
Ruboto 的功能在您的腳本和 Android 之間架起一座橋梁。無論您擁有 Ruby 背景還是 Android 背景,您都應(yīng)該能夠明白setup_content 中發(fā)生的事。您正在創(chuàng)建一個垂直布局,將幾個小部件堆疊在一起。這些小部件包括文本,幾個用于選擇要預(yù)訂的魚類種類的單選按鈕,一個用于輸入數(shù)量的可編輯文本字段,以及一個用于下訂單的按鈕??梢允褂?Ruby 語法來配置您的小部件,而不是 Android 中通常使用的更繁瑣的 Java 語法。
設(shè)置每個 radio_button 上的 id 屬性有好處,它向您提供一種簡單方法,以便稍后查看選中了哪個按鈕。
Android 將自動處理與單選按鈕和可編輯文本字段之間的所有用戶交互。唯一剩下的工作是定義如何處理 Place Order 按鈕,如清單 4 所示。
清單 4. 下訂單
- handle_click do |view|
- if view.text == "Place Order"
- count = @quantity.text
- food = @group.child_at(@group.checked_radio_button_id).\
- text.downcase
- order = Linguistics::EN::plural(food,count)
- SmsManager.default.send_text_message("4155551234", \
- nil, "Please send #{count} #{order}", nil, nil)
- finish
- end
- end
- nd
如果您以前編寫過 Android 應(yīng)用程序,您可能會注意到,您正在使用一種不同的范式來處理選擇。Android 開發(fā)人員傾向于為每個可選項目編寫一些獨特的單擊處理程序。但是,在 Ruboto 中,更簡單的方法是為您的 Activity 創(chuàng)建一個全局單擊處理程序,在那里測試用戶單擊了哪個項目。
您提取用戶選擇的魚的數(shù)量和種類。如果用戶沒有選中一個單選按鈕,Ruboto 將在內(nèi)部優(yōu)雅地處理這個運行時錯誤。否則,您將把文本傳遞到 linguistics 庫并請求它為您創(chuàng)建適當(dāng)?shù)拿~形式。這個庫能處理不同的復(fù)數(shù)規(guī)則,因此它將生成 1 salmon、2 salmon、1 crab、2 crabs 之類的值。它甚至能識別手寫的數(shù)字,因此它還將生成 one lobster 和three lobsters 之類的詞組。對于一行代碼來說,這是令人非常印象深刻的行為,展示了它利用現(xiàn)有腳本向您的應(yīng)用程序輕松添加功能的能力。
類似地,發(fā)送一條 SMS 消息只需一行調(diào)用,調(diào)用一個方便的 Android 方法。Ruboto 允許您使用 Ruby 式語法調(diào)用這個方法;對等的 Java 代碼將是 SmsManager.getDefault().sendTextMessage()。您提供接收者的電話號碼和要發(fā)送的消息,并為可選參數(shù)傳遞 nil。如果您 正在一個設(shè)備上運行并想實際發(fā)送一條 SMS 消息,可以替換為一個實際電話號碼。如果您想在模擬器中測試,則可以替換為模擬器的端口號,比如 “5554”。
運行腳本
Ruboto 最強大的一個方面是允許通過簡單地加載一個已更新腳本來更改功能。即使您已經(jīng)完全更改了這個應(yīng)用程序的功能,也不需要重新構(gòu)建應(yīng)用程序或重新加載 APK。相反,只需在命令行輸入以下命令:
- $ rake update_scripts
這條命令將把 linguistics 腳本和您的新 fishmonger 腳本復(fù)制到模擬器或一個已連接設(shè)備。當(dāng)您重新啟動應(yīng)用程序時,將看到您的新屏幕,如圖 5 所示。
圖 5. Android 預(yù)訂頁面
如果您正在運行一個非根設(shè)備(non-rooted device)或正在更改 Java 文件或 Android 清單文件,可以通過再次輸入 rake 安裝命令來加載更新。注意,即使是非根設(shè)備也可以實時更新它們的腳本;例如,您可以從 Internet 下載新腳本并在運行時生成它們。固件限制僅適用于通過您的 USB 連接推送文件。
繼續(xù)試驗這個應(yīng)用程序。當(dāng)您進行了一個有效選擇并按下預(yù)訂按鈕后,屏幕將自動關(guān)閉。如果您使用一個有效的接收者地址,他們將很快收到您的消息。圖 6 顯示了一個非常繁忙的海鮮店的最新訂單列表。
圖 6. 來自 Ruboto 腳本的標(biāo)準(zhǔn)化訂單
結(jié)束語
Ruboto 仍然是一個早期項目,但即使處于現(xiàn)在的狀態(tài),它已經(jīng)能提供一種非常靈活有用的方法來編寫和分發(fā) Android 軟件。Ruboto 的成功歸功于 JRuby 和 Android 的優(yōu)勢:JRuby 已經(jīng)完成了以 Java 語言編寫一個功能齊備的 Ruby 解釋器的艱巨工作,Android 的 Dalvik 工具集提供了一種令人印象深刻的從標(biāo)準(zhǔn) Java 字節(jié)碼到它的自定義 Dalvik 字節(jié)碼的轉(zhuǎn)換。
如您所見,Ruboto 腳本可能會非常短,但提供來自 Ruby 和 Android 的強大功能。混合和匹配 Ruby 腳本、Ruby 和 Java 語法以及 Android API 的能力向您提供了許多提高生產(chǎn)力的選項。
Ruboto 是位于客戶端和服務(wù)器兩端的開發(fā)人員之間的一個有用橋梁。Android 開發(fā)人員將欣賞它的反射功能,該功能向他們提供實時大幅更新應(yīng)用程序功能的能力。Ruby 開發(fā)人員將擁有一種相當(dāng)便捷的方法來結(jié)合他們的腳本技術(shù)和移動平臺,利用現(xiàn)有 Ruby 代碼來創(chuàng)建新應(yīng)用程序。這兩類開發(fā)人員都將懷著極大興趣,密切關(guān)注這個項目的進展。
文章題目:Android+Ruby=Ruboto:能訪問Android的簡單腳本
分享URL:http://m.fisionsoft.com.cn/article/djoipcc.html


咨詢
建站咨詢
