自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android+Ruby=Ruboto:能訪問Android的簡單腳本

移動開發(fā) Android
一種常用語言使兩個不相似的伙伴走到了一起:Ruby 腳本語言和 Google 針對 Android 程序的自定義格式。借助 JRuby 和 Android 項目的強大工具集,您可以編寫和運行與常見的 Android 程序的表現完全不同的 Ruby 腳本。

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

但是,這兩個極端共享一種常用語言:Java。無論 Android 還是 Spring 框架,當今許多最流行的技術都采用一種全世界廣泛理解和支持的語言。這種常用語言可能會導致一些您原以為存在天壤之別的領域之間出現令人驚訝的交集。Java 編程打開了許多跨平臺選項的大門,比如將服務器代碼輕松移植到 Android 設備上,或從現有組件綁定原生平臺功能。

本文將探索 Ruboto 項目,該項目致力于在腳本語言和 Android 之間搭建一座橋梁。您將了解到 Ruby 和 Android 相關信息,它們如何在 Dalvik 虛擬機中協同工作,如何構建和部署您的腳本,以及這種技術提高程序員生產力和應用程序靈活性的潛力。

Ruby 背景知識

許多腳本語言都想獲得程序員的青睞,但 Ruby 目前處于有利位置。最著名的是,它支持 Rails web 框架,但很多開發(fā)人員還喜歡 Ruby 的簡潔性和優(yōu)雅。作為一種擁有 duck typing 和元編程(metaprogramming)等現代功能的面向對象腳本語言,Ruby 不僅很強大,足以支持各種復雜架構;而且還很簡單,能執(zhí)行各種特殊任務。

Ruby 有幾種衍生版本,包括流行的 JRuby。JRuby 是一個功能齊備的 Ruby 解釋器,用 Java 語言編寫,可以在 Java Virtual Machine (JVM) 中運行。與官方 Ruby 不同,JRuby 支持從 Java 代碼中調用 Ruby 腳本和從 Ruby 腳本中調用 Java API。

Android 背景知識

Android 由 Open Handset Alliance 開發(fā),但經常被視為一個 Google 項目。今天,Android 幾乎驅動所有新智能手機的四分之一,它的市場份額持續(xù)增長。

在內部,Android 在一個經過修改的 Linux 內核上運行。大多數應用程序都在 Dalvik 虛擬機上運行,這個虛擬機完全由 Google 設計開發(fā),旨在優(yōu)化移動設備上的性能。要了解更多 Dalvik 信息。

許多新 Android 開發(fā)人員忽略的一點是他們編寫的 Java 源代碼并不作為 Java 字節(jié)碼運行。相反,Android 工具包將 Java 字節(jié)碼轉換為 Dalvik 字節(jié)碼。這些經過轉換的文件(擴展名為 .dex)被打包到部署到設備上的應用程序中。等到設備運行您的程序時,將不會留下任何 Java 字節(jié)碼。

Android + Ruby = Ruboto

JRuby 團隊成員 Charles Nutter 有一天突然意識到:既然 Android 工具包能將編譯后的 Java 代碼轉換為 Dalvik 文件,而且由于 JRuby 在編譯后的 Java 字節(jié)碼中有一個 Ruby 解釋器,那么應該能夠在 Android 上運行 Ruby。在極短的時間內,他執(zhí)行了這個任務,Ruboto 隨之誕生了。 在其他幾位開發(fā)人員的共同努力下,Ruboto 成為了一個活躍的項目,Android 和 Ruby 開發(fā)人員對該項目的興趣與日俱增。

今天,Ruboto 具有兩種版本:ruboto-irb 和 ruboto-core。ruboto-irb 是在 Android 上運行的一個交互式 Ruby shell。這個項目允許運行任何能訪問 Android API 的 Ruby 腳本。這個工具對于想在他們的設備上運行測試或執(zhí)行任務的開發(fā)人員而言非常有用,但可能不適合編寫今后用于分發(fā)的應用程序。

相比之下,ruboto-core 提供一個允許創(chuàng)建 Ruboto 項目的框架。使用 ruboto-core,可以向您的項目添加強大靈活的腳本支持,同時保留對 Android API 的訪問能力。圖 1 展示 ruboto-core 構建過程:自動生成的 Java 源文件和定制編寫的 Ruby 腳本打包到一個將在設備上運行的 Android APK 中。

圖 1. 構造一個 Ruboto 應用程序

從 Ruboto Java 文件到 APK 的流程圖

本文余下部分主要關注創(chuàng)建一個基于 Ruboto 的自定義項目。Ruboto 還是一個早期軟件,在本文撰寫之時,它的版本編號是 0.0.2。該項目發(fā)展很快,等到您閱讀本文之時,它可能已經發(fā)生了輕微的變化。

編寫 SMS

將 Ruby 和 Android 結合起來,就能創(chuàng)建能訪問 Android 的強大功能的簡單腳本。我們將編寫一個 Ruboto 腳本,允許用戶從一家快遞服務公司預訂海鮮。這個簡單的應用程序將利用每個平臺的優(yōu)點。在 Android 端,您擁有一種簡單的方法來創(chuàng)建一個包含您的訂單的 SMS 消息,應用程序甚至無需請求服務器就可以下訂單。在 Ruby 端,您將重用一個現有的語言處理庫,該庫將您的訂單規(guī)范化為一種可閱讀格式。

開始

要構建 Ruby 腳本并將其部署到 Android 上,需要幾個組件。您可能已經安裝了部分組件,如果是這樣,您可以繼續(xù)使用它們。

由于 Android 和 Ruby 是多平臺的,因此可以在 Linux、Mac OS X 或 Windows 上運行 Ruboto。本文完全使用命令行。

如果您在 Windows 上使用 cygwin,則可能會在運行某些 JRuby 命令時遇到問題。為安全起見,如果您在運行 Windows,請務必嚴格遵守標準 Windows CMD shell。

Java

您的開發(fā)機器上需要一個 Java Development Kit (JDK)。要檢查該工具包是否已安裝,請輸入以下命令:

  1. $ javac -version 

如果此命令發(fā)現一個 JDK 版本,那么可以繼續(xù)使用。否則,請參見 參考資料 中的鏈接安裝最新版 JDK。安裝完成后,將 JDK 的 bin 文件夾添加到您的 PATH 并重復上述命令。

Ant

Android 附帶了自己的 Ant 版本,但 Ruboto 還需要從它自己的腳本訪問 Ant。如果您沒有安裝獨立版 Ant。同樣,將它的 bin 文件夾添加到您的 PATH。確保能夠運行 Ant 命令。

Android

訪問 Android Developer Site,安裝適用于您的操作系統的 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 的虛擬設備 Froyo。如果愿意,也可以創(chuàng)建一個虛擬 SD Card。

圖 3. 創(chuàng)建一個模擬器

包含以下字段的窗口:name: froyo;target: Android 2.2 - API Level 8, 1024 SD card size;skin: default, hardware

Ruboto 將在您的設備上運行,但是,如果您擁有對任何文件夾的寫權限,那么開發(fā)工作將會輕松得多,這就需要使用模擬器或 root 設備。本文余下部分將討論如何使用模擬器。這個項目完成后,它在運行軟件版本 2.2 或更高版本的 Android 設備上的效果一樣好。

將 Android 的 platform-tools 和 tools 目錄添加到您的 PATH?,F在,您應該能在命令提示中運行清單 1 中的命令。

清單 1. 從您的命令提示運行命令

  1. $ aapt version 
  2. $ adb --version 

JRuby

JRuby 提供一個非常簡單的安裝方法:只需訪問 http://jruby.org/getting-started 并遵循安裝說明即可。通過運行以下命令驗證安裝是否成功:

  1. $ jruby -v 

由于 Ruboto 被托管在一個安全服務器上,因此需要安裝 jruby-openssl gem 以下載它。為此,執(zhí)行以下命令:

  1. $ gem install jruby-openssl 

您可能還想安裝 rake,這是 make 或 ant 的 Ruby 對等物。輸入以下命令:

  1. $ gem install rake 

最后,是時候安裝 Ruboto 本身了。Ruboto 被打包為一個 gem,因此安裝很容易。輸入以下命令:

  1. $ gem install ruboto-core 

創(chuàng)建 Ruboto 項目

Ruboto 將為您從頭創(chuàng)建一個 Android 項目,這將確保您的清單文件(manifest)正確設置,腳本被放置到正確的集合中,且您能訪問必要的庫。您應該采用這種方法,而不是試圖自己創(chuàng)建或修改一個現有 Android 項目。

要創(chuàng)建項目,切換到 project 文件夾,輸入以下命令:

  1. $ ruboto gen app  
  2. --package us.cirion.ruboto.demo 
  3. --path fishmonger  
  4. --name Fishmonger  
  5. --target android-8  
  6. --activity Fishmonger 

這條命令將執(zhí)行以下操作:

gen app 告知 Ruboto 從頭開始創(chuàng)建一個新 Android 項目。

--package 提供唯一的 Android 包名。

--path 告知 Ruboto 將項目存儲在哪里;這必須是一個新文件夾名。

--name 定義用戶可見的應用程序名;這不需要是唯一的。

--target 指定針對哪個 Android 版本編譯項目。對于本文,您必須使用 android-8。一個可選參數 --min_sdk 聲明您的應用程序可以在較早的 Android 版本上運行,這里省略此參數。

--activity 是一個可選參數,它告知 Ruboto 生成一個新的 Android Activity 并初始化它。

您可以探索 fishmonger 目錄的內容。Ruboto 已經自動生成了構建和運行一個基本 Activity 所需的所有 Android 文件。由于此應用程序將發(fā)送 SMS 消息,您需要在 AndroidManifest.xml 文件中進行一個更改。在該文件中,將下面這個標記插入為 元素的第一個子元素:

  1. <uses-permission android:name="android.permission.SEND_SMS" /> 

如果您省略這個權限,您仍然能夠構建并加載您的腳本,當您的應用程序試圖發(fā)送一條 SMS 消息時,您將遇到一個運行時錯誤。

運行默認項目

Ruboto 以開箱即用的方式生成了一個 Activity 和腳本,它們將在設備或模擬器上安裝和運行。如果您的模擬器還沒有運行,可以使用以下命令啟動它:

  1. $ emulator -avd Froyo 

等待模擬器啟動到主屏幕。要確保所有 Ruboto 文件正確構建并部署,cd 到 fishmonger 目錄并運行以下命令:

  1. $ rake install 

如果遇到錯誤,嘗試再次運行此命令;有時連接在構建過程中會超時。最初構建需要一些時間,但后續(xù)更新速度就快得多。安裝完成后,在您的模擬器中查找標簽為 Fishmonger 的圖標。啟動它并等待一會兒。在本文撰寫之時,Ruboto 引擎加載需要一點時間。最終,您將看到與圖 4 類似的屏幕。

圖 4. 模板 Ruboto 活動

左邊有一個窗口,右邊有一個軟鍵盤和一些控制按鈕的模擬器

定制項目

現在我們設置 Fishmonger 應用程序。首先,您將添加自然語言支持。Ruby 擁有一個名為 linguistics 的優(yōu)秀 gem,提供許多英語語言功能。在本文撰寫之時,Ruboto 還不能處理 linguistics 庫的嵌套目錄結構,因此,請您下載本文的 linguistics zip 文件,將其內容解壓到 fishmonger\assets\scripts 中(參見 下載 部分的鏈接)。這是一個庫存 linguistics gem,被修改來扁平化目錄結構。將來,您應該能夠只綁定這個 gem 和您的 Ruboto 腳本。

編寫腳本

現在您準備好處理項目核心部分了。Ruboto 框架負責處理所有 Java 代碼和 Android 基礎架構,因此,您的所有工作都可以在 fishmonger.rb 中完成。清除該文件的默認內容。首先添加清單 2 中的文本。

清單 2. 腳本依賴項

  1. require 'ruboto.rb' 
  2. require 'linguistics' 
  3. include Linguistics::EN 
  4.  
  5. import "android.telephony.SmsManager" 
  6.  
  7. ruboto_import_widgets :Button, :EditText, :LinearLayout, \ 
  8.   :RadioGroup, :RadioButton, :TextView 

前兩行加載 ruboto 和 linguisitics 庫。include 命令將使英語語法在您的模塊中可用。

第一個導入對于 JRuby 用戶比較眼熟:您正在添加對另一個庫的支持。注意,在本例中,您實際上正在使用一個 Android Dalvik 庫,而不是標準 Java 庫的一部分。Ruboto 將在運行時使用反射(reflection)來加載這個類并使其對您可用。

ruboto_import_widgets 的功能與 import 相似。在本例中,您正在添加一些 Android 特有 UI 小部件。這些小部件通常用于 Android 活動中,Ruboto 添加一些方便的方法,便于您輕松配置 UI。

下面,定義腳本的 handle_create 方法,如清單 3 所示。

清單 3. 配置屏幕

  1. $activity.handle_create do |bundle| 
  2.   setTitle 'Freddy\'s Fresh Fish' 
  3.  
  4.   setup_content do 
  5.     linear_layout :orientation => LinearLayout::VERTICAL do 
  6.       text_view :text => "What would you like to order?" 
  7.       @group = radio_group do 
  8.         radio_button :text => "Tuna":id => 0 
  9.         radio_button :text => "Trout":id=> 1 
  10.         radio_button :text => "Salmon":id => 2 
  11.         radio_button :text => "Crab":id => 3 
  12.         radio_button :text => "Lobster":id => 4 
  13.       end 
  14.       @quantity = edit_text :hint => "Quantity" 
  15.       button :text => "Place Order" 
  16.     end 
  17.   end 

handle_create 在用戶啟動應用程序時調用。在 Android 中,這是您處理必要設置的地方。標準 Android 應用程序通常使用 XML 定義布局,但在 Ruboto 中,需要通過腳本定義布局。

Ruboto 的功能在您的腳本和 Android 之間架起一座橋梁。無論您擁有 Ruby 背景還是 Android 背景,您都應該能夠明白setup_content 中發(fā)生的事。您正在創(chuàng)建一個垂直布局,將幾個小部件堆疊在一起。這些小部件包括文本,幾個用于選擇要預訂的魚類種類的單選按鈕,一個用于輸入數量的可編輯文本字段,以及一個用于下訂單的按鈕??梢允褂? Ruby 語法來配置您的小部件,而不是 Android 中通常使用的更繁瑣的 Java 語法。

設置每個 radio_button 上的 id 屬性有好處,它向您提供一種簡單方法,以便稍后查看選中了哪個按鈕。

Android 將自動處理與單選按鈕和可編輯文本字段之間的所有用戶交互。唯一剩下的工作是定義如何處理 Place Order 按鈕,如清單 4 所示。

清單 4. 下訂單

  1. handle_click do |view| 
  2.    if view.text == "Place Order" 
  3.      count = @quantity.text 
  4.      food = @group.child_at(@group.checked_radio_button_id).\ 
  5.        text.downcase 
  6.      order = Linguistics::EN::plural(food,count) 
  7.      SmsManager.default.send_text_message("4155551234", \ 
  8.        nil"Please send #{count} #{order}"nilnil
  9.      finish 
  10.    end 
  11.  end 
  12. nd 

如果您以前編寫過 Android 應用程序,您可能會注意到,您正在使用一種不同的范式來處理選擇。Android 開發(fā)人員傾向于為每個可選項目編寫一些獨特的單擊處理程序。但是,在 Ruboto 中,更簡單的方法是為您的 Activity 創(chuàng)建一個全局單擊處理程序,在那里測試用戶單擊了哪個項目。

您提取用戶選擇的魚的數量和種類。如果用戶沒有選中一個單選按鈕,Ruboto 將在內部優(yōu)雅地處理這個運行時錯誤。否則,您將把文本傳遞到 linguistics 庫并請求它為您創(chuàng)建適當的名詞形式。這個庫能處理不同的復數規(guī)則,因此它將生成 1 salmon、2 salmon、1 crab、2 crabs 之類的值。它甚至能識別手寫的數字,因此它還將生成 one lobster 和three lobsters 之類的詞組。對于一行代碼來說,這是令人非常印象深刻的行為,展示了它利用現有腳本向您的應用程序輕松添加功能的能力。

類似地,發(fā)送一條 SMS 消息只需一行調用,調用一個方便的 Android 方法。Ruboto 允許您使用 Ruby 式語法調用這個方法;對等的 Java 代碼將是 SmsManager.getDefault().sendTextMessage()。您提供接收者的電話號碼和要發(fā)送的消息,并為可選參數傳遞 nil。如果您 正在一個設備上運行并想實際發(fā)送一條 SMS 消息,可以替換為一個實際電話號碼。如果您想在模擬器中測試,則可以替換為模擬器的端口號,比如 “5554”。

運行腳本

Ruboto 最強大的一個方面是允許通過簡單地加載一個已更新腳本來更改功能。即使您已經完全更改了這個應用程序的功能,也不需要重新構建應用程序或重新加載 APK。相反,只需在命令行輸入以下命令:

  1. $ rake update_scripts 

這條命令將把 linguistics 腳本和您的新 fishmonger 腳本復制到模擬器或一個已連接設備。當您重新啟動應用程序時,將看到您的新屏幕,如圖 5 所示。

圖 5. Android 預訂頁面

顯示一些預訂 tuna、crab、trout、salmon 和 lobster 的選項以及一個數量和一個預訂按鈕的屏幕

如果您正在運行一個非根設備(non-rooted device)或正在更改 Java 文件或 Android 清單文件,可以通過再次輸入 rake 安裝命令來加載更新。注意,即使是非根設備也可以實時更新它們的腳本;例如,您可以從 Internet 下載新腳本并在運行時生成它們。固件限制僅適用于通過您的 USB 連接推送文件。

繼續(xù)試驗這個應用程序。當您進行了一個有效選擇并按下預訂按鈕后,屏幕將自動關閉。如果您使用一個有效的接收者地址,他們將很快收到您的消息。圖 6 顯示了一個非常繁忙的海鮮店的最新訂單列表。

圖 6. 來自 Ruboto 腳本的標準化訂單

顯示 4 個不同訂單的屏幕

結束語

Ruboto 仍然是一個早期項目,但即使處于現在的狀態(tài),它已經能提供一種非常靈活有用的方法來編寫和分發(fā) Android 軟件。Ruboto 的成功歸功于 JRuby 和 Android 的優(yōu)勢:JRuby 已經完成了以 Java 語言編寫一個功能齊備的 Ruby 解釋器的艱巨工作,Android 的 Dalvik 工具集提供了一種令人印象深刻的從標準 Java 字節(jié)碼到它的自定義 Dalvik 字節(jié)碼的轉換。

如您所見,Ruboto 腳本可能會非常短,但提供來自 Ruby 和 Android 的強大功能?;旌虾推ヅ?Ruby 腳本、Ruby 和 Java 語法以及 Android API 的能力向您提供了許多提高生產力的選項。

Ruboto 是位于客戶端和服務器兩端的開發(fā)人員之間的一個有用橋梁。Android 開發(fā)人員將欣賞它的反射功能,該功能向他們提供實時大幅更新應用程序功能的能力。Ruby 開發(fā)人員將擁有一種相當便捷的方法來結合他們的腳本技術和移動平臺,利用現有 Ruby 代碼來創(chuàng)建新應用程序。這兩類開發(fā)人員都將懷著極大興趣,密切關注這個項目的進展。

責任編輯:佚名 來源: IBM
相關推薦

2012-04-09 11:32:40

ibmdw

2009-12-14 11:12:55

Ruby運行

2009-12-14 13:47:28

Ruby簡單語法

2013-03-26 13:38:12

Android per

2009-12-17 16:50:54

Ruby簡單編寫

2009-12-18 16:27:41

Ruby解析Json

2009-12-15 15:19:30

Ruby訪問控制

2014-07-17 11:36:27

Android Stu使用教程

2013-03-28 16:31:48

AIDL的簡單使用Android中AID

2014-08-08 09:39:40

httpClient

2011-05-27 16:57:13

Android widget

2013-05-14 10:37:10

AIR Android設置訪問權限

2010-01-26 14:43:53

Android數據存儲

2009-12-15 14:46:04

Ruby類常量

2009-12-14 13:27:06

Ruby區(qū)間

2009-12-18 14:10:29

Ruby訪問剪貼板

2011-03-30 16:20:35

RubyJRubyAndroid

2018-07-02 13:10:05

Android短信驗證

2011-09-09 16:00:02

Android Web實例

2010-02-05 17:02:13

Android
點贊
收藏

51CTO技術棧公眾號