Vài nét về quá trình ra đời
Ngày nay, điện thoại di động hiện diện ở khắp mọi nơi. Một người có thể không có máy vi tính nhưng gần như không thể không có điện thoại di động. Điện thoại di động ngày càng thông minh và chúng đang dần thay thế các thiết bị di động cá nhân khác như: đồng hồ, máy tính cầm tay, máy ảnh du lịch, máy nghe nhạc MP3, hoặc các thiết bị có khả năng kết nối internet khác. Rõ ràng thị trường di động là một miếng bánh khổng lồ mà không ai có thể một mình nuốt gọn. Các nhà phát triển cũng cảm thấy sức hấp dẫn mà miếng bánh tỏa ra. Nhưng việc phát triển phần mềm cho các thiết bị di động chưa bao giờ là công việc đơn giản. Có hàng loạt các vấn đề mà các nhà phát triển phần mềm cho thiết bi di động trước kia phải đối mặt:
- Không có mã nguồn của các nền tảng để giúp họ hình dung ra được cơ chế hoạt động đằng sau đó.
- Giá thành để phát triển một sản phẩm cao do phải trả phí mua bản quyền API hoặc công cụ phát triển.
- Vướng phải những ràng buộc hoặc giới hạn nhất định về tính năng khi phát triển kể cả khi họ có giấy phép phát triển.
- Không có một bộ công cụ phát triển (SDK) nào thực sự dễ dàng cho việc xây dựng ứng dụng di động.
- Không có một cơ chế phân phối sản phẩm hiệu quả đến người dùng cuối cũng như cách thức cài đặt phần mềm đơn giản lên thiết bị của họ.
Vậy chúng ta cần những gì để tạo ra một thiết bị di động tốt hơn, chi phí phát triển rẻ hơn và tạo ra nhiều lợi ích cho người dùng hơn? Đó chính là câu hỏi mà liên minh Open Handset Alliance gồm trên 40 hãng từ nhiều lĩnh vực liên quan do Google khởi sướng muốn giải đáp. Và câu trả lời của họ chính là hệ sinh thái Android.
Hình 1: Các thành viên trong liên minh OHA
Vào tháng 10-2008, thiết bị đầu tiên chạy Android được Google và HTC phối hợp phát triển đã ra đời với tên gọi G1. Từ đó đến nay, Android đã trải qua nhiều phiên bản với nhiều cải tiến, đã có vô số các thiết bị chạy nền tảng này được tung ra thị trường với mức độ đa dạng chưa từng thấy. Hiện Samsung đang là hãng sản xuất và phân phối hàng đầu các thiết bị chạy Android trên toàn cầu.
Nền tảng Android về cơ bản đáp ứng được những đòi hỏi của OHA:
- Đó là một nền tảng mở vì vậy các nhà phát triển dễ dàng đào sâu tìm hiểu cũng như dễ dàng tạo ra những thành phần tích hợp hoặc tùy biến cho nó.
- Ngoài ra cộng đồng phát triển Android còn được hỗ trợ bộ công cụ phát triển (SDK) hoàn chỉnh và dễ sử dụng.
- Kênh phân phối sản phẩm đến tay người sử dụng rất phong phú cả về phần cứng lẫn phần mềm.
Để đạt được những điều đó yêu cầu Android phải có một kiến trúc mềm dẻo, khai thác được tối đa sức mạnh phần cứng cũng như sự thân thiện trong giao diện người dùng. Tuy vậy, Android không phải là không có những nhược điểm so với những nền tảng cạnh tranh khác, tuy nhiên trong phạm vi bài viết này ta sẽ chỉ mô tả bức tranh về Android như là nó vốn thế.
Nền tảng Android
Android được phát triển dựa trên nhân của Linux nên kế thừa được khả năng quản lý tài nguyên tốt từ hệ thống này. Toàn bộ các ứng dụng được thực thi bởi Dalvik VM, một máy ảo tượng tự như JVM nhưng đã được tối ưu cho thiết bị di động. Các ứng dụng được phát triển trên một framework linh hoạt giúp khai thác các tài nguyên của hệ thống. Hình dưới đây cho thấy bức tranh khái quát về các khối phần mềm trong toàn bộ nền tảng Android.
Hình 2: Các khối cơ bản trong nền tảng Android
Điểm đặc biệt đối với các ứng dụng Android là chúng được phát triển trên cùng một cấp, do vậy khái niệm phần mềm hệ thống và phần mềm thông thường chỉ mang tính chất tương đối. Bất cứ một ứng dụng hệ thống cơ bản nào (như ứng dụng gọi điện, nhắn tin, trình duyệt v.v…) cũng có thể bị thay thế bằng các ứng dụng khác tương tự.
Ngôn ngữ phát triển và cách thức biên dịch
Ngôn ngữ lập trình chính để viết các ứng dụng Android là Java, vì vậy nếu bạn có hứng thú phát triển ứng dụng cho nền tảng này thì hãy đầu tư thời gian vào Java căn bản trước khi bắt tay vào nghiên cứu nó.
Các ứng dụng Android có thể được phân làm hai loại căn cứ vào ngôn ngữ phát triển và cách thức biên dịch:
- Ứng dụng Dalvik: ứng dụng được viết bằng ngôn ngữ lập trình Java, sử dụng các công cụ trong bộ SDK (Google) và JDK (Oracle) biên dịch và đóng gói thành file .apk trước khi cài đặt vào thiết bị.
Hình 4: Quá trình biên dịch từ mã nguồn Java của loại ứng dụng Dalvik
- Ứng dụng Native: bên cạnh sử dụng mã nguồn Java, ta có thể sử dụng mã nguồn C/C++ kết hợp để xây dựng ứng dụng nhằm tối ưu hóa và tăng tốc độ thực thi hoặc khai thác các thư viện cấp thấp. Để biên dịch được ứng dụng loại này ngoài bộ SDK bạn phải cần thêm bộ NDK.
Hình 5: Quá trình biên dịch của ứng dụng Native
Mặc dù các ứng dụng Android được phát triển và biên dịch thông qua JDK nhưng không phải tất cả mọi thứ trong JDK đều có thể sử dụng được. Dưới đây là hình ảnh tham khảo về API trong JDK và mức độ được sử dụng trong Android:
Hình 6: Một phần Core Java trong Android
Kiến trúc ứng dụng
Ứng dụng Android được xây dựng từ nhiều thành phần có thể coi là những viên gạch cơ bản trong ứng dụng. Những viên gạch này bao gồm nhiều loại có thể chia thành ba nhóm căn cứ vào mục đích sử dụng:
- Những thành phần tạo giao diện người dùng: Activity, View/Widget
- Những thành phần cung cấp dịch vụ và tích hợp: Service, Broadcast Receiver/Intent.
- Những thành phần cung cấp dữ liệu, tài nguyên và cấu hình của ứng dụng: Content Provider, Resource, ApplicationManifest.
Hình 7: Các thành phần cơ bản trong một ứng dụng Android
1. Những thành phần tạo giao diện người dùng
- Activity: đây chính là không gian cửa sổ nơi mà mọi thứ được hiển thị ra. Tuy nhiên trên màn hình nhỏ thì mỗi Activity sẽ chiếm trọn màn hình thiết bị, người dùng có thể di chuyển qua lại giữa các Activity thông qua thao tác điều hướng. Về mặt kiến trúc Activity tương đương với ViewModel trong kiến trúc MVVM (Model – View – ViewModel) rất quen thuộc trong các nền tảng lập trình khác như Windows Phone, WPF, JavaFX v.v… Với kiến trúc như vậy mỗi Activity được kết hợp với một Layout mô tả bố cục và các thành phần hiển thị trên đó (các View). Những mô tả này sử dụng ngôn ngữ XML và được đặt trong thư mục /res (xem hình 10).
- View: đây là các thành phần hiển thị trên Activity như Button, CheckBox v.v… nó được thiết kế theo mô hình Composite giống như tất cả các hệ thống GUI khác. Sơ đồ sau đây thể hiện các lớp cơ bản để dựng giao diện trong Android:
Hình 8: Sơ đồ phân cấp của View
- Widget: về bản chất đây là một ViewGroup, có khả năng hiển thị trên màn hình Home các thành phần cơ bản trong hệ thống View. Nhưng sự khác biệt này làm cho màn hình Home của Android trở nên rất sinh động và hữu dụng.
Hình 9: Hình ảnh về các widget trên màn hình Home
2. Những thành phần cung cấp dịch vụ và tích hợp
Android cung cấp một loại các thành phần nghiệp vụ cho phép các nhà phát triển khai thác các tính năng phần cứng cũng như các dịch vụ cơ bản của hệ thống để tạo nên những ứng dụng phong phú. Có thể chỉ ra một số thành phần cơ bản như:
- Service: lập trình viên có thể khai thác các dịch vụ có sẵn hoặc tạo ra các dịch vụ chạy ngầm định khác trong hệ thống. Các dịch vụ này có thể được truy cập từ bất cứ ứng dụng nào.
- Broadcast Receiver: đây là thành phần thú vị giúp ứng dụng của bạn có khả năng phản ứng lại với các sự kiện trong hệ thống hoặc liên quan đến việc xử lý một dữ liệu nào đó. Nhờ nó các ứng dụng trong Android tạo nên một môi trường ứng dụng thống nhất, người dùng thay vì có cảm giác “đang chạy một ứng dụng để làm việc gì đó” sẽ thấy rằng mình “đang làm một việc gì đó trong ngữ cảnh với một ứng dụng phù hợp”.
- Intent: đây là thành phần cơ bản trong cơ chế quản lý giao tiếp của Android, nó cho phép chuyển đổi, truyền và nhận thông điệp giữa các Activity.
3. Những thành phần cung cấp dữ liệu, tài nguyên và cấu hình ứng dụng
- Content Provider: có thể hình dung Content Provider giống như một database server thu nhỏ cung cấp khả năng truy vấn vào các nguồn dữ liệu khác nhau (phổ biến là SQLite) thông qua một URI (ví dụ như các dữ liệu Contact, Message v.v…). Kết quả truy vấn của Content Provider luôn trả về đối tượng Cursor (có thể hình dung nó như là ResultSet trong JDBC).
- Resource: tài nguyên có thể sử dụng trong ứng dụng rất phong phú bao gồm hình ảnh, âm thanh, văn bản, văn bản đa ngôn ngữ, layout, xml v.v… tất cả chúng nằm trong thư mục /res. Mọi thứ trong /res không đơn giản chỉ là một phần được đóng gói đi cùng ứng dụng mà chúng có thể được thao tác và truy xuất từ trong code một cách dễ dàng ở thời điểm chạy cũng như khi đang biên địch (thông qua một lớp được sinh tự động nhằm tối ưu hóa việc truy xuất tài nguyên có tên là R.java).
- AndroidManifest.xml: đây là file cấu hình cho mỗi ứng dụng android, nó chứa các thông tin cơ bản của ứng dụng cho hệ điều hành như điểm truy xuất, các quyền hạn, các thông tin cài đặt, cấu hình v.v…
Hình 10: Cấu trúc của một Android Project trong Eclipse
Bắt đầu khám phá
Bài viết đến đây mới chỉ là sự khởi đầu, ta vừa nhìn xuống “thành phố Android” từ trên máy bay, khi đó ta chỉ cảm nhận được những mảng, khối cơ bản mà không thấy chi tiết. Nhưng hy vọng với từng đó đã giúp bạn định vị được rằng để tiếp tục cuộc hành trình khám phá “thành phố” này bạn nên bắt đầu từ đâu và như thế nào. Chúc các bạn có một chuyến đi vui vẻ!
Nguyễn Ngọc Tú
Tài nguyên
ebook: Android In Practice by Charlie Collins & Michael Galpin & Matthias Kaeppler
http://www.ibm.com/developerworks/library/os-android-devel/
http://software.intel.com/en-us/articles/android-application-development-and-optimization-on-the-intel-atom-platform
http://vladnevzorov.com/2011/04/30/android-application-architecture-part-ii-architectural-styles-and-patterns/
http://apcmag.com/whats-android.htm
https://vkroz.wordpress.com/category/android/