Ruboto: Ruby trên Android

Một cách tiếp cận tạo kịch bản lệnh linh hoạt cho máy ảo Dalvik

Một ngôn ngữ chung mang hai đối tác khác nhau lại với nhau: ngôn ngữ kịch bản lệnh Ruby và định dạng tuỳ chỉnh của Google cho các chương trình Android. Nhờ có những bộ công cụ mạnh trong các dự án JRuby và Android, bạn có thể viết và chạy các kịch bản lệnh Ruby, có hành vi hoàn toàn khác với chương trình Android điển hình.

Chris King, Kỹ sư phần mềm, Freelance

Photo of Chris KingMột ngôn ngữ chung mang hai đối tác khác nhau lại với nhau: ngôn ngữ kịch bản lệnh Ruby và định dạng tuỳ chỉnh của Google cho các chương trình Android. Nhờ có những bộ công cụ mạnh trong các dự án JRuby và Android, bạn có thể viết và chạy các kịch bản lệnh Ruby, có hành vi hoàn toàn khác với chương trình Android điển hình.



22 04 2011

Mở đầu

Hầu hết công việc đáng chú ý về phát triển phần mềm hiện nay xảy ra ở một trong hai thái cực: các máy chủ điện toán đám mây khổng lồ và các thiết bị di động nhỏ bé. Các lĩnh vực này giải quyết các vấn đề khác nhau đáng kể và do đó hỗ trợ các công cụ khác nhau, một cách tương ứng. Việc phát triển cho máy chủ thường sử dụng các ngôn ngữ kịch bản lệnh để kết hợp chặt chẽ các thành phần khác nhau với nhau và hoàn thành các nhiệm vụ tự động hóa tinh vi, trong khi việc phát triển cho di động lại tập trung vào các khả năng và các nhu cầu cụ thể của một thiết bị và người dùng cụ thể.

Tuy nhiên, hai thái cực này lại dùng chung một ngôn ngữ phổ biến là: Java™. Dù là Android hay khung công tác Spring, nhiều trong số các công nghệ phổ biến nhất hiện nay đã chấp nhận một ngôn ngữ được cả thế giới biết đến và hỗ trợ. Ngôn ngữ phổ biến này có thể dẫn đến một số tác động lẫn nhau đáng ngạc nhiên giữa các lĩnh vực mà bạn có xu hướng nghĩ là khác biệt. Lập trình Java mở cửa cho nhiều tùy chọn xuyên qua nhiều nền tảng, như dễ dàng gửi lên mã máy chủ cho một thiết bị Android hay liên kết các thành phần hiện có vào trong các khả năng của nền tảng được thiết kế riêng.

Bài viết này tìm hiểu Ruboto, một dự án bắc cầu qua khe hở giữa các ngôn ngữ tạo kịch bản lệnh và Android. Bạn sẽ tìm hiểu về Ruby và Android, cách chúng có thể liên kết với nhau trong máy ảo Dalvik, cách xây dựng và triển khai các kịch bản lệnh riêng của bạn và làm thế nào mà công nghệ này có tiềm năng tăng năng suất cho lập trình viên và tính linh hoạt của ứng dụng .


Kiến thức nền tảng Ruby

Nhiều ngôn ngữ tạo kịch bản lệnh cạnh tranh nhau giành cảm tình của của các lập trình viên, nhưng Ruby hiện đang giữ một vị trí mạnh mẽ. Nổi tiếng nhất là nó hỗ trợ khung công tác Web Rails, nhưng nhiều nhà phát triển cũng ngưỡng mộ Ruby về sự kết hợp của sự ngắn gọn và trang nhã. Một ngôn ngữ tạo kịch bản lệnh hướng đối tượng có nhiều tính năng hiện đại như định kiểu "vịt" (duck typing-định kiểu vịt nghĩa là một đối tượng được xác định bởi nó có thể làm gì chứ không phải bởi nó là gì) và siêu lập trình (metaprogramming), Ruby đủ mạnh để hỗ trợ các kiến trúc phức tạp và cũng đủ đơn giản để thực hiện nhiệm vụ đặc biệt.

Ruby có một số hương vị, bao gồm cả JRuby phổ biến. JRuby là một trình thông dịch Ruby đầy đủ được viết bằng ngôn ngữ Java và có thể chạy trong một máy ảo Java (JVM). Không giống như Ruby chính thức, JRuby cho phép bạn gọi các kịch bản lệnh Ruby từ bên trong mã Java, cũng như gọi các API Java từ bên trong các kịch bản lệnh Ruby của bạn.


Kiến thức nền tảng về Android

Android đã được Open Handset Alliance phát triển, nhưng nó thường được coi là một dự án Google. Hiện nay, Android được trang bị cho khoảng một phần tư trong số tất cả các điện thoại thông minh mới và thị phần của nó vẫn tiếp tục tăng.

Ở bên trong, Android chạy trên một nhân Linux sửa đổi. Hầu hết các ứng dụng chạy trong máy ảo Dalvik (VM), một máy ảo tùy chỉnh mà Google đã thiết kế từ nền tảng trở lên để có hiệu năng tối ưu trên các thiết bị di động. Bạn có thể tìm hiểu thêm về Dalvik trong phần Tài nguyên.

Một điểm mà nhiều nhà phát triển Android mới không nhận thấy là mã nguồn Java do họ viết ra không chạy như mã byte Java. Thay vào đó, bộ công cụ Android chuyển đổi mã byte Java thành mã byte Dalvik. Những tệp được chuyển đổi này, có phần mở rộng .dex, được đóng gói trong ứng dụng mà bạn triển khai lên thiết bị. Vào lúc thiết bị chạy chương trình của bạn, không có mã byte nào của Java còn lại.


Android + Ruby = Ruboto

Charles Nutter, một thành viên của nhóm JRuby, đã hiểu rằng: vì chuỗi công cụ (toolchain) Android chuyển đổi mã Java đã biên dịch thành các tệp Dalvik và vì JRuby đã có một trình thông dịch Ruby bằng mã byte Java đã biên dịch, nên ông sẽ có thể chạy Ruby trên Android. Trong một thời gian ngắn đáng kinh ngạc, ông đã thực hiện nhiệm vụ này và Ruboto được sinh ra. Nhờ những nỗ lực của một số nhà phát triển khác, Ruboto đã trở thành một dự án năng động đang phát triển ngày càng hấp dẫn với các nhà phát triển Android cũng như Ruby.

Hiện nay, Ruboto có hai hương vị: ruboto-irb và ruboto-core. ruboto-irb là một trình vỏ (shell) Ruby tương tác chạy trên Android. Dự án này cho phép bạn chạy kịch bản lệnh Ruby tùy ý, các kịch bản lệnh này cũng có thể truy cập các API Android. Công cụ này có thể rất có ích cho các nhà phát triển, những người muốn chạy kiểm thử hoặc thực hiện các nhiệm vụ trên thiết bị của họ, nhưng có lẽ không thích hợp để viết các ứng dụng mà bạn sẽ phân phối sau này.

Ngược lại, ruboto-core cung cấp một khung công tác cho phép bạn tạo các dự án Ruboto riêng của bạn. Khi sử dụng ruboto-core, bạn có thể bổ sung thêm sự hỗ trợ kịch bản lệnh mạnh mẽ và linh hoạt cho dự án của bạn, trong khi vẫn duy trì quyền truy cập vào các API Android. Hình 1 cho thấy quá trình xây dựng bởi ruboto-core: các tệp nguồn Java được tạo tự động và các kịch bản lệnh Ruby được viết-tùy chỉnh được đóng gói lại với nhau thành một APK Android sẽ chạy trên thiết bị.

Hình 1. Xây dựng một ứng dụng Ruboto
Biểu đồ tiến trình cho thấy dòng chảy từ các tệp Java Ruboto Java đến APK.

Phần còn lại của bài viết này tập trung vào việc tạo một dự án dựa trên Ruboto tùy chỉnh. Ruboto vẫn còn là phần mềm sơ khởi; lúc viết bài này, số phiên bản của nó là 0.0.2. Nó tiếp tục phát triển nhanh chóng và có thể hoạt động hơi khác đi một chút lúc bạn đọc bài viết này. Nếu bạn gặp vấn đề trong khi đang chạy bất kỳ lệnh nào dưới đây, hãy xem phần Tài nguyên để có được các thông tin cập nhật nhất về Ruboto và Android.


Tạo kịch bản lệnh SMS

Kết hợp Ruby và Android với nhau cho phép bạn tạo các kịch bản lệnh đơn giản có thể truy cập các chức năng mạnh mẽ của Android. Bạn sẽ viết một kịch bản lệnh Ruboto cho phép những người dùng đặt hàng hải sản từ một dịch vụ giao hàng. Ứng dụng đơn giản này tận dụng những thế mạnh của mỗi nền tảng. Về phía Android, bạn sẽ có một cách đơn giản để tạo một tin nhắn SMS có chứa đơn hàng của bạn; ứng dụng này đặt các đơn hàng thậm chí không cần một máy chủ. Về phía Ruby, bạn sẽ sử dụng lại một thư viện xử lý ngôn ngữ hiện có, để tiêu chuẩn hóa các đơn hàng của bạn thành một định dạng dễ đọc.


Bắt đầu

Để xây dựng và triển khai các kịch bản lệnh Ruby trên Android cần có một số thành phần. Bạn có thể đã có một số trong các thành phần này được cài đặt; nếu đã có rồi, thì bạn có thể sử dụng những công cụ hiện có đó.

Vì cả Android lẫn Ruby là đa nền tảng, nên bạn có thể chạy Ruboto trên Linux®, Mac OS X, hay Windows®. Bạn sẽ sử dụng dòng lệnh trong suốt bài viết này.

Nếu bạn sử dụng cygwin cho Windows, bạn có thể gặp phải các vấn đề trong khi chạy các lệnh JRuby nào đó. Để cho an toàn, hãy gắn với shell CMD Windows tiêu chuẩn nếu bạn đang chạy Windows.

Java

Bạn sẽ cần một JDK (Java Development Kit – Bộ dụng cụ phát triển Java) đang hoạt động trên hộp phát triển của bạn. Để kiểm tra xem một bộ dụng cụ phát triển Java đã được cài đặt chưa, hãy nhập lệnh sau đây:

$ javac -version

Lệnh này sẽ tìm thấy một phiên bản của JDK, nếu bạn đã thiết lập. Nếu không, hãy cài đặt phiên bản mới nhất của JDK theo liên kết trong phần Tài nguyên. Sau khi cài đặt, hãy thêm thư mục bin của JDK vào PATH (đường dẫn) của bạn và lặp lại lệnh ở trên.

Ant

Android đi kèm với phiên bản Ant riêng của nó, nhưng Ruboto cũng sẽ cần truy cập Ant từ kịch bản lệnh riêng của mình. Nếu bạn chưa cài đặt một phiên bản độc lập của Ant, hãy tải nó về từ liên kết trong phần Tài nguyên và giải nén vào thư mục bất kỳ. Một lần nữa, hãy thêm thư mục bin của nó vào PATH của bạn. Hãy chắc chắn rằng bạn có thể chạy lệnh Ant.


Android

Chuyển đến trang Web của nhà phát triển Android và cài đặt Android SDK cho hệ điều hành của bạn (xem Tài nguyên). Sau khi đã cài đặt Android SDK, hãy chạy lệnh android nằm trong thư mục tools (các công cụ) của Android. Lệnh này khởi chạy trình quản lý này SDK, như trong Hình 2. Bạn sẽ muốn cài đặt các gói sau, được liệt kê trong các gói có sẵn (Available).

  1. SDK cho nền tảng Android 2.2, API 8.
  2. Các công cụ SDK của Android, bản sửa đổi 8.
  3. Các công cụ-nền tảng SDK Android, bản sửa đổi 1.
Hình 2. SDK Android và trình quản lý AVD
Cửa sổ cho thấy một danh sách các gói có sẵn.

Tạo một ảnh Android để phát triển bằng cách mở phần các thiết bị ảo của SDK Android và trình quản lý AVD. Nhìn vào Hình 3, hãy tạo một thiết bị ảo có tên Froyo nhằm đến Android 2.2 - API mức 8. Bạn có thể tạo một Thẻ nhớ SD ảo nếu bạn muốn.

Hình 3. Tạo một trình mô phỏng thiết bị
Cửa sổ với các trường tên: froyo, đích: Android 2.2 - mức 8 API 8, thẻ SD 1024, lớp phủ: mặc định, phần cứng.

Các ứng dụng ruboto sẽ chạy trên thiết bị của bạn, nhưng việc phát triển sẽ dễ dàng hơn nhiều nếu bạn có quyền viết vào các thư mục tùy ý, trong đó yêu cầu hoặc sử dụng trình phỏng theo thiết bị hoặc thiết bị gốc. Phần còn lại của bài viết này tập trung vào sử dụng trình phỏng theo thiết bị. Sau khi bạn kết thúc dự án này, nó sẽ chạy tốt như nhau trên một thiết bị Android đang chạy phiên bản phần mềm 2.2 hoặc mới hơn.

Bổ sung thêm các thư mục các công cụ-nền tảng (platform-tools) và các công cụ (tools) của Android vào đường dẫn PATH của bạn. Bây giờ bạn có thể chạy các lệnh trong Liệt kê 1 từ dấu nhắc của bạn.

Liệt kê 1. Chạy các lệnh từ dấu nhắc của bạn
$ aapt version
$ adb --version

JRuby

JRuby cung cấp một bản cài đặt dễ dàng đến không ngờ. Chỉ cần tới http://jruby.org/getting-started và làm theo các hướng dẫn. Nếu cần thiết, hãy thêm thư mục bin của JRuby vào đường dẫn (PATH) của bạn. Hãy kiểm tra xem việc cài đặt đã thành công chưa bằng cách gõ lệnh sau:

$ jruby -v

Vì Ruboto được lưu trữ trên một máy chủ bảo mật, nên bạn sẽ cần phải cài đặt gem JRuby-openssl (gem là chương trình dùng để quản lý các thư viện cho Ruby) để tải nó. Bạn có thể thực hiện việc này bằng lệnh sau:

$ gem install jruby-openssl

Bạn cũng sẽ muốn cài đặt rake (Ruby make), là tương đương của make hay ant dành cho Ruby. Hãy gõ lệnh sau đây:

$ gem install rake

Cuối cùng, đến lúc để cài đặt chính Ruboto. Ruboto được đóng gói như một gem, vì vậy việc cài đặt rất dễ dàng. Hãy nhập lệnh sau đây:

$ gem install ruboto-core

Tạo dự án Ruboto

Ruboto sẽ tạo ra một dự án Android từ đầu cho bạn, nó đảm bảo rằng bản kê của bạn được thiết lập đúng, các kịch bản lệnh được đặt đúng chỗ trong bộ sưu tập đúng và bạn có quyền truy cập vào các thư viện cần thiết. Bạn nên dùng cách tiếp cận này hơn là cố gắng tự tạo nó cho mình hoặc sửa đổi một dự án Android hiện tại.

Để tạo dự án, hãy dịch chuyển tới một thư mục dự án, sau đó gõ như sau:

$ ruboto gen app --package us.cirion.ruboto.demo --path fishmonger --name Fishmonger --target android-8 --activity Fishmonger

Lệnh này làm những việc sau:

  • gen app ra lệnh cho Ruboto tạo một dự án Android mới từ đầu.
  • --package cung cấp tên gói Android duy nhất.
  • --path ra lệnh cho Ruboto lưu trữ dự án đó ở đâu; đây phải là một tên thư mục mới.
  • --name xác định tên ứng dụng mà người dùng nhìn thấy; tên này không cần phải là duy nhất.
  • --target xác định phiên bản Android nào để biên dịch lại dự án. Lúc viết bài này, bạn phải sử dụng android-8. Một đối số tùy chọn là --min_sdk, khai báo rằng ứng dụng của bạn có thể chạy trên các phiên bản Android trước đó; tạm thời bây giờ hãy bỏ qua điều này.
  • --activity là một đối số tùy chọn để ra lệnh cho Ruboto tạo ra một hoạt động Android mới và khởi tạo nó.

Bạn có thể tìm hiểu các nội dung của thư mục fishmonger (người bán cá). Ruboto đã tự động tạo ra tất cả các tệp Android cần thiết để xây dựng và chạy một Hoạt động cơ bản. Vì ứng dụng sẽ gửi các tin nhắn SMS, nên bạn cần phải thực hiện một sự thay đổi trong tệp AndroidManifest.xml. Chèn thẻ sau như là phần tử con đầu tiên của phần tử <manifest> trong tệp đó:

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

Nếu bạn bỏ qua sự quyền hạn này, bạn sẽ vẫn còn có thể xây dựng và nạp kịch bản lệnh của bạn, nhưng bạn sẽ nhận được một lỗi thời gian chạy khi ứng dụng của bạn cố gắng gửi đi một tin nhắn SMS.


Chạy dự án mặc định

Đặc biệt, Ruboto tạo ra một Activity (hoạt động) và một kịch bản lệnh sẽ cài đặt và chạy trên thiết bị hoặc trình mô phỏng thiết bị. Nếu trình mô phỏng thiết bị của bạn vẫn còn chưa chạy, bạn có thể khởi chạy nó bằng các lệnh sau đây:

$ emulator -avd Froyo

Chờ cho trình mô phỏng thiết bị kết thúc khởi động và đi tới màn hình chủ. Để đảm bảo tất cả các tệp Ruboto được xây dựng và triển khai đúng cách, cd vào thư mục fishmonger và chạy các lệnh sau:

$ rake install

Nếu bạn gặp một lỗi, hãy thử chạy lệnh này một lần nữa; đôi khi mất kết nối trong quá trình xây dựng. Việc xây dựng ban đầu phải mất một lúc, nhưng sau đó các cập nhật xảy ra nhanh hơn. Sau khi việc cài đặt hoàn thành, hãy tìm kiếm biểu tượng có nhãn Fishmonger trong trình mô phỏng thiết bị của bạn. Khởi chạy nó và chờ đợi. Lúc viết bài này, máy Ruboto phải mất một thời gian để nạp. Cuối cùng, bạn sẽ thấy một màn hình tương tự với hiển thị của Hình 4.

Hình 4. Hoạt động Ruboto theo khuôn mẫu
Trình mô phỏng thiết bị với một cửa sổ ở bên trái và một bàn phím và các nút điều khiển ở bên phải.

Tùy chỉnh dự án

Bây giờ, chúng ta hãy thiết lập ứng dụng Fishmonger (Người bán cá). Trước tiên, bạn nên thêm sự hỗ trợ ngôn ngữ riêng. Ruby có một gem tuyệt vời gọi là linguistics (ngôn ngữ học), cung cấp nhiều khả năng về ngôn ngữ - tiếng Anh. Lúc viết bài viết, Ruboto không xử lý cấu trúc thư mục lồng nhau của thư viện ngôn ngữ học, do đó để thay thế, hãy tải về tệp nén ngôn ngữ học của bài viết này và giải nén các nội dung vào thư mục fishmonger\assets\scripts (xem phần Tải về để có một liên kết). Đây là gem ngôn ngữ học có sẵn, được sửa đổi để san bằng cấu trúc thư mục. Trong tương lai, bạn có thể chỉ cần gói gem với kịch bản lệnh ruboto của bạn.

Viết kịch bản lệnh

Bây giờ bạn đã sẵn sàng cho phần chính của dự án. Khung công tác Ruboto xử lý tất cả các mã Java và cơ sở hạ tầng Android, vì vậy toàn bộ công việc của bạn có thể diễn ra trong tệp fishmonger.rb. Xoá bỏ các nội dung mặc định của tệp này. Bạn sẽ bắt đầu bằng cách thêm văn bản có trong Liệt kê 2.

Liệt kê 2. Các phụ thuộc của kịch bản lệnh
require 'ruboto.rb'
require 'linguistics'
include Linguistics::EN

import "android.telephony.SmsManager"

ruboto_import_widgets :Button, :EditText, :LinearLayout, \
  :RadioGroup, :RadioButton, :TextView

Hai dòng đầu tiên nạp các thư viện ruboto và ngôn ngữ học. Lệnh include (bao gồm) sẽ làm cho ngữ pháp tiếng tiếng Anh có sẵn trong mô đun của bạn.

Câu lệnh nhập khẩu đầu tiên trông quen thuộc với những người dùng JRuby: bạn đang bổ sung thêm sự hỗ trợ cho lớp khác. Lưu ý rằng trong trường hợp này, bạn thực sự đang sử dụng lớp Dalvik của Android, không phải là một phần của thư viện Java chuẩn. Ruboto sẽ sử dụng phản chiếu trong thời gian chạy để nạp lớp này và tạo nó có sẵn cho bạn.

Phương thức ruboto_import_widgets hoạt động tương tự. Tại đây, bạn đang bổ sung thêm một số widget (tiện ích) giao diện người dùng riêng của Android. Các widget này thường được sử dụng trong các hoạt động Android và Ruboto bổ sung thêm một số phương thức thuận tiện cho phép bạn cấu hình dễ dàng giao diện người dùng.

Tiếp theo, xác định phương thức handle_create của kịch bản lệnh, như trong Liệt kê 3.

Liệt kê 3. Cấu hình màn hình
$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

Phương thức handle_create được gọi khi người dùng khởi chạy ứng dụng. Trong Android, đây là nơi bạn xử lý thiết lập cần thiết. Các ứng dụng Android chuẩn thường sử dụng XML để định nghĩa cách bố trí, còn trong Ruboto, bạn sẽ tạo kịch bản lệnh cho nó để thay thế.

Một lần nữa, tận dụng lợi thế của các chức năng của Ruboto cung cấp một cầu nối giữa kịch bản lệnh của bạn và Android. Bất kể nền của bạn là Ruby hay Android, bạn sẽ có thể xem những gì đang diễn ra trong setup_content. Bạn đang tạo một cách bố trí định hướng thẳng đứng, sắp xếp một số các widget chồng lên nhau. Cách bố trí này bao gồm văn bản, các nút tròn để chọn loại cá đặt mua, một trường văn bản có thể chỉnh sửa dùng để nhập số lượng và một nút để đặt hàng. Bạn có thể sử dụng cú pháp Ruby để cấu hình các widget của bạn, thay vì cú pháp Java dài dòng hơn thường được sử dụng trong Android

Việc thiết lập thuộc tính id cho mỗi radio_button cần phải nỗ lực hơn; nó cung cấp cho bạn một cách dễ dàng để tìm kiếm nút nào được chọn sau này.

Android sẽ tự động xử lý tất cả tương tác người dùng với các nút tròn và trường văn bản có thể chỉnh sửa. Phần duy nhất còn lại phải xác định là xử lý nút Place Order (Đặt hàng), như trong Liệt kê 4.

Liệt kê 4. Đặt hàng
  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
end

Nếu bạn đã từng viết các ứng dụng Android, bạn sẽ nhận thấy rằng bạn đang sử dụng một mô hình khác để xử lý sự lựa chọn. Các nhà phát triển Android có xu hướng viết các trình xử lý nhấn nút duy nhất cho mỗi mục lựa chọn. Tuy nhiên, trong Ruboto, sẽ dễ dàng hơn nếu tạo ra một trình xử lý nhấn nút trên toàn cục cho Activity của bạn và kiểm tra xem mục nào được người dùng nhấn vào trong Hoạt động đó.

Bạn trích ra số lượng và loại cá mà người dùng chọn. Nếu họ chưa nhấn vào một nút tròn, thì Ruboto sẽ xử lý nội bộ các lỗi thời gian chạy một cách trang nhã. Trái lại, bạn sẽ chuyển văn bản cho thư viện ngôn ngữ học và yêu cầu nó tạo hình thái danh từ thích hợp cho bạn. Thư viện này có thể xử lý các quy tắc khác nhau của danh từ số nhiều, do đó nó sẽ tạo ra các giá trị ví dụ như 1 salmon, 2 salmon, 1 crab, 2 crabs, và v.v. Nó thậm chí còn nhận ra các số được viết ra, do đó nó cũng sẽ tạo ra những cụm từ như one lobster, three lobsters, và v.v. Đây là hành vi rất ấn tượng cho một dòng mã và cho thấy sức mạnh của việc sử dụng các kịch bản lệnh hiện có để dễ dàng bổ sung thêm các khả năng cho ứng dụng của bạn.

Tương tự như vậy, việc gửi tin nhắn SMS chỉ đòi hỏi một dòng lệnh gọi một phương thức tiện lợi của Android. Ruboto cho phép bạn sử dụng cú pháp kiểu-Ruby để gọi phương thức này; mã Java tương đương sẽ là SmsManager.getDefault().sendTextMessage(). Bạn cung cấp số điện thoại của người nhận và văn bản để gửi đi và chuyển nil (không) cho các tham số tùy chọn. Nếu bạn đang chạy trên thiết bị và muốn thực sự gửi một tin nhắn SMS, hãy thay thế một số điện thoại hợp lệ. Nếu bạn muốn kiểm thử trong trình phỏng theo thiết bị, bạn có thể thay thế bằng số cổng của trình mô phỏng thiết bị, ví dụ, dãy số "5554."

Chạy kịch bản lệnh

Một trong những khía cạnh mạnh mẽ nhất của Ruboto là bạn có thể thay đổi chức năng bằng cách chỉ cần nạp một kịch bản lệnh đã cập nhật. Mặc dù bạn đã hoàn toàn thay đổi những gì ứng dụng này làm, bạn không cần phải xây dựng lại ứng dụng hoặc nạp lại APK. Thay vào đó, chỉ cần gõ vào dòng lệnh như sau:

$ rake update_scripts

Lệnh này sẽ sao chép các kịch bản lệnh ngôn ngữ học và kịch bản lệnh fishmonger mới của bạn vào một trình phỏng theo thiết bị hay một thiết bị đính kèm. Khi bạn khởi chạy lại ứng dụng đó, bạn sẽ thấy màn hình mới của bạn, như trong Hình 5.

Hình 5. Trang đặt hàng Android
Màn hình cho thấy các tùy chọn theo thứ tự cá ngừ, cua, cá hồi, thịt cá hồi và tôm hùm cùng với một nút số lượng và đặt hàng.

Nếu bạn đang chạy một thiết bị không phải gốc hoặc thực hiện bất kỳ các thay đổi nào cho các tệp Java hoặc bản kê Android, bạn có thể nạp bản cập nhật bằng cách gõ lệnh cài đặt rake một lần nữa. Lưu ý rằng ngay cả các thiết bị không phải gốc cũng có thể cập nhật các kịch bản lệnh của chúng trong lúc đang hoạt động; ví dụ, bạn có thể tải về các kịch bản lệnh mới từ Internet hoặc tạo chúng trong thời gian chạy. Sự hạn chế của phần mềm cơ sở chỉ áp dụng cho việc đẩy các tệp qua kết nối USB của bạn.

Hãy tiếp tục và chạy thử ứng dụng này. Sau khi bạn thực hiện một sự lựa chọn hợp lệ và nhấn nút đặt hàng, màn hình sẽ tự động đóng lại. Nếu bạn sử dụng một địa chỉ người nhận hợp lệ, họ sẽ thấy ngay thông điệp của bạn đến. Hình 6 cho thấy danh sách các đơn hàng mới nhất của người bán cá rất bận rộn.

Hình 6. Các đơn đặt hàng được tiêu chuẩn hóa từ kịch bản lệnh Ruboto
Màn hình cho thấy 4 đơn hàng khác nhau.

Kết luận

Ruboto vẫn đang còn là những nỗ lực bước đầu, nhưng ngay cả trong trạng thái hiện tại của mình nó vẫn cung cấp một cách rất linh hoạt và hữu ích để viết và phân phối phần mềm Android. Thành công của Ruboto là kết quả từ những thế mạnh của JRuby và Android: JRuby đã thực hiện công việc khó khăn là viết một trình thông dịch Ruby đầy đủ bằng ngôn ngữ Java và bộ các công cụ lập trình Dalvik của Android cung cấp một cách chuyển đổi ấn tượng từ mã byte Java chuẩn sang mã byte Dalvik tùy chỉnh của nó.

Như bạn đã thấy, các kịch bản lệnh Ruboto có thể rất ngắn, trong khi cung cấp nhiều khả năng mạnh mẽ từ cả Ruby lẫn Android. Khả năng để trộn lẫn và làm khớp các kịch bản lệnh của Ruby, cú pháp Ruby và Java và các API Android cung cấp cho bạn nhiều tùy chọn để tăng năng suất.

Ruboto là một cầu nối hấp dẫn cho các nhà phát triển trên cả hai phía của đường phân chia khách/chủ. Các nhà phát triển Android sẽ đánh giá các sức mạnh phản chiếu của nó, cung cấp cho họ năng lực để cập nhật đáng kể các khả năng của ứng dụng trong lúc đang hoạt động. Các nhà phát triển Ruby đã có được một cách hầu như không có khó khăn gì để mang các tri thức chuyên môn kịch bản lệnh của họ vào nền tảng di động và có thể sử dụng mã Ruby hiện có để tạo các ứng dụng mới. Cả hai phe vẫn đang theo dõi với mối quan tâm sâu sắc khi dự án này hoàn thiện hơn.


Các tải về

Mô tảTênKích thước
Article source codefishmonger.zip65KB
Article source codelinguistics-rb.zip34KB

Tài nguyên

Học tập

  • Tìm hiểu thêm về JRuby.
  • Xem video vào/ra (I/O) xuất sắc của Google trên Máy ảo Dalvik và mã byte Dalvik.
  • Truy cập vào thông tin dự án ruboto-core.
  • Tìm hiểu về ruboto-irb, dự án cùng loại cung cấp một trình thông dịch ruby tương tác.
  • Để biết một cách tiếp cận thay thế cho Ruby trên Android, hãy tìm hiểu MirahGarrett. Chúng biên dịch các kịch bản lệnh Ruby theo ngôn ngữ Java (và từ đó đến Dalvik), chứ không phải thông dịch các kịch bản lệnh Ruby trong thời gian chạy. Cách tiếp cận này dẫn đến việc thực hiện nhanh hơn nhưng phải trả giá bằng tính linh hoạt của siêu lập trình (metaprogramming) trong thời gian chạy.
  • "Giới thiệu về phát triển Android" (developerWorks, 05.2009) cung cấp cho bạn một bài mở đầu về nền tảng Android và giải thích cách mã hóa một ứng dụng Android cơ bản.
  • "Nối mạng với Android" (developerWorks, 06.2009) khám phá những khả năng nối mạng của Android.
  • "Làm việc với XML trên Android" (developerWorks, 06.2009) giải thích các tùy chọn khác nhau để làm việc với XML trên Android và cách sử dụng chúng để xây dựng các ứng dụng Android riêng của bạn.
  • Dưới Mái che của các ứng dụng Web được thiết kế riêng cho Android: Tìm hiểu về các ứng dụng lai trong Android.
  • Thiết kế và phát triển di động của Brian Fling từ O'Reilly Media thảo luận về các hướng dẫn thực hành, các tiêu chuẩn, các kỹ thuật và các cách làm thực tế tốt nhất để xây dựng các sản phẩm di động.
  • Nhận tài liệu Android SDK.
  • Open Handset Alliance là nhà tài trợ của Android.
  • Vùng phát triển phát triển Webcủa developerWorks chuyên về các bài viết trình bày các giải pháp dựa trên Web khác nhau.

Lấy sản phẩm và công nghệ

  • Tải về Android SDK, truy cập tài liệu tham khảo API và nhận được những tin tức mới nhất về Android từ trang Web chính thức của các nhà phát triển Android. Phiên bản 1.5 và mới hơn sẽ hoạt động.
  • Android là nguồn mở, có nghĩa là bạn có thể nhận được mã nguồn của nó từ Dự án nguồn mở Android.
  • Nhận bản cập nhật 21 của JDK 6.
  • Tải về Ant.
  • Đổi mới dự án phát triển tiếp theo của bạn bằng phần mềm dùng thử của IBM, có sẵn để tải xuống hoặc trên đĩa DVD.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=648313
ArticleTitle=Ruboto: Ruby trên Android
publish-date=04222011