Khóa luận này tôi trình bày tổng quan về Android, kiến trúc Android, AndroidSDK, Android NDK, các thành phần tạo nên một ứng dụng Android và trình bày haiphương pháp phát hiện khuôn mặt
Trang 2ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Cán bộ hướng dẫn: TS Nguyễn Linh Trung
Cán bộ đồng hướng dẫn: TS Nguyễn Thái Hà
HÀ NỘI - 2011
Trang 3VIETNAM NATIONAL UNIVERSITY, HANOI UNIVERSITY OF ENGINEERING AND TECHNOLOGY
Tran Thi Hop
ANDROID OPERATING SYSTEM AND IMPLEMENTATION OF FACE DETECTION
APPLICATION ON ANDROID
Major: Faculty of Electronics and Telecommunications
Supervisor: Ph.D Nguyen Linh Trung
Co-Supervisor: Ph.D Nguyen Thai Ha
HÀ NỘI-2011
Trang 4LỜI CẢM ƠN
Để hoàn thành khóa luận này, em đã nhận được sự giúp đỡ nhiệt tình của TS Nguyễn Linh Trung, TS Nguyễn Thái Hà và các anh chị bên công ty Techburg, Hà Nội.
Trước hết em xin bày tỏ lòng biết ơn sâu sắc tới TS Nguyễn Linh Trung, Giảng viên khoa Điện Tử Viễn Thông, Trường Đại học Công Nghệ, ĐHQG Hà Nội, người đã hướng dẫn và chỉ bảo nhiệt tình cho em trong suốt quá trình học, nghiên cứu và hoàn thành khóa luận.
Em xin trân trọng cảm ơn sự nhiệt tình hướng dẫn và giúp đỡ tận tình của TS Nguyễn Thái Hà, Tổng giám đốc Công ty Techburg và các anh chị thuộc công ty đã nhiệt tình giúp đỡ và tạo điều kiện cho em học tập và hoàn thành khóa luận này Cuối cùng, em xin gửi lời biết ơn tới gia đình và bạn bè đã giúp đỡ và động viên em rất nhiều để em có thể hoàn thành khóa luận này Đặc biệt là gia đình, nơi
đã sinh thành, nuôi dưỡng và động viên em rất nhiều trong thời gian qua.
Hà Nội , ngày 20 tháng 5 năm 2011
Sinh viên:
Trần Thị Hợp
Trang 5TÓM TẮT
Android là hệ điều hành cho thiết bị di động được phát triển bởi Google Androiddựa trên nhân Linux 2.6 và các ứng dụng Android được viết bằng ngôn ngữ lập trìnhJava Khóa luận này tôi trình bày tổng quan về Android, kiến trúc Android, AndroidSDK, Android NDK, các thành phần tạo nên một ứng dụng Android và trình bày haiphương pháp phát hiện khuôn mặt sử dụng thư viện OpenCV và framework API củaAndroid Đồng thời khóa luận cũng trình bày sự khác nhau giữa máy ảo Java và máy
ảo Dalvik Dalvik là máy ảo thực thi các ứng dụng Android
Trong khóa luận này tôi trình bày quy trình xây dựng và thực thi một ứng dụngvới Android NDK Quy trình này sẽ được sử dụng để xây dựng ứng dụng phát hiệnkhuôn mặt sử dụng OpenCV OpenCV là một thư viện hỗ trợ cho xử lý ảnh do Intelphát triển, bao gồm khoảng 500 hàm viết bằng các ngôn ngữ C và C++ Để sử dụngđược thư viện này thì đầu tiên phải porting được thư viện OpenCV vào Android Khóaluận cũng trình bày cách porting thư viện và trình bày thuật toán phát hiện khuôn mặt
do Viola và Jones đưa ra Để sử dụng thư viện OpenCV thì cần một giao diện đểchương trình ứng dụng Android viết bằng Java có thể gọi được các hàm viết bằngC/C++ của OpenCV Giao diện đó là JNI (Java Native Interface) Trong khóa luận tôicũng đưa ra một demo với “Hello World” sử dụng Android NDK mà có hỗ trợ JNI
Từ đó đưa được giải pháp để phát triển ứng dụng phát hiện khuôn mặt sử dụngOpenCV
Phương pháp thứ hai để phát hiện khuôn mặt là sử dụng framework API củaAndroid API là giao diện lập trình ứng dụng (Application Programming Interface).Android cung cấp một framework API bao gồm các gói và các lớp giúp cho các nhàphát triển có thể sử dụng để phát triển nhiều ứng dụng hấp dẫn Khóa luận trình bày vềcác gói và các lớp sử dụng framework API của Android để xây dựng ứng dụng pháthiện khuôn mặt trên Android và khóa luận đưa ra được kết quả khi tiến hành thựcnghiệm Với phương pháp này chỉ cần có kỹ năng lập trình Java tốt là có thể xây dựngđược ứng dụng
Trang 6LỜI CAM ĐOAN
Tôi xin cam đoan đề tài “Hệ điều hành Android và thực thi ứng dụng phát hiện
khuôn mặt trên Android ” là kết quả tìm hiểu của riêng tôi với sự hướng dẫn của TS Nguyễn Linh Trung và TS Nguyễn Thái Hà Trong khóa luận có sử dụng một số tài
liệu và kết quả nghiên cứu như đã nêu trong phần tài liệu tham khảo Các kết quả, sốliệu sử dụng trong khóa luận là chính xác và trung thực
Khóa luận được hoàn thành trong thời gian tôi là sinh viên tại Bộ môn thông tin
vô tuyến, Khoa điện tử viễn thông, Trường Đại học Công Nghệ, ĐHQG Hà Nội
Hà Nội, ngày 20 tháng 5 năm 2011
Sinh viên:
Trần Thị Hợp
Trang 71.7 Porting OpenCV vào Android 10
1.8 Các thành phần tạo nên một ứng dụng Android 11
1.9 Phát triển ứng dụng Android và DVM 18
1.10 Tạo và demo ứng dụng “Hello World” sử dụng Android NDK 19
CHƯƠNG 2 CÁC PHƯƠNG PHÁP PHÁT HIỆN KHUÔN MẶT TRÊN ANDROID
………26
2.1 Thuật toán của Viola – Jones trong OpenCV 26
2.1.1 Đặc trưng Haar-like 26
2.1.2 AdaBoost……… 27
2.1.3 Mô hình phát hiện khuôn mặt 29
2.2 Phát hiện khuôn mặt sử dụng framework API của Android 30
Trang 82.3.1.Mô hình phát hiện khuôn mặt trên Android sử dụng framework API 352.3.2.Viết chương trình ứng dụng phát hiện khuôn mặt trên Android 39
CHƯƠNG 3 KẾT QUẢ ĐẠT ĐƯỢC 47
3.1 Kết quả phát hiện khuôn mặt sử dụng framework API của Android 473.2 Khó khăn và hướng giải quyết 48
KẾT LUẬN 49
TÀI LIỆU THAM KHẢO 50
Trang 9Danh sách hình vẽ
Hình 1 Qúa trình thực thi ứng dụng Java và ứng dụng Android 1
Hình 2.Qúa trình biến đổi file mã Java thành file (.dex) 2
Hình 3.Kiến trúc Android 2
Hình 4.Android Emulator 5
Hình 5.Các ứng dụng Android trong API Demos 7
Hình 6.Vai trò của JNI 9
Hình 7.Mô hình xây dựng và chạy code JNI 9
Hình 8.Mô hình porting OpenCV vào Android 10
Hình 9.Qúa trình porting OpenCV vào Android 11
Hình 10.Ngăn xếp Activity 12
Hình 11.Chu kỳ sống của Activity 13
Hình 12.Chu kỳ sống của Service 16
Hình 13.Truyền thông giữa hai tiến trình 16
Hình 14.Broadcast receiver 16
Hình 15.Content Provider 17
Hình 16.Ứng dụng Contacts sử dụng Contacts Provider để lấy dữ liệu 17
Hình 17.Intent 18
Hình 18.Qúa trình tạo file APK 19
Hình 19.Quá trình truy cập mã gốc qua JNI 20
Hình 20.Demo ứng dụng Hello World dùng Android NDK 25
Hình 21.Các đặc trưng Haar-like cơ bản 26
Hình 22.Các đặc trưng Haar-like mở rộng 26
Hình 23.Cách tính Integral Image 27
Hình 24.Ví dụ cách tính nhanh các giá trị mức xám 27
Hình 25.Mô hình cascade kết hợp với các bộ phân loại yếu 28
Trang 10Hình 26.Kết hợp các bộ phân loại yếu thành bộ phân loại mạnh 29
Hình 27 Hệ thống phát hiện khuôn mặt 29
Hình 28.Các gói Android cung cấp trong framework API 35
Hình 29.Mô hình phát hiện khuôn mặt trên Androi 35
Hình 30.Các góc Euler- hệ tọa độ xyz (cố định), hệ tọa độ XYZ (quay) 36
Hình 31.Các thành phần trong một Android Project 39
Hình 32 Các tệp trong thư mục bin của Android Project 45
Hình 33.Hình ảnh gốc ban đầu 47
Hình 34.Kết quả phát hiện khuôn mặt trên Android 47
Trang 11THUẬT NGỮ VIẾT TẮT SỬ DỤNG TRONG BÀI
ADB Android Debug Bridge
ADT Android Development Tools
AVD Android Virtual Devices
API Application Programming Interface BSD Berkeley Software Distribution
DVM Dalvik Virtual Machine
GPS Global Positioning System
JNI Java Native Interface
JVM Java Virtual Machine
NDK Native Development Kit
OS Operating System
OpenCV OpenSource Computer Vision
SDK Software Development Kit
UI User Interface
VM Virtual Machine
Trang 12LỜI MỞ ĐẦU
Android là một hệ điều hành cho điện thoại di động do Google phát triển dựa trênnền tảng Linux 2.6 Android đang từng bước thống trị thị trường di động nhờ vàonhững ưu điểm vượt trội của nó Không như iPhone của Apple người dùng dường như
bị cột chặt với những gì hãng này cho phép thì Android được kế thừa tính mở từ Linuxhay nói cụ thể hơn là Google và Android mang đến một thế giới hoàn toàn mở Ngườidùng được tự do với những gì họ muốn và các nhà phát triển có được sự tự do hơn đểtạo ra các ứng dụng Ngoài ra với Android người tiêu dùng có thể có nhiều sự lựachọn Chẳng hạn như hãng LG tung ra trên thị trường 20 sản phẩm chạy nền Androidnăm 2010 Bên cạnh các tính năng đó thì Android sẽ từng bước thống trị thị trường diđộng nhờ vào ưu điểm hướng đến người dùng và với thương hiệu của Google đứngsau lưng nó Đây là một thương hiệu đáng giá
Hiện nay Android không chỉ được dùng cho điện thoại di động mà còn được cácnhà sản xuất điện tử trên thế giới sử dụng Android như là một nền tảng cho các sảnphẩm nhúng, ví dụ như nhà thông minh, hệ thống thông tin giải trí ô tô, … Ngoài ratrong tương lai Google sẽ sớm tung ra một hệ điều hành cho tivi, đầu thu kỹ thuật số(set-top-box)
Trong khóa luận này tôi sẽ trình bày tổng quan về hệ điều hành Android và trìnhbày hai hướng để phát triển ứng dụng phát hiện khuôn mặt trên Android đó là sử dụngOpenCV và framework API của Android OpenCV là một thư viện hỗ trợ mạnh cho
xử lý ảnh do Intel phát triển bao gồm các hàm được viết bằng ngôn ngữ C và C++trong đó có hỗ trợ phát hiện khuôn mặt Thuật toán phát hiện khuôn mặt của Viola –Jones được đưa vào OpenCV vì với tốc độ gấp 15 lần so với các thuật toán hiện tại [7].Hướng thứ hai tôi sẽ trình bày trong khóa luận để xây dựng một ứng dụng phát hiệnkhuôn mặt với framework API của Android API là giao diện lập trình ứng dụng, viếttắt của Application Programming Interface Nền tảng Android cung cấp mộtframework API mà các ứng dụng có thể tương tác với hệ thống Android FrameworkAPI bao gồm một lõi thiết lập các gói và các lớp Trong ứng dụng phát hiện khuôn mặttôi sử dụng lớp FaceDetector trong gói android.media của framework API do Androidcung cấp để xây dựng ứng dụng Với hướng thứ hai này chỉ cần kỹ năng lập trình Javatốt là có thể xây dựng được ứng dụng
Nội dung của khóa luận gồm 3 chương:
Trang 13Chương 1: Trình bày tổng quan về hệ điều hành Android, kiến trúc Android,
Android SDK, Android NDK, porting OpenCV vào Android và quy trình xây dựng vàthực thi một ứng dụng Android Bản chất của việc Porting OpenCV vào Android làthêm một thư viện chia sẻ vào tầng thư viện của Android để từ đó có thể dùng thư việnnày để phát triển nhiều ứng dụng khác không chỉ là phát hiện khuôn mặt Chẳng hạnnhư dùng OpenCV có thể phát triển thêm các ứng dụng phân tích chuyển động, nhậndạng khuôn mặt Chương này cũng đưa ra sự khác nhau giữa máy ảo Java và máy ảoDalvik Dalvik là máy ảo để thực thi các ứng dụng Android
Chương 2: Trình bày hai phương pháp phát hiện khuôn mặt trên Android sử
dụng OpenCV và framework API của Android trong tầng applications framework củakiến trúc Android Trong chương này tôi sẽ trình bày thuật toán của Viola – Jones sửdụng trong OpenCV và xây dựng chương trình phát hiện khuôn mặt với frameworkAPI của Android
Chương 3: Trình bày các kết quả đạt được và những khó khăn gặp phải từ đó
đưa ra hướng giải quyết khó khăn
Trang 14CHƯƠNG 1 HỆ ĐIỀU HÀNH ANDROID
1.1.Android là gì?
Android là một ngăn xếp phần mềm cho các thiết bị di động bao gồm một hệđiều hành, middleware và các ứng dụng khóa được phát triển bởi Google Androidđược dựa trên nhân Linux 2.6 và các ứng dụng cho Android sử dụng ngôn ngữ lậptrình Java
Android là một hệ điều hành mã nguồn mở, các nhà phát triển có thể tạo ra cácứng dụng cho Android và bất kỳ ai cũng có thể lấy và sửa đổi theo ý thích Tuynhiên các thiết bị Android cũng chứa một số phần mềm độc quyền mà các nhà pháttriển không thể tiếp cận được những phần mềm này Ví dụ: hệ thống định vị toàncầu (GPS) Android cũng hỗ trợ nhiều tính năng như: Wi-fi, Bluetooth, các mạng3G và 4G, …
1.2.Máy ảo Dalvik
Dalvik là máy ảo để thực thi các ứng dụng Android Dalvik chạy các file ởđịnh dạng (.dex) Từ góc nhìn của một nhà phát triển Dalvik giống như máy ảo Javanhưng thực tế thì hoàn toàn khác Khi các nhà phát triển viết một ứng dụng Androidthì đều phải thực hiện các đoạn mã trong Java Sau đó các file mã Java sẽ được biêndịch sang mã bytecode Sau đó để thực thi được các ứng dụng Android thì ta phảidùng một công cụ tên là dx để chuyển đổi mã bytecode của Java sang một file cóđịnh dạng dex (dex là viết tắt của Dalvik excutable), đóng vai trò như cơ chế ảo đểthực thi các ứng dụng Android Hình 1 mô tả sự khác nhau giữa giữa quá trình thựcthi một ứng dụng Java và quá trình thực thi một ứng dụng Android:
Trang 15Hình 1 Qúa trình thực thi ứng dụng Java và ứng dụng Android [4]
Hình 1 thể hiện hai sự khác biệt giữa máy ảo Java (JVM: Java VirtualMachine) và máy ảo Dalvik (DVM: Dalvik Virtual Machine) Sự khác biệt đầu tiên
là các mã bytecode mà JVM hoạt động là Java bytecode còn DVM hoạt động trênđịnh dạng đặc biệt của nó (định dạng dex) Sự khác biệt thứ hai là các lớp Javatrong chương trình Java SE được biên dịch vào một hay nhiều file (.class) và nénvào file(.jar), sau đó JVM có được các file bytecode từ các file (.class) và file (.jar).Mặc dù các ứng dụng Android cũng được biên dịch trong ngôn ngữ lập trình Javanhưng sau khi các ứng dụng này được biên dịch thành các file (.class) thì một công
cụ dx sẽ biến đổi tất cả các file (.class) thành file (.dex) Từ đó DVM đọc các chỉdẫn và dữ liệu Hình vẽ dưới đây thể hiện quá trình biến đổi đó:
Hình 2.Qúa trình biến đổi file mã Java thành file (.dex)
Trang 161.3.Kiến trúc Android
Hình 3.Kiến trúc Android [9]
Android là một ngăn xếp phần mềm, bao gồm các tầng như trên hình 3 Trong
đó các hàm thực thi các ứng dụng trong hai tầng Applications và Applicationsframework được viết bằng ngôn ngữ lập trình Java Còn các hàm thực thi các ứngdụng ở các tầng dưới: Libraries, Android runtime, Linux kernel được viết bằng mãgốc hay native code được viết bằng ngôn ngữ C/C++ Khi cần xây dựng một ứngdụng Android mà cần phải sử dụng một đoạn mã viết bằng C/C++ ở các tầng bêndưới thì ta sẽ sử dụng JNI (Java Native Interface) để giúp ứng dụng Android viếtbằng Java có thể truy cập được các hàm viết bằng C/C++ Ta sẽ nói rõ hơn về quátrình sử dụng JNI trong phần demo ứng dụng “Hello World” ở phần sau Dưới đây
ta sẽ tìm hiểu chức năng của từng tầng trong kiến trúc Android:
Tầng Applications
Android được tích hợp sẵn một số ứng dụng cần thiết cơ bản như: calendar,maps, contacts, brower, camera, phone, … Tất cả các ứng dụng này đều được viếtbằng ngôn ngữ Java
Tầng Applications framework
Trang 17Bằng cách cung cấp một nền tảng phát triển mở Android cung cấp cho các nhàphát triển khả năng xây dựng các ứng dụng cực kỳ phong phú và sáng tạo Nhà pháttriển được tự do tận dụng các thiết bị phần cứng, thông tin địa điểm truy cập, cácdịch vụ chạy nền, thiết lập hệ thống báo động, và cộng thêm các cảnh báo đến cácthanh trạng thái, và nhiều hơn nữa.
Nhà phát triển có thể truy cập vào các API cùng một framework được xâydựng bởi các ứng dụng lõi Kiến trúc ứng dụng được thiết kế để đơn giản hóa việc
sử dụng lại các thành phần; bất kỳ ứng dụng nào cũng có thể công bố khả năng của
nó và bất kỳ ứng dụng nào khác cũng có thể sử dụng những khả năng này(có thể hạnchế bảo mật được thực thi bởi framework) Tất cả các ứng dụng cơ bản là một bộdịch vụ và các hệ thống, bao gồm:
Một tập hợp phong phú và mở rộng các View có khả năng kế thừa lẫn nhaudùng để thiết kế phần giao diện ứng dụng như : gridview, tableview, linearlayout, …
Trình cung cấp nội dung (Content Providers): Cho phép các ứng dụng có thểtruy xuất dữ liệu từ các ứng dụng khác (chẳng hạn như contacts) hoặc là chia sẻ dữliệu giữa các ứng dụng đó
Quản lý tài nguyên (Resource Manager): Cung cấp truy xuất tới các tàinguyên không phải là mã nguồn, chẳng hạn như graphics, và các file layout
Quản lý thông báo (Notification Manager): Cho phép tất cả các ứng dụnghiển thị các cảnh báo trong thanh trạng thái
Quản lý hoạt động (Activity Manager): Quản lý chu trình sống của ứng dụng
và điều hướng các Activity
Tầng Libraries
Android bao gồm một tập hợp các thư viện C/C++ được sử dụng bởi nhiềuthành phần khác nhau trong hệ thống Android Điều này được thể hiện thông quanền tảng ứng dụng Android Một số các thư viện cơ bản được liệt kê dưới đây:
System C library – Thực hiện triển khai BSD của thư viện hệ thống C chuẩn
(libc) và chỉnh cho các thiết bị nhúng dựa trên Linux BSD là giấy phép nguồn mở,cho phép mọi người sử dụng chương trình, mã nguồn của nó và các dẫn xuất
Media Libararies – Dựa trên PacketVideo’s OpenCORE; các thư viện hỗ trợ
phát và ghi âm với nhiều định dạng audio và video, cũng như đối với các file ảnhtĩnh bao gồm: MPEG4, H.264, MP3, AAC, ARM, JPG, và PNG
Trang 18Surface Manager- Quản lý truy cập vào hệ thống hiển thị.
LibWebCore- Một công cụ trình duyệt web hiện đại.
SGL – Công cụ đồ họa 2D cơ sở.
3D libraries – Sự thực hiện dựa trên OpenGL ES 1.0 APIs.
Free Type- Biểu diễn font véc-tơ và bitmap.
QLite –Cơ sở dữ liệu.
Webkit – Thư viện cho việc biểu diễn HTML
Tầng Android runtime
Tầng này bao gồm các thư viện lõi và máy ảo Dalvik Các thư viện lõi baogồm các thư viện lớp cơ bản nhất như: cấu trúc dữ liệu, mạng, các tiện ích, hệ thốngfile DVM được thiết kế để đạt được các chức năng quản lý chu kỳ sống của đốitượng, quản lý ngăn xếp, quản lý luồng, bảo mật, …DVM là lý tưởng để sử dụngvới yêu cầu về không gian bộ nhớ và CPU thấp so với các máy ảo chạy trên các máytính để bàn và hệ thống máy chủ Theo tính toán của Google thì cần 64M RAM chophép hệ thống hoạt động tốt, 24M RAM được sử dụng để khởi tạo và bắt đầu hệthống cơ bản, và 20M RAM được sử dụng cho các dịch vụ cấp cao
Linux kernel
Android được xây dựng trên nhân Linux, nhưng Android không phải là Linux.Android dựa trên Linux phiên bản 2.6 cho các hệ thống dịch vụ cốt lõi như an ninh,quản lý bộ nhớ, quản lý quá trình, ngăn xếp mạng, và mô hình điều khiển Hạt nhâncũng hoạt động như một lớp trừu tượng giữa phần cứng và phần còn lại của ngănxếp phần mềm Linux kernel hỗ trợ các thư viện chia sẻ (shared libraries) và nó còn
là một mã nguồn mở
1.4.Android emulator
Android SDK và Plugin Eclipse được gọi là Android Development Tools(ADT) Trình giả lập Android ( Android Emulator) được tích hợp với Eclipse, sửdụng ADT plug-in cho Eclipse IDE Trình giả lập điện thoại Android hay còn gọi làAVD (Android Virtual Device) trên đó các ứng dụng có thể chạy và được thửnghiệm Một khi AVD được khởi chạy, có thể triển khai một số lượng ứng dụng bất
kỳ trong khi nó vẫn còn đang chạy và thậm chí có thể sử dụng nó để gỡ rối ứngdụng Hình dưới đây mô tả một trình giả lập Android:
Trang 19Hình 4.Android Emulator
Các trình giả lập Android là một công cụ tiện lợi nhưng nó có một số hạn chế
đó là: các trình giả lập không phải là một thiết bị nói chung nó mô phỏng hành vicủa chiếc điện thoại, không hỗ trợ các chức năng nghe nhạc, quay phim, chụp ảnh,USB, Bluetooth, …
1.5 Android SDK
Android SDK cung cấp nhiều tập tin và các công cụ đặc biệt nhằm mục đíchgiúp cho việc thiết kế và phát triển các ứng dụng chạy trên nền tảng Android.Android SDK cũng chứa các thư viện để buộc các ứng dụng vào trong các đặc tínhlõi của Android, chẳng hạn như những thư viện này được kết hợp với các chức năngcủa điện thoại di động (thực hiện và nhận cuộc gọi), các chức năng GPS, và nhắn tinvăn bản Những thư viện này tạo nên lõi của SDK và sẽ được sử dụng thườngxuyên nhất
Phần lớn Android SDK bao gồm các tập tin, tài liệu, với lập trình API, cáccông cụ, và các ví dụ Trong Android SDK có một vài tập tin trong thư mục gốcgiống như android.jar (một ứng dụng Java được biên dịch có chứa các thư viện lõiSDK và API), một số ghi chú, phần còn lại của Android SDK được chia thành bathư mục chính:
Docs: Chứa tất cả các tài liệu đi kèm với Android
Trang 20 Samples: Bao gồm các ví dụ, có thể được biên dịch và kiểm tra bên trongcủa Eclipse.
Tools: Chứa tất cả các công cụ gỡ lỗi, biên dịch, và phát triển mà ta cầntrong suốt quá trình phát triển một ứng dụng Android
Trong mục Samples của Android SDK có chứa 6 ví dụ mẫu cho ứng dụngAndroid Những ví dụ này cung cấp bởi Google để cung cấp cho ta một ý tưởngnhanh chóng về làm cách nào để phát triển một ứng dụng Android Mỗi ứng dụngmẫu thể hiện mỗi phần khác nhau về chức năng của Android Chúng ta có thể mở
và chạy các ứng dụng này từ bên trong của Eclipse
Ứng dụng API Demos là một ứng dụng chủ (host application) mô tả nhiều hàmAPI trong một Activity đơn lẻ Một Activity là một ứng dụng Android Ứng dụngAPI Demos như chỉ ra hình dưới bao gồm nhiều ví dụ khác nhau về chức năng củaAndroid:
Hình 5.Các ứng dụng Android trong API Demos
Giao diện lập trình ứng dụng API (Application Programming Interface) làphần lõi của Android SDK API là tập hợp các hàm, phương thức, đặc tính, lớp vàcác thư viện được sử dụng bởi các nhà phát triển ứng dụng để tạo ra các chươngtrình làm việc trên nền tảng cụ thể Các Android API chứa tất cả các thông tin cụ thể
mà ta cần để tạo ra ứng dụng có thể làm việc và tương tác với một ứng dụng trênnền Android Android SDK cũng chứa hai bộ APIs bổ sung là Google APIs vàOptional APIs:
Trang 21 Google APIs
Nằm trong tập tin android.jar, các API của Google được chứa trong góicom.google.* Có một vài gói đi kèm với các API của Google Một số gói được vậnchuyển trong các API của Google bao gồm các gói cho đồ họa, tính khả chuyển, địachỉ liên hệ và các tiện ích về lịch Chẳng hạn như với gói cho Google Maps Sửdụng gói com.google.android.maps Trong gói này có chứa các thông tin cho bản đồGoogle (Google Maps) ta có thể tạo các ứng dụng tương tác liên tục với giao diệnquen thuộc của Google Maps
1.6.Android NDK
Như tôi đã đề cập trong phần kiến trúc của Android Khi ta viết một ứng dụngcho Android sử dụng ngôn ngữ lập trình Java mà cần phải sử dụng một đoạn mã nào
đó ở các tầng bên dưới (chẳng hạn tầng Libraries) viết bằng các ngôn ngữ C/C++
Để Java có thể truy cập được các hàm C/C++ thì ta cần một giao diện để chúng cóthể tương tác với nhau Giao diện đó là JNI (Java Native Interface)
Android NDK là một công cụ đồng hành với Android SDK cho phép xây dựngcác phần quan trọng thực hiện các ứng dụng trong mã gốc (native code) Nó cungcấp các headers và các thư viện cho phép xây dựng các activities khi lập trình bằng
C hoặc C++ Nếu ta viết mã máy, các ứng dụng vẫn được đóng gói vào một file apk
và chúng vẫn chạy bên trong máy ảo trên thiết bị Sử dụng mã gốc không dẫn đếntăng hiệu suất tự động, nhưng luôn luôn tăng độ phức tạp ứng dụng
Android NDK là một bộ công cụ cho phép nhúng các thành phần sử dụng mãgốc trong các ứng dụng Android Các ứng dụng Android chạy trong máy ảo Dalvik.NDK (Native Development Kit) cho phép thực hiện các phần của ứng dụng sử dụng
mã gốc chẳng hạn như C và C++ Android NDK cung cấp một chuỗi các công cụ
Trang 22và các file xây dựng để tạo các thư viện mã gốc từ các nguồn C và C++; AndroidNDK là một cách để gói các thư viện vào trong file APK (file APK là file sẽ đượcphát hành trên Android cho việc thực thi ứng dụng); Android NDK bao gồm mộtchuỗi các header của hệ thống được hỗ trợ trong các phiên bản của nền tảngAndroid (ví dụ: libc, JNI headers, C++ headers, OpenGL, …); Android NDK baogồm một số tài liệu, mã đơn giản và một số các ví dụ.
Android NDK hỗ trợ JNI giúp các nhà phát triển ứng dụng xây dựng các ứngdụng có sử dụng các đoạn mã gốc của tầng bên dưới Điều này là quan trọng vìtrong một hệ thống nhúng bao gồm các tầng tạo nên một ngăn xếp phần mềm Khi tacần xây dựng một ứng dụng thuộc tầng trên cần kế thừa một số hàm viết bằng mãgốc thuộc tầng bên dưới (có thể là tầng lõi liên quan đến phần cứng) thì JNI đóngvai trò quan trọng
JNI là một tính năng mạnh của nền tảng Java cho phép các nhà lập trình tậndụng được sức mạnh của nền tảng Java (một chương trình viết bằng ngôn ngữ Java
có thể chạy được trên nhiều hệ điều hành “viết một lần chạy mọi nơi”) JNI là mộtgiao diện hai chiều cho phép các ứng dụng Java gọi mã gốc và ngược lại Hình dướiđây mô tả vai trò của JNI:
Hình 6.Vai trò của JNI [7]
Ta có thể sử dụng JNI để viết các phương thức gốc (native methods) cho phépcác ứng dụng Java gọi các hàm được thực thi trong các thư viện gốc Các ứng dụngJava gọi các phương thức gốc trong cùng một cách Dưới đây là mô hình xây dựng
và chạy code JNI:
Trang 23Hình 7.Mô hình xây dựng và chạy code JNI [7]
Hoạt động của mô hình trên như sau: Đầu tiên ta viết mã nguồn Java (JavaSource) sau đó sử dụng trình biên dịch javac để biên dịch các file mã nguồn nàythành file ở định dạng (.class) Trong file mã nguồn Java ta sẽ thực hiện các côngviệc là viết lệnh gọi thư viện động mà ta sẽ tạo ở phần sau (Dynamic Library) vàđịnh nghĩa hay khai báo các phương thức thực hiện các hàm native code mà ta sẽviết ở sau, và mã nguồn Java này cũng là nơi để khởi tạo các phương thức
Tiếp theo ta sẽ tạo ra các header file bằng cách dùng lệnh với javah –jni Saukhi tạo ra các header file thì ta sẽ viết mã C thực thi các hàm và các phương thức màđược khai báo trong mã nguồn Java Tiếp theo để tạo ra thư viện động ta cần phảibiên dịch mã C vừa viết ở trên Để link được thư viện này tới mã nguồn Java thìtrong mã nguồn Java ta viết lệnh gọi thư viện này Sau tất cả các bước trên thìchương trình được thực thi trên máy ảo Java
1.7 Porting OpenCV vào Android
Để phát triển ứng dụng Android với OpenCV thì đầu tiên ta cần porting đượcthư viện này vào trong kiến trúc của Android OpenCV (Open Computer Visionlibrary) do Intel phát triển Thư viện OpenCV gồm khoảng 500 hàm được viết bằngngôn ngữ lập trình C và C++ OpenCV là công cụ mã nguồn mở thích hợp chonghiên cứu và phát triển Để porting OpenCV vào Android ta sử dụng AndroidNDK Dưới đây là mô hình porting OpenCV:
Trang 24Hình 8.Mô hình porting OpenCV vào Android
Tổ chức thư viện OpenCV bao gồm 4 module chính và 2 module mở rộng Cácmodule CV và CVAUX hỗ trợ các chức năng cấp cao (nhận dạng khuôn mặt, hiệuchỉnh camera), xử lý ảnh, phân tích chuyển động Module CxCore tổ chức dữ liệu
cơ sở, thực hiện các thuật toán (phép tính ma trận, tính toán) Module HighGuidgiúp tạo nhanh giao diện và hỗ trợ truy xuất ảnh/phim từ file hoặc thiết bị ngoại vi
Để porting thì đầu tiên ta tải thư viện OpenCV về và giải nén Sau đó dùngAndroid NDK để porting Trong eclipse ta sẽ tạo một project cho việc thực thiporting Sau đó tạo một file tên là jni trong project File jni này sẽ chứa hai file làApplication.mk và Android.mk File Android.mk bao gồm các module là các thưviện của OpenCV cần porting vào trong Android với đường dẫn đúng Sau đó dùnglệnh ndk-build trên Ubuntu để biên dịch thư viện OpenCV cho kiến trúc Arm củaAndroid Chú ý để sử dụng được lệnh ndk-build ta cần phải tải android NDK về vàlink đến đúng thư mục chứa android NDK đã được giải nén Sau khi porting thì ta
sẽ được một thư viện chia sẻ tên là libOpenCV.so và nằm trong thư mụclibs/armeabi Thư viện chia sẻ này sẽ nằm trong tầng Libraries trong kiến trúcAndroid Hình dưới đây mô tả quá trình porting OpenCV cho kiến trúc Arm củaAndroid
Trang 25Hình 9.Qúa trình porting OpenCV vào Android
1.8 Các thành phần tạo nên một ứng dụng Android
Các ứng dụng Android sẽ được xây dựng từ các thành phần cơ bản đó là:Activity, Service, Broadcast receiver, Content Provider và Intent
Activity
Activity là một thành phần ứng dụng cung cấp một màn hình mà người dùng
có thể tương tác để làm một cái gì đó Chẳng hạn như: quay số điện thoại, chụp ảnh,gửi email hoặc xem một bản đồ Một Activity có thể bắt đầu từ các Activity khác.Bên trong hệ thống các Activity được quản lý như một ngăn xếp Khi một Activitymới được bắt đầu thì nó được đặt ở đỉnh của ngăn xếp và trở trành Activity đangchạy Activity trước sẽ ở bên dưới Activity mới và sẽ không thấy trong suốt quátrình Activity mới tồn tại Nếu người dùng nhấn nút Back thì Activity kế tiếp củangăn xếp sẽ di chuyển lên và trở thành active Hình dưới đây mô tả một ngăn xếpcác Activity:
Trang 26Hình 10.Ngăn xếp Activity
Mỗi tiến trình chạy ứng dụng trên nền tảng Android được đặt trên một ngănxếp Khi sử dụng một Activity trên foreground thì tiến trình hệ thống sẽ đưaActivity đó lên trên cùng của ngăn xếp và tiến trình trước đó sẽ được chuyển xuốngmức dưới Tất cả các Activity đều có khả năng bị dừng lại hoặc bị phá hủy bất cứlúc nào bởi vì người sử dụng có thể thay đổi các Activity tùy theo ý thích của họ.Chẳng hạn như: họ đang dùng Activity là một cuộc gọi và sau đó họ dừng cuộc gọi
và chuyển sang Activity khác là chụp ảnh, gửi email hay nhắn tin SMS Nếu tiếntrình Activity bị thoát ra khỏi foreground thì nó sẽ bị hủy Hình dưới đây mô tả chu
kỳ sống của Activity:
Trang 27Hình 11.Chu kỳ sống của Activity [4]
Trạng thái Starting:
Khi một Activity không tồn tại trong bộ nhớ thì nó ở trạng thái starting Trongkhi Activity đang khởi động thì Activity sẽ đi qua một chuỗi các phương thứccallback Và cuối cùng Activity sẽ ở trạng thái running Lưu ý rằng quá trình chuyểnđổi từ trạng thái starting sang trạng thái running là một trong những các hoạt độngtốn kém nhất về thời gian tính toán, và nó cũng ảnh hưởng trực tiếp đến tuổi thọ củapin Đó là lý do tại sao ta không thể tự động hủy các Activity mà chúng không cònđược hiển thị
Trạng thái Running:
Activity ở trong trạng thái running (đang hoạt động) nghĩa là Activity đó đượchiển thị trên màn hình và tương tác với người dùng Người dùng có thể tương tácnhư gõ phím, chạm vào màn hình và nhấn các nút Tất cả các thao tác này được xử
lý bởi Activity này Như vậy tại một thời điểm nào đó thì chỉ có một Activity
Trạng thái Paused:
Khi một Activity không được focus( chẳng hạn như nó không được tương tácvới người sử dụng ) nhưng nó vẫn có thể được nhìn thấy ở trên màn hình Trongtrường hợp này ta nói Activity đang ở trạng thái tạm dừng (paused)
Trang 28Trạng thái Stopped:
Khi một Activity không hiển thị nhưng vẫn còn ở trong bộ nhớ thì ta nói rằng
nó đang ở trạng thái dừng (Stopped) Các Activity ở trạng thái dừng này có thể được
đưa trở lại để trở thành một Activity đang chạy (running) hoặc nó cũng có thể bị phá
hủy và loại bỏ khỏi bộ nhớ Hệ thống vẫn giữ lại các Activity xung quanh trạng thái
stopped bởi vì có thể người dùng vẫn sẽ muốn quay trở lại các Activity trước đó và
muốn khởi động lại các Activity ở trạng thái dừng, do đó sẽ tiết kiệm được thời gian
khởi động vì ta sẽ không phải khởi động một Activity lại từ đầu Các Activity ở
trạng thái stopped có thể bị loại khỏi bộ nhớ bất cứ lúc nào
Trạng thái Destroyed:
Một Activity bị phá hủy thì nó không còn ở trong bộ nhớ Trình quản lý
Activity quyết định Activity này không còn cần thiết và do đó sẽ loại bỏ Activity đó
Trước khi Activity bị phá hủy thì nó có thể thực hiện các hành động nhất định, ví dụ
như bất kỳ một thông tin nào chưa được lưu thì nó sẽ lưu lại các thông tin đó Tuy
nhiên trước khi bị phá hủy thì Activity sẽ được ngừng lại (stopped)
Trong suốt chu kỳ sống của Activity thì mỗi Activity của một chương trình
Android sẽ tồn tại ở vài trạng thái khác nhau Lập trình viên không phải điều khiển
các trạng thái trong chương trình Tất cả hoạt động đó đều được xử lý bằng cách gọi
phương thức theo cấu trúc on_ten_trang_thai(), ví dụ như onStart(), onPause() Lập
trình viên sẽ phải ghi đè các phương thức này trong lớp Activity, và Android sẽ gọi
chúng ở thời điểm thích hợp:
onCreate(Bundle
tiên Ta có thể sử dụng nó để thực thi việc khởi tạo các thành phần khác như tạo
giao diện người dùng, kết nối dữ liệu đến danh sách Phương thức này có một tham
số, nó có thể là null hoặc là thông tin trạng thái trước đó được lưu bởi phương thức
onSaveInstanceState().
onStart: Phương thức này được gọi trước khi một Activity ẩn với người
dùng
onResume():
thời điểm này thì Activity ở trên đỉnh của ngăn xếp Activity
onPause(): Nó được gọi khi chuyển sang chế độ chạy nền, thường là khi có
một Activity khác được chạy trên nó Tại đây ta có thể lưu lại trạng thái cố định của
chương trình cũng như ghi lại thay đổi trong cơ sở dữ liệu
Trang 29onStop(): Gọi khi Activity không còn xuất hiện với người dùng và nó sẽ
không cần tới nữa Nếu bộ nhớ không đủ, phương thức này sẽ không bao giờ được
Activity lưu lại trạng thái của nó Thường ta sẽ không cần ghi đè nó bởi vì quá trình
thực hiện để lưu lại trạng thái cho tất cả các giao diện người dùng được điều khiển
một cách tự động
onRestoreInstanceStat(Bundle)
trạng thái được lưu trước đó, được thực hiện bởi phương
thức:onSaveInstanceState(): Các Activity không chạy ở trên cùng có thể bị dừng lại
hoặc hệ thống sẽ hủy tiến trình Linux chứa Activity đó để tạo không gian cho các
Activity mới
Một Service là một thành phần ứng dụng có thể thực hiện các hoạt động lâu
dài trong nền (background) mà không có bất kỳ các thành phần giao diện người
dùng nào Chú ý là không được nhầm lẫn các dịch vụ của Android (một thành phần
của ứng dụng) với các thành phần cấp dưới của hệ điều hành như các dịch vụ Linux
nguồn (native Linux), các server Chu kỳ sống của Service đơn giản hơn rất nhiều so
với chu kỳ sống của Activity Hình 11 mô tả chu kỳ sống của một Service:
Hình 12.Chu kỳ sống của Service [4]
Trang 30Khi một Service sử dụng IPC, AIDL (Android Interface DefinnitionLanguage) được sử dụng để tạo ra mã cho phép truyền thông giữa hai tiến trình quaIPC Hình dưới mô tả quá trình truyền thông giữa hai tiến trình:
Hình 13.Truyền thông giữa hai tiến trình
Broadcast receiver
Broadcast receiver là một thành phần thu nhận các Intent bên ngoài gửi tới Vídụ: ta cần viết một chương trình thay thế cho phần gọi điện mặc định của Androidkhi đó ta cần một broadcast receiver để nhận biết các Intent là các cuộc gọi tới
Hình 14.Broadcast receiver
Content Provider
Content Provider lưu trữ và lấy dữ liệu và nó có thể truy cập vào tất cả các ứngdụng Đây là cách duy nhất để chia sẻ dữ liệu giữa các ứng dụng Android với một
số Content Provider cho các loại dữ liệu( như video, âm thanh, hình ảnh, thông tin
liên lạc cá nhân, …) Các loại dữ liệu này được liệt kê trong gói android.provider.
Hình dưới mô tả chức năng của một Content Provider Ứng dụng có thể truy xuất vàchia sẻ dữ liệu với Database qua Content Provider với các phương thức insert(),update(), delete() và query()
Trang 31Hình 15.Content Provider [4]
Hệ thống Android luôn luôn sử dụng cơ chế này Ví dụ, trình liên hệ (ContactsProvider) là một trình cung cấp nội dung (Conten Provider) Contacts Provider chothấy tất cả các dữ liệu liên hệ (contact data) người dùng đến nhiều ứng dụng Lưutrữ truyền thông (Media Store) sẽ chịu trách nhiệm lưu trữ và chia sẻ các phươngtiện truyền thông khác nhau, ví dụ như hình ảnh và âm nhạc trên các ứng dụng khácnhau Hình 14 minh họa cách sử dụng các ứng dụng liên hệ (Contacts app) sử dụngContacts Provider Một ứng dụng là hoàn toàn riêng biệt để lấy dữ liệu về các liên
Trang 32Một ứng dụng Android thường bao gồm nhiều Activity, mỗi Activity hoạtđộng độc lập với nhau và thực hiện những công việc khác nhau Intent chính là cầunối giữa các Activity, là người đưa thư giúp ta triệu gọi và truyền các dữ liệu cầnthiết để thực hiện một Activity từ một Activity khác Hình 15 cho thấy Intent có thểđược sử dụng để “nhảy” giữa các Activity khác nhau ở trong cùng một ứng dụnghoặc trong các ứng dụng khác nhau.
Hình 17.Intent [4]
1.9 Phát triển ứng dụng Android và DVM
Như tôi đã đề cập ở trên thì file APK là file sẽ được phát hành trên Androidcho việc thực thi các ứng dụng Android DVM hay Dalvik Virtual Machine là máy
ảo để thực thi các ứng dụng Hình dưới đây mô tả quá trình tạo ra một file APK:
Hình 18.Qúa trình tạo file APK