Tháng 7/2005 Google mua lại công ty phát triển phần mềm Android. Sau hơn 2 năm âm thầm phát triển, Google liên kết với các tập đoàn và công ty lớn danh tiếng trên thế giới dưới danh hiệu "Open Handset Alliance" (OHA) cùng nhau sáng tạo và phát triển công nghệ phần mềm "Android" cho các loại điện thoại di động smartphone với một thị trường rất rộng lớn (3 tỷ máy) để cạnh tranh với những đối thủ lớn như Symbian, Microsoft, Palm...
Hình 2.6. Các thành viên của "Liên minh di động mở"
http://hi-android.info
Từ khi công bố, Android[5,16] đã là hệ điều hành điện thoại di động mở nguồn mở miễn phí do Google phát triển dựa trên nền tảng mã nguồn mở Linux OS (Kernel 2.6) cho máy di động và những phần mềm trung gian (middleware) để hỗ trợ các ứng dụng mà người sử dụng cần đến. Do đặc điểm của Android là bản quyền mã nguồn mở của nó rất thông thoáng (dựa trên nền tảng bản quyền của Apache V 2.0) nên bất kỳ một hãng sản xuất phần cứng nào cũng đều có thể tự do sử dụng hệ điều hành Android cho thiết bị của mình, miễn là các thiết bị ấy đáp ứng được các tiêu chuẩn cơ bản do Google đặt ra (có cảm ứng chạm, GPS, 3G,...). Các nhà sản xuất có thể tự do thay đổi phiên bản Android trên máy của mình một cách tự do mà không cần phải xin phép hay trả bất kì khoản phí nào nhưng phải đảm bảo tính tương thích ngược (backward compatibility) của phiên bản chế riêng đó[20].
Những tính năng cơ bản hỗ trợ trên nền tảng Android[5,16]:
- Ứng dụng framework cho phép tái sử dụng và thay thế các thành phần. - Máy ảo Dalvik được thiết kế phù hợp để chạy trên các thiết bị di động. - Trình duyệt web được tích hợp dựa trên mã nguồn mở WebKit.
- Các thư viện đồ họa 2D, 3D mạnh mẽ và tối ưu. - Hệ quản trị cơ sở dữ liệu gọn nhẹ SQLite.
- Hỗ trợ các định dạng âm thanh phổ biến, video, và các định dạng hình ảnh quen thuộc như MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF. - Hỗ trợ GSM, Bluetooth, EDGE, 3G và WiFi.
- Hỗ trợ camera, GPS, la bàn.
Đặc biệt Google phát triển Android SDK cung cấp các công cụ và bộ thư viên các hàm API cần thiết để phát triển ứng dụng cho nền tảng Android sử dụng ngôn ngữ lập trình java.
Hệ điều hành Android ra đời đã tạo nên một cuộc cách mạng công nghệ thực sự, cơ chế nguồn mở tạo ra nhiều thách thức và cơ hội cho những nhà phát triển ứng dụng; đồng thời mang lại cho người dùng điện thoại sự cảm nhận khác biệt về 1 chiếc Smartphone, chưa đầy 2 năm kho phần mềm cho Android đã lên đến còn số hơn 30 nghìn ứng dụng. Được nhiều tập đoàn công nghệ hàng đầu tham gia phát triển, nền tảng này ngày càng nhiều tích năng nổi trội và đầy sáng tạo. Phiên bản hệ điều hành Android mới nhất là 4.0 (tính đến ngày 30/08/2011). 2.2.2. Kiến trúc hệ thống
Kiến trúc Android[5,16,18] bao gồm các tầng và các thành phần trong đó. Tầng sẽ sử dụng các dịch vụ cung cấp bởi các tầng dưới. Android được chia thành 4 tầng: tầng nhân linux, tầng Libraries và Android Runtime, tầng Application Framework, tầng Application. Các thành phần trong hệ điều hành Android được viết bằng cả C/C ++ và Java.
Tầng hạt nhân linux
Hệ điều hành android phát triển dựa trên nhân linux (Linux kernel 2.6) và được cải tiến nhiều để phù hợp với các hạn chế đặc trung của điện thoại di động như hạn chế về bộ vi xử lý, dung lượng bộ nhớ. Tầng này bao gồm những dịch vụ hệ thống chủ yếu như quản lý bộ nhớ (memory management), giao tiếp với phần cứng (driver model), thực hiện bảo mật (sercurity), quản lý tiến trình (process). Bộ nhân làm nhiệm vụ như một lớp trung gian kết nối phần cứng thiết bị và phần ứng dụng. Các thành phần chủ yếu bao gồm:
- Display Driver: Điều khiển việc hiển thị và thu nhận những điều khiển của người dùng lên màn hình (di chuyển, cảm ứng…).
- Camera Driver: Điều khiển hoạt động của camera.
- Bluetooth Driver: Điều khiển thiết bị thu và phát Bluetooth. - USB Driver: Quản lý hoạt động của các cổng USB.
- Keypad Driver: Điều khiển bàn phím.
- Wifi Driver: Điều khiển thiết bị thu và phát wifi.
- Binder IPC Driver: Có nhiệm vụ kết nối và liên lạc với mạng vô tuyến như CDMA, GSM, 3G, 4G, E để đảm bảo những chức năng truyền thông được thực hiện.
- M-System Driver: Quản lý việc đọc ghi…lên các thiết bị nhớ. - Power Madagement: Giám sát việc tiêu thụ điện năng.
Tầng Libraries và Android Runtime
- Phần Libraries gồm nhiều thư viện viết bằng C/C++ được biên dịch đặc biệt cho kiến trúc phần cứng được sử dụng bởi điện thoại. Một số thư viện chủ yếu như:
Thư viện hệ thống: dựa trên chuẩn C, sử dụng chỉ bởi hệ điều hành. Thư viện Media: hỗ trợ việc phát và ghi các định dạng âm thanh, hình
ảnh, video thông dụng.
Thư viện web: được sử dụng để xây dựng phần mềm duyệt web, hỗ trợ các ứng dụng nhúng khác.
Thư viện SQLite: hệ cơ sở dữ liệu tinh gọn trên Android.
- Phần Android Runtime chứa các thư viện để chương trình viết bằng ngôn ngữ Java chạy được. Phần này gồm 2 bộ phận tương tự như mô hình chạy Java trên máy tính: thứ nhất là các thư viện lõi (chứa các lớp java io, collections, file access), thứ 2 là máy ảo Dalvik do Google phát triển.
JNI: Java Native Interface (Tương tự khái niệm Application Programming Interface).
Java Native Interface: là một bộ framework cho phép mã lệnh viết bằng Java chạy trên máy ảo java có thể gọi hoặc được gọi bởi một ứng dụng viết bằng
native code (Ứng dụng được viết cho một phần cứng cụ thể và trên một hệ điều
hành cụ thể) hoặc những bộ thư viện viết bằng C, C++, Assembly.
Bằng cách sử dụng JNI, Android cho phép các ứng dụng chạy trên máy ảo Dalvik có thể sử dụng những phương thức được viết bằng các ngôn ngữ cấp thấp như: C, C++, Assembly. Qua đó các nhà phát triển ứng dụng có thể xây dựng ứng dụng dựa trên các bộ thư viện viết bằng C, C++, Assembly nhằm tăng tốc độ thực thi của ứng dụng hoặc sử dụng những tính năng mức thấp mà ngôn ngữ Java không hỗ trợ.
Tầng Application Framework
Tầng này của hệ điều hành Android cung cấp một nền tảng phát triển ứng dụng mở. Các nhà phát triển ứng dụng dễ dàng sử dụng framework này để tạo ra các ứng dụng một cách nhanh chóng và sáng tạo. Framework được viết bằng Java, có khả năng sử dụng chung để tiết kiệm tài nguyên. Nền tảng mở này giúp cho các hãng sản xuất điện thoại có thể tùy biến để phù hợp với cấu hình điện thoại của hãng, đồng thời giúp cho người lập trình có thể sử dụng các hàm API ở tầng trên mà không cần phải hiểu rõ cấu trúc bên dưới. Các nhà phát triển ứng dụng được tự do sử dụng các tính năng cao cấp của thiết bị phần cứng như: thông tin định vị địa lý, khả năng chạy dịch vụ dưới nền, thiết lập đồng hồ báo thức, thêm notification vào status bar của màn hình thiết bị…, đồng thời được phép sử dụng đầy đủ bộ API được dùng trong các ứng dụng tích hợp sẵn của Android.
Kiến trúc ứng dụng của Android được thiết kế nhằm mục đích đơn giản hóa việc tái sử dụng các component. Qua đó bất kì ứng dụng nào cũng có thể công bố các tính năng mà nó muốn chia sẻ cho các ứng dụng khác (VD: Ứng dụng email có muốn các ứng dụng khác có thể sử dụng tính năng gởi mail của nó). Phương pháp tương tự cho phép các thành phần có thể được thay thế bởi người sử dụng. Tầng này bao gồm một tập các services và thành phần sau:
- Một tập đa dạng các đối tượng View được dùng để xây dựng ứng dụng như: list, grid, text box, button. Thậm chí có thể nhúng một trình duyệt web vào ứng dụng.
- Content Provider: Cho phép các ứng dụng có thể truy xuất dữ liệu từ các ứng dụng khác hoặc chia sẽ dữ liệu của chúng.
- Resource Manager: Cung cấp khả năng truy xuất các tài nguyên non-code như hình ảnh hoặc file layout.
- Activity Manager: Giúp quản lý vòng đời của một ứng dụng.
Tầng Application
Tầng giao tiếp với người dùng bao gồm các ứng dụng cơ bản được cài đặt đi liền với hệ điều hành (như gọi điện-phone, quản lý danh bạ - contacts, duyệt web – browser...) và các ứng dụng người dùng cài đặt thêm vào (như game, từ điển...).
Google cung cấp một công cụ phát triển phần mềm gọi là Android SDK. Android SDK cung cấp các công cụ và API cần thiết để bắt đầu phát triển các ứng dụng trên nền tảng Android bằng cách sử dụng ngôn ngữ lập trình Java. Các file ứng dụng để cài đặt trên hệ điều hành android có đuôi .apk.
2.3. Mô hình client/server
2.3.1. Giới thiệu về mô hình client/server
Hình 2.8. Mô hình client/server
http://wimaxpro.org
Mô hình client/server[22] là một mô hình quen thuộc trong mạng máy tính được áp dụng một cách rộng rãi. Tất cả mọi trang web, mọi hệ thống phân tán hiện nay đều hoạt động dựa theo mô hình này. Ý tưởng của mô hình này là máy con (đóng vài trò là máy khách-client) gửi một yêu cầu (request) để máy chủ (đóng vai trò người cung ứng dịch vụ-server), máy chủ sẽ xử lý và trả kết quả về cho máy khách. Một mô hình ngược lại là mô hình master/slaver, trong
đó máy chủ (đóng vai trò ông chủ-master) sẽ gửi dữ liệu đến máy con (đóng vai trò nô lệ-slaver) bất kể máy con có cần hay không.
Server chứa các chương trình gọi là chương trình server, client chứa các chương trình gọi là chương trình client. Client gửi các yêu cầu tới máy chủ có chương trình server và chờ đợi câu trả lời từ server. Các chương trình server này chấp nhận tất cả các yêu cầu hợp lệ đến từ mọi nơi trên mạng, sau đó nó thi hành dịch vụ và trả kết quả về client. Chương trình server và client giao tiếp với nhau bằng các thông điệp (messages) thông qua một cổng truyền thông liên tác IPC (Interprocess Communication). Để một chương trình server và một chương trình client có thể giao tiếp được với nhau thì giữa chúng phải có một chuẩn để nói chuyện, chuẩn này được gọi là giao thức. Nếu một chương trình client nào đó muốn yêu cầu lấy thông tin từ server thì nó phải tuân theo giao thức mà server đó đưa ra. Các giao thức chuẩn (ở tầng mạng và vận chuyển) được sử dụng rộng rãi nhất hiện nay như: giao thức TCP/IP, giao thức SNA của IBM, OSI, ISDN, X.25 hoặc giao thức LAN-to-LAN NetBIOS.
Mô hình truyền tin client/server hướng tới việc cung cấp dịch vụ. Quá trình trao đổi dữ liệu bao gồm:
- Truyền một yêu cầu từ tiến trình client tới tiến trình server. - Yêu cầu được server xử lý.
- Truyền đáp ứng cho client. 2.3.2. Các kiến trúc client/server 2.3.2.1. Client/Server hai tầng
Kiến trúc client/server đơn giản nhất là kiến trúc hai tầng[22]. Các hệ thống sử dụng mô hình client/server hiện nay đa phần áp dụng kiến trúc client/server hai tầng. Một ứng dụng hai tầng cung cấp nhiều trạm làm việc với một tầng trình diễn thống nhất, tầng này truyền tin với tầng lưu trữ dữ liệu tập trung. Tầng trình diễn thông thường là client, và tầng lưu trữ dữ liệu là server.
Hầu hết các ứng dụng Internet như là email, telnet, ftp thậm chí là cả Web là các ứng dụng hai tầng. Phần lớn các lập trình viên trình ứng dụng viết các ứng dụng client/server có xu thế sử dụng kiến trúc này.
Trong ứng dụng hai tầng truyền thống, khối lượng công việc xử lý được dành cho phía client trong khi server chỉ đơn giản đóng vai trò như là chương trình kiểm soát luồng vào ra giữa ứng dụng và dữ liệu. Kết quả là không chỉ hiệu năng của ứng dụng bị giảm đi do tài nguyên hạn chế của PC, mà khối lượng dữ liệu truyền đi trên mạng cũng tăng theo. Khi toàn bộ ứng dụng được xử lý trên
một PC, ứng dụng bắt buộc phải yêu cầu nhiều dữ liệu trước khi đưa ra bất kỳ kết quả xử lý nào cho người dùng. Nhiều yêu cầu dữ liệu cũng làm giảm hiệu năng của mạng. Một vấn đề thường gặp khác đối với ứng dụng hai tầng là vấn đề bảo trì. Chỉ cần một thay đổi nhỏ đối với ứng dụng cũng cần phải thay đổi lại toàn bộ ứng dụng client và server.
Hình 2.9. Mô hình kiến trúc client/server 2 tầng [22]
2.3.2.2. Client/server ba tầng
Ta có thể tránh được các vấn đề của kiến trúc client/server hai tầng bằng cách mở rộng kiến trúc thành ba tầng[22]. Một kiến trúc ba tầng có thêm một tầng mới tách biệt việc xử lý dữ liệu ở vị trí trung tâm. Theo kiến trúc ba tầng, một ứng dụng được chia thành ba tầng tách biệt nhau về mặt logic.
Hình 2.10. Mô hình kiến trúc client/server 3 tầng [25]
- Tầng đầu tiên là tầng trình diễn thường bao gồm các giao diện đồ họa. Tầng trình diễn nhận dữ liệu và định dạng nó để hiển thị. Sự tách biệt giữa chức năng xử lý với giao diện đã tạo nên sự linh hoạt cho việc thiết kế ứng dụng. Nhiều giao diện người dùng được xây dựng và triển khai mà không làm thay đổi logic ứng dụng.
- Tầng thứ hai, còn được gọi là tầng trung gian hay tầng tác nghiệp.
- Tầng thứ ba chứa dữ liệu cần cho ứng dụng. Tầng thứ ba về cơ bản là chương trình thực hiện các lời gọi hàm để tìm kiếm dữ liệu cần thiết. Dữ liệu này có thể bao gồm bất kỳ nguồn thông tin nào, bao gồm cơ sở dữ liệu như Oracale, SQL Server hoặc tài liệu XML.
2.3.2.3. Client/server n-tầng
Kiến trúc n-tầng[22] được chia thành các tầng như sau:
- Tầng giao diện người dùng: quản lý tương tác của người dùng với ứng dụng
- Tầng logic trình diễn: Xác định cách thức hiển thị giao diện người dùng và các yêu cầu của người dùng được quản lý như thế nào.
- Tầng logic tác nghiệp: Mô hình hóa các quy tắc tác nghiệp.
- Tầng các dịch vụ hạ tầng: Cung cấp một chức năng bổ trợ cần thiết cho ứng dụng như các thành phần (truyền thông điệp, hỗ trợ giao tác).
2.4. Công nghệ dịch thuật Google Translate
2.4.1. Xử lý ngôn ngữ tự nhiên
Xử lý ngôn ngữ tự nhiên (natural language processing - NLP)[1,20] là một nhánh con trong lĩnh vực trí tuệ nhân tạo, với mục đích tập trung vào các ứng dụng trên ngôn ngữ của con người. Xử lý ngôn ngữ tự nhiên là một trong những phần khó nhất trong lĩnh vực trí tuệ nhân tạo vì nó liên quan đến việc phải hiểu ý nghĩa ngôn ngữ - là công cụ của con người trong tư duy và giao tiếp. Trong xử lý ngôn ngữ tự nhiên thường có các bước xử lý sau, tuy nhiên khó có thể tách bạch từng bước mà phải dựa vào ngữ cảnh cụ thể để có thể tiến hành một hoặc nhiều bước cùng lúc:
- Phân tích hình thái: Trong bước này từng từ sẽ được phân tích và các ký tự không phải chữ (như các dấu câu) sẽ được tách ra khỏi các từ.
- Phân tích cú pháp: Dãy các từ sẽ được biến đổi thành các cấu trúc thể hiện sự liên kết giữa các từ này. Sẽ có những dãy từ bị loại do vi phạm các luật văn phạm.
- Phân tích ngữ nghĩa: Thêm ngữ nghĩa vào các cấu trúc được tạo ra bởi bộ phân tích cú pháp.
- Tích hợp văn bản: Ngữ nghĩa của một câu riêng biệt có thể phụ thuộc vào những câu đứng trước, đồng thời nó cũng có thể ảnh hưởng đến các câu phía sau.
- Phân tích thực nghĩa: Cấu trúc thể hiện điều được phát ngôn sẽ được thông dịch lại để xác định nó thật sự có nghĩa là gì.
Xử lý ngôn ngữ tự nhiên được ứng dụng trên rất nhiều lĩnh vực khác nhau, có thể kể đến một số bài toán tiêu biểu sau:
- Nhận dạng chữ viết: Có hai kiểu nhận dạng chữ viết phổ biến là nhận dạng chữ in (ví dụ chữ trên sách báo) và phức tạp hơn nhiều là nhận dạng