-
Ngôn ngữ lập trình
Ngôn ngữ lập trình chính thức của Android là Java. Mặc dù các ứng dụng trên Android được phát triển dựa trên nền tảng Java, nhưng Android không hỗ J2ME và J2SE, là hai ngôn ngữ lập trình phổ dụng cho các thiết bị di động.
Dựa trên máy ảo Java của Sun, Google đã tinh chỉnh và phát triển nên máy ảo Dalvik để biên dịch mã Java với tốc độ biên dịch nhanh hơn và nhẹ hơn. Đến phiên bản Froyo 2.2, Android đã hỗ trợ Just-in-time Compiler (JIT) làm tăng tốc độ biên dịch Java lên gấp 2-5 lần so với các phiên bản trước.
Hình 4 - Biểu đồ so sánh tốc độ của máy ảo Java giữa các phiên bản Android (Càng lớn càng tốt)
Bằng cách sử dụng các frameworks của hãng thứ ba (VD: PhoneGap, Titanium,...), các nhà lập trình web cũng có thể phát triển ứng dụng Android một cách dễ dàng bằng các ngôn ngữ web phổ dụng như HTML, CSS, Javascript. Tuy nhiên số lượng các ứng dụng đi theo chiều hướng này chưa nhiều.
Ngoài ra các ứng dụng của Android sử dụng SQLite để quản lý cơ sở dữ liệu.
-
Một số lưu ý
-
Vấn đề phân mảnh phiên bản Android trên thị trường:
Do Android là hệ điều hành mã nguồn mở và miễn phí, bất kỳ một nhà sản xuất phần cứng nào cũng có thể sử dụng và tùy biến Android để cài đặt trên các thiết bị của mình. Điều này dẫn đến vấn để phân mảnh (fragmentation) khi trên thị trường tồn tại nhiều mẫu điện thoại Android, mỗi mẫu chạy một phiên bản Android khác nhau. Đôi khi các phiên bản Android này còn khác nhau về giao diện hay chức năng, do các nhà sản xuất tự chế thêm vào mã nguồn của Android. Một ví dụ tiêu biểu chính là giao diện Sense UI của HTC.
Hình 5 - So sánh giao diện nguyên bản của Android và giao diện Sense của riêng hãng HTC thiết kế
Mặt khác, do việc cập nhật hệ điều hành phụ thuộc hoàn toàn vào các nhà sản xuất, thế nên sau khi Google công bố phiên bản Android mới , người sẽ buộc phải chờ khá lâu mới được cập nhật.
Do vấn đề phân mảnh này, trên thị trường một lúc tốn tại nhiều phiên bản Android khác nhau, và người phát triển ứng dụng Android buộc phải xem xét đến khả năng ứng dụng do mình viết ra có thể sẽ không chạy đuợc hay thiếu di một số chức năng quan trọng khi chaỵ trên các máy chạy phiên bản Android cũ. Một ví dụ tiêu biểu là ứng dụng chính thức của mạng xã hội Twitter chỉ có thể chạy trên phiên bản Android 2.1, tức có 1/2 thị trường người dùng điện thoại Android không thể sử dụng ứng dụng này.
Hình 6 - Thống kê số lượng điện thoại sử dụng các phiên bản Android
(Nguồn -http://developer.android.com/resources/dashboard/platform-versions.html – T12/2010)
-
Vấn đề kích thước màn hình
Một lần nữa, do trên thị trường có rất nhiều nhà sản xuất điện thoại Android, và mặc dù Google yêu cầu tất cả mọi điện thoại Android phải đáp ứng 1 số tiêu chí chung về phần cứng (màn hình cảm ứng, GPS, 3G,...), các nhà sản xuất hoàn toàn tự do quyết định kích cỡ và độ phân giải điện thoại.
Như vậy, các nhà phát triển ứng dụng Android phải chuẩn bị trước khả năng ứng dụng của mình sẽ chạy trên một loạt các kích cỡ màn hình lớn nhỏ khácnhau.
Tuy nhiên, có một điều chắc chắn: 100% các điện thoại Android đều sử dụng màn hình cảm ứng đa điểm, còn bàn phím vật lý hay cảm ứng quang thì tùy máy. Dưới đây là bảng chứa thông số các kích thước màn hình của các thiết bị sử dụng Android tiêu biểu:
Hình 7 - Bảng thống kê các kiểu màn hình điện thoại Android
(Nguồn: slides thuyết trình giới thiệu Android – Hội thảo Google I/O T6/2010)
-
Môi trường lập trình cho Android
Android SDK bao gồm các công cụ riêng lẻ như: debugger, các thư viện, trình giả lập điện thoại Android, các tài liệu hỗ trợ và code mẫu. Hiện Android cung cấp bộ công cụ này trên nhiều nền tảng hệ điều hành khác nhau (Windows, Linux, Mac,...), miễn là có sẵn Java Development Kit, Apache Ant và Python2.2 trở lên.
Môi trường lập trình (IDE) chính thức của Android là Eclipse (từ phiên bản 3.2) với sự hỗ trợ của plugin Android Development Tools (ADT). Tuy nhiên, người lập trình có thể sử dụng bất kỳ 1 IDE hay trình soạn thảo văn bản nào để viết code Java và XML rồi biên dịch nên ứng dụng hoàn chỉnh bằng cách sử dụng dòng lệnh (command lines).
Ứng dụng Android được đóng gói thành các file .apk và đuợc lưu trong thư mục /data/app của hệ điều hành Android.Java Development Kit (JDK) 5.0.
Một số công cụ hỗ trợ lập trình Android tiêu biểu:
-
SQLite Manager: Là một addon của Firefox giúp quản lí cơ sở dữ liệu SQLite của Android.
-
DroidDraw: Giúp thiết kế file XML giao diện ứng dụng.
-
Balsamiq Mockups và AdobeFireworks: Giúp nhanh chóng phác thảo ý tưởng và giao diện sơ bộ của ứng dụng.
-
StarUML: Vẽ các lược đồ UML hỗ trợ phân tích thiết kế.
-
Các thành phần cơ bản của một project Android trên Eclipse
Hình 8 - Cấu trúc thư mục và file của một dự án phần mềm Android trên Eclipse
AndroidManifest.xml: file XML mô tả ứng dụng và các thành phần đuợc cung cấp bởi ứng dụng (activities, services,...).
build.xml: Một file chứa mã script Ant (ant.apache.com) nhằm compile và cài đặt ứng dụng lên máy.
default.properties: file property tạo bởi script Ant trên.
bin/ : nơi chứa ứng dụng sau khi được compile.
bin/classes/ : chứa các lớp Java đã được compile.
bin/classes.dex : chứa các file executable tạo bởi các lớp Java.
bin/yourapp.ap_ : chứa các tài nguyên của ứng dụng, đóng gói thành 1 file zip.
bin/yourapp-debug.apk hay bin/yourapp-unsigned.apk : chứa chính ứngdụng Android của ta.
libs/ : nơi chứa các file Java JAR ứng dụng yêu cầu (third party).
src/ : nơi chứa mã nguồn Java của ứng dụng.
res/ : chứa các tài nguyên của ứng dụng, như các icons, GUI layouts,...
res/drawable/ : chứa file hình ảnh (PNG, JPEG,...).
res/layout/ : chứa UI layout, dưới dạng XML.
res/menu/ : chi tiết các menu, dưới dạng XML.
res/raw/ : chứa các file khác (CSV chứa thông tin account,...).
res/values/ : chứa các strings, dimensions,...
res/zml/ : chứa các file XML khác cần cho ứng dụng.
assets/ : nơi chứa các files tĩnh (static) được yêu cầu đi kèm với ứng dụng.
-
File AndroidManifest.xml
Là nền tảng của mọi ứng dụng Android, file AndroidManifest.xml được đặt trong thư mục root và cho biết những thành phần có trong ứng dụng của: các activities, các services,...cũng như cách các thành phần ấy gắn bó với nhau.
Mỗi file manifest đều bắt đầu với một thẻ manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android.search">
...
</manifest>
Khi tạo file manifest, điều quan trọng nhất là phải cung cấp thuộc tính của package, tức tên của Java package dùng làm cơ sở cho ứng dụng của ta. Sau khi đã đặt tên package, sau này khi cần ghi tên lớp trong file manifest, ta có thể rút ngắn, chẳng hạn với lớp “com.yourapp.android.search.Someclass” ta chỉ cần ghi “.Someclass” là đủ.
Các thành phần manifest khác là :
-
uses-persmission: chỉ định các quyền mà ứng dụng của ta đuợc cấp để hoạt động trôi chảy (như đã nói, các ứng dụng Android nằm dưới nhiều lớp bảo mật khác nhau).
-
permission: chỉ định các quyền mà các activities hay services yêu cầu các ứng dụng khác phaỉ có mới được truy cập dữ liệu của ứng dụng của ta.
-
instrumentation: chỉ định phần code cần được gọi khi xảy ra những sự kiện quan trọng (chẳng hạn khởi động activities) nhằm phục vụ việc ghi chú (logging) và tra soát (monitoring)
-
uses-library: nhằm kết nối với các thành phần có sẵn của Android (như service tra bản đồ,...)
-
uses-sdk: có thể có hoặc không, chỉ ra phiên bản củaAndroid mà ứng dụng này yêu cầu.
-
application: định nghĩa phần trung tâm của ứng dụng của file manifest.
Ví dụ file AndroidManifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android">
<uses-permission
android:name="android.permission.ACCESS_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_GPS" />
<uses-permission
android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission
android:name="android.permission.ACCESS_CELL_ID" />
<application>
...
</application>
</manifest>
Tất nhiên, phần quan trọng của 1 file manifest chính là thành phần application. Mặc định, khi ta tạo 1 project Android mới, ta có sẵn 1 thành phần activity:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android.skeleton">
<application>
<activity android:name=".Now" android:label="Now">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Thành phần này cung cấp các thông tin sau
android:name : tên class hiện thực activity này.
android:label : tên activity.
intent-filter : Một thành phần con, chỉ ra dưới điều kiện nào thì activity này được hiển thị.