Tải bản đầy đủ (.doc) (64 trang)

hệ điều hành android và thực thi ứng dụng phát hiện khuôn mặt trên android

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.3 MB, 64 trang )

a
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Trần Thị Hợp
HỆ ĐIỀU HÀNH ANDROID VÀ THỰC THI ỨNG
DỤNG PHÁT HIỆN KHUÔN MẶT TRÊN ANDROID
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Điện Tử Viễn Thông
HÀ NỘI - 2011
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Trần Thị Hợp
HỆ ĐIỀU HÀNH ANDROID VÀ THỰC THI ỨNG
DỤNG PHÁT HIỆN KHUÔN MẶT TRÊN ANDROID
KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Điện Tử Viễn Thông
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
VIETNAM 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
LỜ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
TÓM TẮT
Android là hệ điều hành cho thiết bị di động được phát triển bởi Google. Android
dự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ình
Java. Khóa luận này tôi trình bày tổng quan về Android, kiến trúc Android, Android
SDK, Android NDK, các thành phần tạo nên một ứng dụng Android và trình bày hai
phương pháp phát hiện khuôn mặt sử dụng thư viện OpenCV và framework API của
Android. Đồ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ụng
với Android NDK. Quy trình này sẽ được sử dụng để xây dựng ứng dụng phát hiện
khuôn mặt sử dụng OpenCV. OpenCV là một thư viện hỗ trợ cho xử lý ảnh do Intel
phá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óa
luậ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ằng
C/C++ của OpenCV. Giao diện đó là JNI (Java Native Interface). Trong khóa luận tôi
cũ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ụng
OpenCV.
Phương pháp thứ hai để phát hiện khuôn mặt là sử dụng framework API của
Android. 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át
hiệ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ực
nghiệ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.
i
LỜ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
ii
MỤC LỤC
Trần Thị Hợp 1
Trần Thị Hợp 2
Tran Thi Hop 3

Danh sách hình vẽ iv
CHƯƠNG 1. HỆ ĐIỀU HÀNH ANDROID 1
1.1.Android là gì? 1
1.2.Máy ảo Dalvik 1
1.3.Kiến trúc Android 3
1.4.Android emulator 5
1.5. Android SDK 6
1.6.Android NDK 8
1.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 12
1.9. Phát triển ứng dụng Android và DVM 19
1.10. Tạo và demo ứng dụng “Hello World” sử dụng Android NDK 20
CHƯƠNG 2 .CÁC PHƯƠNG PHÁP PHÁT HIỆN KHUÔN MẶT TRÊN ANDROID 27
2.1. Thuật toán của Viola – Jones trong OpenCV 27
2.2. Phát hiện khuôn mặt sử dụng framework API của Android 31
2.3. Xây dựng chương trình phát hiện khuôn mặt trên Android 36
CHƯƠNG 3. KẾT QUẢ ĐẠT ĐƯỢC 48
3.1. Kết quả phát hiện khuôn mặt sử dụng framework API của Android 48
3.2. Khó khăn và hướng giải quyết 49
KẾT LUẬN 50
TÀI LIỆU THAM KHẢO 51
iii
Danh sách hình vẽ
Hình 1. Qúa trình thực thi ứng dụng Java và ứng dụng Android [4] 2
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 [9] 3
Hình 4.Android Emulator 6
iv
Hình 5.Các ứng dụng Android trong API Demos 7
Hình 6.Vai trò của JNI [7] 9

Hình 7.Mô hình xây dựng và chạy code JNI [7] 10
Hình 8.Mô hình porting OpenCV vào Android 11
Hình 9.Qúa trình porting OpenCV vào Android 12
Hình 10.Ngăn xếp Activity 13
Hình 11.Chu kỳ sống của Activity [4] 14
Hình 12.Chu kỳ sống của Service [4] 17
Hình 13.Truyền thông giữa hai tiến trình 17
Hình 14.Broadcast receiver 17
Hình 15.Content Provider [4] 18
Hình 16.Ứng dụng Contacts sử dụng Contacts Provider để lấy dữ liệu 18
Hình 17.Intent [4] 19
Hình 18.Qúa trình tạo file APK 20
Hình 19.Quá trình truy cập mã gốc qua JNI [4] 21
Hình 20.Demo ứng dụng Hello World dùng Android NDK 26
Hình 21.Các đặc trưng Haar-like cơ bản [7] 27
Hình 22.Các đặc trưng Haar-like mở rộng [6] 27
Hình 23.Cách tính Integral Image [8] 28
Hình 24.Ví dụ cách tính nhanh các giá trị mức xám [7] 28
Hình 25.Mô hình cascade kết hợp với các bộ phân loại yếu [7] 29
Hình 26.Kết hợp các bộ phân loại yếu thành bộ phân loại mạnh 30
Hình 27. Hệ thống phát hiện khuôn mặt 30
Hình 28.Các gói Android cung cấp trong framework API 36
Hình 29.Mô hình phát hiện khuôn mặt trên Androi 36
Hình 30.Các góc Euler- hệ tọa độ xyz (cố định), hệ tọa độ XYZ (quay) 37
Hình 31.Các thành phần trong một Android Project 40
Hình 32. Các tệp trong thư mục bin của Android Project 46
Hình 33.Hình ảnh gốc ban đầu 48
v
Hình 34.Kết quả phát hiện khuôn mặt trên Android 48
vi

THUẬ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
vii
LỜ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ên nền tảng Linux 2.6. Android đang từng bước thống trị thị trường di động nhờ vào
nhữ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ừ Linux
hay nói cụ thể hơn là Google và Android mang đến một thế giới hoàn toàn mở. Người
dù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ựa
chọ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 Android
nă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 đứng
sau 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ác

nhà 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ản
phẩm nhúng, ví dụ như nhà thông minh, hệ thống thông tin giải trí ô tô, … Ngoài ra
trong 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ình
bà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ụng
OpenCV 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ện
khuôn mặt với framework API của Android. API là giao diện lập trình ứng dụng, viết
tắt của Application Programming Interface. Nền tảng Android cung cấp một
framework API mà các ứng dụng có thể tương tác với hệ thống Android. Framework
API 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ặt
tôi sử dụng lớp FaceDetector trong gói android.media của framework API do Android
cung 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 Java
tố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:
viii
Chươ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ện
nà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ạn
như dùng OpenCV có thể phát triển thêm các ứng dụng phân tích chuyển động, nhận
dạ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 ảo
Dalvik. 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ủa

kiế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 framework
API 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.
ix
CHƯƠ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ập
trì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. Tuy
nhiê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át
triể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àn
cầu (GPS). Android cũng hỗ trợ nhiều tính năng như: Wi-fi, Bluetooth, các mạng
3G 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 Java
như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 Android
thì đều phải thực hiện các đoạn mã trong Java. Sau đó các file mã Java sẽ được biên
dịch sang mã bytecode. Sau đó để thực thi được các ứng dụng Android thì ta phải
dù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ực
thi một ứng dụng Java và quá trình thực thi một ứng dụng Android:
1
Hì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 Virtual
Machine) 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 Java
trong chương trình Java SE được biên dịch vào một hay nhiều file (.class) và nén
và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 Java
như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)
2
1.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à Applications
framework được viết bằng ngôn ngữ lập trình Java. Còn các hàm thực thi các ứng
dụ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 ứng
dụ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ên
dưới thì ta sẽ sử dụng JNI (Java Native Interface) để giúp ứng dụng Android viết
bằ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ết
bằng ngôn ngữ Java.
 Tầng Applications framework
3

Bằ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át
triể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ác
dị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ác
thanh 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ây
dự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ạn
chế 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 nhau
dù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ài
nguyê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ụng
hiể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ều
thành phần khác nhau trong hệ thống Android. Điều này được thể hiện thông qua
nề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 ảnh
tĩnh bao gồm: MPEG4, H.264, MP3, AAC, ARM, JPG, và PNG.
4
•Surface 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 bao
gồ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ống
file. DVM được thiết kế để đạt được các chức năng quản lý chu kỳ sống của đối
tượng, quản lý ngăn xếp, quản lý luồng, bảo mật, …DVM là lý tưởng để sử dụng
vớ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áy
tính để bàn và hệ thống máy chủ. Theo tính toán của Google thì cần 64M RAM cho
phé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ân
cũ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ăn
xế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 ứng
dụng. Hình dưới đây mô tả một trình giả lập Android:
5
Hì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 vi
củ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 đích
giú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ính
lõ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ăng
củ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 tin
vă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ường
xuyê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ác
công cụ, và các ví dụ. Trong Android SDK có một vài tập tin trong thư mục gốc
giống như android.jar (một ứng dụng Java được biên dịch có chứa các thư viện lõi
SDK và API), một số ghi chú, phần còn lại của Android SDK được chia thành ba
thư mục chính:
• Docs: Chứa tất cả các tài liệu đi kèm với Android.
6
• Samples: Bao gồm các ví dụ, có thể được biên dịch và kiểm tra bên trong củ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ần trong
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ụng

Android. Những ví dụ này cung cấp bởi Google để cung cấp cho ta một ý tưởng
nhanh chóng về làm cách nào để phát triển một ứng dụng Android. Mỗi ứng dụng
mẫ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àm
API trong một Activity đơn lẻ. Một Activity là một ứng dụng Android. Ứng dụng
API Demos như chỉ ra hình dưới bao gồm nhiều ví dụ khác nhau về chức năng của
Android:
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ương
trì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ên
nền Android. Android SDK cũng chứa hai bộ APIs bổ sung là Google APIs và
Optional APIs:
7
• Google APIs
Nằm trong tập tin android.jar, các API của Google được chứa trong gói
com.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ận
chuyển trong các API của Google bao gồm các gói cho đồ họa, tính khả chuyển, địa
chỉ 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ện
quen thuộc của Google Maps.
• Optional APIs
Các Optional APIs bao gồm các tùy chọn chương trình khi cố gắng sử dụng
các tính năng này trong các ứng dụng Android. Một trong những tính năng tùy chọn
là một điện thoại di động dựa trên GPS. Android LBS (Location-Based Services)
API giải quyết việc tiếp nhận và sử dụng thông tin từ GPS của điện thoại. (Kết hợp

thông tin trong LBS Android API với GPS trong Google Maps API có thể tạo ra
một ứng dụng rất hữu ích có thể tự động hiển thị một bản đồ định vị trí ). Một số
Optional APIs khác bao gồm các tùy chọn cho việc sử dụng Bluetooth, Wi-Fi, chơi
nhạc MP3 và truy cập phần cứng 3-D-OpenGL.
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ụng
cho 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ựng
các phần quan trọng thực hiện các ứng dụng trong mã gốc (native code). Nó cung
cấ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 đến
tă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
8
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ụ
và 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++; Android
NDK là một cách để gói các thư viện vào trong file APK (file APK là file sẽ được
phát hành trên Android cho việc thực thi ứng dụng); Android NDK bao gồm một
chuỗi các header của hệ thống được hỗ trợ trong các phiên bản của nền tảng
Android (ví dụ: libc, JNI headers, C++ headers, OpenGL, …); Android NDK bao
gồ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 ứng
dụ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 ta

cầ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 đóng
vai 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ận
dụ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ột
giao 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ép
cá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ụng
Java 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:
9
Hì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 (Java
Source) sau đó sử dụng trình biên dịch javac để biên dịch các file mã nguồn này
thành file ở định dạng (.class). Trong file mã nguồn Java ta sẽ thực hiện các công
việ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. Sau
khi 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ải
biê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 được
thư viện này vào trong kiến trúc của Android. OpenCV (Open Computer Vision

library) do Intel phát triển. Thư viện OpenCV gồm khoảng 500 hàm được viết bằng
ngôn ngữ lập trình C và C++. OpenCV là công cụ mã nguồn mở thích hợp cho
nghiên cứu và phát triển. Để porting OpenCV vào Android ta sử dụng Android
NDK. Dưới đây là mô hình porting OpenCV:
10
Hì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ác
module CV và CVAUX hỗ trợ các chức năng cấp cao (nhận dạng khuôn mặt, hiệu
chỉ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 HighGuid
giú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ùng
Android NDK để porting. Trong eclipse ta sẽ tạo một project cho việc thực thi
porting. 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ùng
lệnh ndk-build trên Ubuntu để biên dịch thư viện OpenCV cho kiến trúc Arm của
Android. 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ục
libs/armeabi. Thư viện chia sẻ này sẽ nằm trong tầng Libraries trong kiến trúc
Android. Hình dưới đây mô tả quá trình porting OpenCV cho kiến trúc Arm của
Android.
11
Hì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 Activity
mới được bắt đầu thì nó được đặt ở đỉnh của ngăn xếp và trở trành Activity đang
chạ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ủa
ngă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ếp
các Activity:
12

×