Các thành phần của ứng dụng
Android cung cấp một nền tảng nguồn mở và môi trường ứng dụng cho các thiết bị di động. Hệ điều hành cốt lõi dựa trên nhân Linux. Các ứng dụng Android thường được viết bằng ngôn ngữ lập trình Java và chạy trong máy ảo Android Runtime (ART). Tuy nhiên, ứng dụng cũng có thể được viết bằng mã gốc. Ứng dụng được cài đặt từ một tệp duy nhất có đuôi tệp APK.
Các thành phần chính của ứng dụng Android là:
-
AndroidManifest.xml: Tệp AndroidManifest.xml là tệp điều khiển cho hệ thống biết cần làm gì với tất cả các thành phần cấp cao nhất (cụ thể là các hoạt động, dịch vụ, trình thu phát sóng và nhà cung cấp nội dung được mô tả bên dưới) trong một ứng dụng. Tệp này cũng chỉ định những quyền cần thiết.
-
Hoạt động: Hoạt động thường là mã cho một tác vụ tập trung vào người dùng bằng cách sử dụng lớp
Activity
. Một hoạt động thường bao gồm việc hiển thị giao diện người dùng cho người dùng, nhưng không bắt buộc; một số hoạt động không bao giờ hiển thị giao diện người dùng. Thông thường, một trong các hoạt động của ứng dụng là điểm truy cập vào ứng dụng. -
Dịch vụ: Dịch vụ là một đoạn mã chạy ở chế độ nền. Ứng dụng này có thể chạy trong quy trình riêng hoặc trong ngữ cảnh của quy trình của một ứng dụng khác. Các thành phần khác "liên kết" với một Dịch vụ và gọi các phương thức trên dịch vụ đó thông qua lệnh gọi quy trình từ xa. Ví dụ về Dịch vụ là trình phát nội dung đa phương tiện: ngay cả khi người dùng thoát khỏi giao diện người dùng lựa chọn nội dung đa phương tiện, người dùng vẫn có thể muốn tiếp tục phát nhạc. Dịch vụ sẽ tiếp tục phát nhạc ngay cả khi giao diện người dùng đã hoàn tất.
-
Broadcast Receiver (Trình thu phát sóng): BroadcastReceiver là một đối tượng được tạo bản sao khi hệ điều hành hoặc một ứng dụng khác phát hành một cơ chế IPC có tên là Ý định. Ví dụ: một ứng dụng có thể đăng ký một trình thu phát sóng cho thông báo pin yếu và thay đổi hành vi của ứng dụng dựa trên thông tin đó.
Mô hình quyền trên Android: Truy cập vào các API được bảo vệ
Tất cả ứng dụng trên Android đều chạy trong một Hộp cát ứng dụng. Theo mặc định, ứng dụng Android chỉ có thể truy cập vào một số tài nguyên hệ thống có giới hạn. Hệ thống quản lý quyền truy cập của ứng dụng Android vào các tài nguyên. Nếu được sử dụng không đúng cách hoặc có mục đích xấu, các tài nguyên này có thể ảnh hưởng tiêu cực đến trải nghiệm người dùng, mạng hoặc dữ liệu trên thiết bị.
Các quy định hạn chế này được triển khai dưới nhiều hình thức. Một số chức năng bị hạn chế do thiếu API có chủ ý đối với chức năng nhạy cảm (ví dụ: không có API Android để trực tiếp thao tác với thẻ SIM). Trong một số trường hợp, việc phân tách vai trò sẽ cung cấp một biện pháp bảo mật, chẳng hạn như việc tách biệt bộ nhớ cho mỗi ứng dụng. Trong các trường hợp khác, các API nhạy cảm được dành cho các ứng dụng đáng tin cậy và được bảo vệ thông qua một cơ chế bảo mật có tên là Quyền.
Các API được bảo vệ này bao gồm:
- Các chức năng của máy ảnh
- Dữ liệu vị trí (GPS)
- Hàm Bluetooth
- Hàm điện thoại
- Hàm SMS/MMS
- Kết nối mạng/dữ liệu
Bạn chỉ có thể truy cập vào các tài nguyên này thông qua hệ điều hành. Để sử dụng các API được bảo vệ trên thiết bị, ứng dụng phải xác định các chức năng cần thiết trong tệp kê khai. Tất cả phiên bản Android 6.0 trở lên đều sử dụng mô hình quyền khi bắt đầu chạy. Nếu người dùng yêu cầu một tính năng từ một ứng dụng yêu cầu API được bảo vệ, hệ thống sẽ hiển thị một hộp thoại nhắc người dùng từ chối hoặc cho phép cấp quyền.
Sau khi được cấp, các quyền sẽ được áp dụng cho ứng dụng miễn là ứng dụng đó được cài đặt. Để tránh gây nhầm lẫn cho người dùng, hệ thống sẽ không thông báo lại cho người dùng về các quyền đã cấp cho ứng dụng. Ngoài ra, các ứng dụng có trong hệ điều hành cốt lõi hoặc do nhà sản xuất thiết bị gốc (OEM) đóng gói sẽ không yêu cầu người dùng cấp quyền. Các quyền sẽ bị xoá nếu ứng dụng bị gỡ cài đặt, vì vậy, việc cài đặt lại sau đó sẽ hiển thị các quyền.
Trong phần cài đặt thiết bị, người dùng có thể xem các quyền cho ứng dụng mà họ đã cài đặt trước đó. Người dùng cũng có thể tắt một số chức năng trên toàn bộ thiết bị khi họ chọn, chẳng hạn như tắt GPS, đài hoặc Wi-Fi.
Trong trường hợp một ứng dụng cố gắng sử dụng một tính năng được bảo vệ chưa được khai báo trong tệp kê khai của ứng dụng, thì lỗi cấp quyền thường dẫn đến trường hợp ngoại lệ bảo mật được gửi lại cho ứng dụng. Các quy trình kiểm tra quyền API được bảo vệ được thực thi ở cấp thấp nhất có thể để ngăn chặn hành vi lách. Ví dụ về thông báo cho người dùng khi một ứng dụng được cài đặt trong khi yêu cầu quyền truy cập vào các API được bảo vệ được hiển thị trong Hình 2.
Các quyền mặc định của hệ thống được mô tả tại https://developer.android.com/reference/android/Manifest.permission.html. Ứng dụng có thể khai báo quyền riêng để các ứng dụng khác sử dụng. Các quyền như vậy không được liệt kê ở vị trí nêu trên.
Khi xác định một quyền, thuộc tính protectionLevel sẽ cho hệ thống biết người dùng sẽ nhận thông báo như thế nào về các ứng dụng cần được cấp quyền, hoặc người được phép giữ quyền. Thông tin chi tiết về cách tạo và sử dụng các quyền cụ thể của ứng dụng được mô tả tại https://developer.android.com/guide/topics/security/security.html.
Có một số chức năng của thiết bị, chẳng hạn như khả năng gửi ý định thông báo qua SMS, không dành cho ứng dụng bên thứ ba, nhưng có thể được các ứng dụng do nhà sản xuất thiết bị gốc (OEM) cài đặt sẵn sử dụng. Các quyền này sử dụng quyền signatureOrSystem.
Cách người dùng hiểu về ứng dụng bên thứ ba
Android luôn cố gắng làm rõ cho người dùng khi họ đang tương tác với ứng dụng bên thứ ba và thông báo cho người dùng về các chức năng của những ứng dụng đó. Trước khi cài đặt bất kỳ ứng dụng nào, người dùng sẽ thấy một thông báo rõ ràng về các quyền mà ứng dụng đang yêu cầu. Sau khi cài đặt, người dùng sẽ không được nhắc lại để xác nhận bất kỳ quyền nào.
Có nhiều lý do để hiển thị quyền ngay trước thời điểm cài đặt. Đây là thời điểm người dùng chủ động xem xét thông tin về ứng dụng, nhà phát triển và chức năng để xác định xem ứng dụng có phù hợp với nhu cầu và kỳ vọng của họ hay không. Điều quan trọng là họ chưa có cam kết về mặt tinh thần hoặc tài chính đối với ứng dụng và có thể dễ dàng so sánh ứng dụng với các ứng dụng thay thế khác.
Một số nền tảng khác sử dụng phương pháp khác để thông báo cho người dùng, yêu cầu quyền khi bắt đầu mỗi phiên hoặc khi ứng dụng đang được sử dụng. Mục tiêu của Android là giúp người dùng chuyển đổi liền mạch giữa các ứng dụng theo ý muốn. Việc xác nhận mỗi lần sẽ làm chậm người dùng và khiến Android không thể mang lại trải nghiệm tốt cho người dùng. Việc yêu cầu người dùng xem xét các quyền tại thời điểm cài đặt sẽ giúp người dùng có thể chọn không cài đặt ứng dụng nếu họ cảm thấy không thoải mái.
Ngoài ra, nhiều nghiên cứu về giao diện người dùng đã chỉ ra rằng việc nhắc người dùng quá mức sẽ khiến người dùng bắt đầu nói "OK" với mọi hộp thoại xuất hiện. Một trong những mục tiêu bảo mật của Android là truyền đạt hiệu quả thông tin bảo mật quan trọng cho người dùng. Điều này không thể thực hiện được bằng cách sử dụng hộp thoại mà người dùng sẽ được huấn luyện để bỏ qua. Bằng cách trình bày thông tin quan trọng một lần và chỉ khi thông tin đó quan trọng, người dùng có nhiều khả năng sẽ suy nghĩ về những gì họ đồng ý.
Một số nền tảng chọn không hiển thị bất kỳ thông tin nào về chức năng của ứng dụng. Phương pháp đó khiến người dùng không dễ dàng hiểu và thảo luận về các chức năng của ứng dụng. Mặc dù không phải lúc nào tất cả người dùng cũng có thể đưa ra quyết định sáng suốt, nhưng mô hình quyền của Android giúp nhiều người dùng dễ dàng truy cập thông tin về ứng dụng. Ví dụ: các yêu cầu cấp quyền không mong muốn có thể khiến những người dùng tinh vi hơn đặt câu hỏi quan trọng về chức năng của ứng dụng và chia sẻ mối lo ngại của họ ở những nơi như Google Play, nơi tất cả người dùng đều có thể thấy.
Quyền khi cài đặt ứng dụng — Google Dịch | Quyền của một ứng dụng đã cài đặt — Gmail |
---|---|
![]() |
![]() |
Hình 1. Hiển thị quyền cho ứng dụng
Giao tiếp liên quy trình
Các quy trình có thể giao tiếp bằng bất kỳ cơ chế loại UNIX truyền thống nào. Ví dụ: hệ thống tệp, ổ cắm cục bộ hoặc tín hiệu. Tuy nhiên, các quyền của Linux vẫn được áp dụng.
Android cũng cung cấp các cơ chế IPC mới:
-
Binder (Trình liên kết): Cơ chế gọi quy trình từ xa dựa trên chức năng nhẹ được thiết kế để đạt được hiệu suất cao khi thực hiện các lệnh gọi trong quy trình và giữa các quy trình. Binder được triển khai bằng trình điều khiển Linux tuỳ chỉnh. Xem https://developer.android.com/reference/android/os/Binder.html.
-
Dịch vụ: Các dịch vụ (đã thảo luận ở trên) có thể cung cấp giao diện truy cập trực tiếp bằng trình liên kết.
-
Ý định: Ý định là một đối tượng thông báo đơn giản đại diện cho "ý định" làm một việc gì đó. Ví dụ: nếu ứng dụng của bạn muốn hiển thị một trang web, thì ứng dụng đó sẽ thể hiện "Ý định" xem URL bằng cách tạo một thực thể Ý định và chuyển thực thể đó cho hệ thống. Hệ thống sẽ xác định vị trí một số đoạn mã khác (trong trường hợp này là Trình duyệt) biết cách xử lý Ý định đó và chạy Ý định đó. Bạn cũng có thể dùng ý định để truyền tin các sự kiện thú vị (chẳng hạn như thông báo) trên toàn hệ thống. Hãy xem bài viết https://developer.android.com/reference/android/content/Intent.html.
-
ContentProvider: ContentProvider là kho lưu trữ dữ liệu cung cấp quyền truy cập vào dữ liệu trên thiết bị; ví dụ điển hình là ContentProvider dùng để truy cập vào danh bạ của người dùng. Một ứng dụng có thể truy cập vào dữ liệu mà các ứng dụng khác đã hiển thị thông qua ContentProvider và một ứng dụng cũng có thể xác định ContentProvider của riêng mình để hiển thị dữ liệu của riêng ứng dụng đó. Xem nội dung tại https://developer.android.com/reference/android/content/ContentProvider.html.
Mặc dù có thể triển khai IPC bằng các cơ chế khác như ổ cắm mạng hoặc tệp mà mọi người đều có thể ghi, nhưng đây là các khung IPC Android được đề xuất. Nhà phát triển Android sẽ được khuyến khích sử dụng các phương pháp hay nhất để bảo mật dữ liệu của người dùng và tránh tạo ra các lỗ hổng bảo mật.
API nhạy cảm về chi phí
API nhạy cảm về chi phí là bất kỳ hàm nào có thể tạo ra chi phí cho người dùng hoặc mạng. Nền tảng Android đã đặt các API nhạy cảm về chi phí vào danh sách các API được bảo vệ do hệ điều hành kiểm soát. Người dùng sẽ phải cấp quyền rõ ràng cho các ứng dụng bên thứ ba yêu cầu sử dụng các API nhạy cảm về chi phí. Các API này bao gồm:
- Điện thoại
- SMS/MMS
- Mạng/Dữ liệu
- Thanh toán trong ứng dụng
- Quyền truy cập NFC
Android 4.2 bổ sung thêm chế độ kiểm soát việc sử dụng SMS. Android sẽ đưa ra thông báo nếu một ứng dụng cố gắng gửi tin nhắn SMS đến một mã ngắn sử dụng các dịch vụ cao cấp có thể gây ra khoản phí bổ sung. Người dùng có thể chọn cho phép hoặc chặn ứng dụng gửi thông báo.
Quyền truy cập vào thẻ SIM
Ứng dụng bên thứ ba không có quyền truy cập cấp thấp vào thẻ SIM. Hệ điều hành xử lý mọi hoạt động giao tiếp với thẻ SIM, bao gồm cả quyền truy cập vào thông tin cá nhân (danh bạ) trên bộ nhớ thẻ SIM. Các ứng dụng cũng không thể truy cập vào các lệnh AT vì các lệnh này do Lớp giao diện vô tuyến (RIL) quản lý độc quyền. RIL không cung cấp API cấp cao cho các lệnh này.
Thông tin cá nhân
Android đã đặt các API cung cấp quyền truy cập vào dữ liệu người dùng vào nhóm API được bảo vệ. Khi người dùng sử dụng bình thường, thiết bị Android cũng sẽ tích luỹ dữ liệu người dùng trong các ứng dụng bên thứ ba mà người dùng cài đặt. Các ứng dụng chọn chia sẻ thông tin này có thể sử dụng tính năng kiểm tra quyền trên Android OS để bảo vệ dữ liệu khỏi các ứng dụng bên thứ ba.

Hình 2. Chỉ có thể truy cập vào dữ liệu nhạy cảm của người dùng thông qua các API được bảo vệ
Các trình cung cấp nội dung hệ thống có khả năng chứa thông tin cá nhân hoặc thông tin nhận dạng cá nhân, chẳng hạn như danh bạ và lịch, đã được tạo bằng các quyền được xác định rõ ràng. Mức độ chi tiết này cung cấp cho người dùng thông tin rõ ràng về các loại thông tin có thể được cung cấp cho ứng dụng. Trong quá trình cài đặt, ứng dụng bên thứ ba có thể yêu cầu quyền truy cập vào các tài nguyên này. Nếu bạn cấp quyền, ứng dụng có thể được cài đặt và sẽ có quyền truy cập vào dữ liệu được yêu cầu bất cứ lúc nào khi được cài đặt.
Theo mặc định, mọi ứng dụng thu thập thông tin cá nhân sẽ chỉ cho phép ứng dụng cụ thể đó truy cập vào dữ liệu đó. Nếu một ứng dụng chọn cung cấp dữ liệu cho các ứng dụng khác thông qua IPC, thì ứng dụng cấp quyền truy cập có thể áp dụng các quyền cho cơ chế IPC do hệ điều hành thực thi.
Thiết bị nhập dữ liệu nhạy cảm
Các thiết bị Android thường cung cấp các thiết bị nhập dữ liệu nhạy cảm cho phép ứng dụng tương tác với môi trường xung quanh, chẳng hạn như máy ảnh, micrô hoặc GPS. Để một ứng dụng bên thứ ba truy cập vào các thiết bị này, trước tiên, người dùng phải cấp quyền truy cập rõ ràng cho ứng dụng đó thông qua việc sử dụng Quyền trên Android OS. Sau khi cài đặt, trình cài đặt sẽ nhắc người dùng yêu cầu quyền truy cập vào cảm biến theo tên.
Nếu muốn biết vị trí của người dùng, ứng dụng cần có quyền truy cập thông tin vị trí của người dùng. Sau khi cài đặt, trình cài đặt sẽ nhắc người dùng hỏi xem ứng dụng có thể truy cập thông tin vị trí của người dùng hay không. Bất cứ lúc nào, nếu không muốn ứng dụng nào truy cập vào thông tin vị trí của mình, người dùng có thể chạy ứng dụng "Cài đặt", chuyển đến phần "Vị trí và bảo mật" rồi bỏ đánh dấu "Sử dụng mạng không dây" và "Bật vệ tinh GPS". Thao tác này sẽ tắt các dịch vụ dựa trên vị trí cho tất cả ứng dụng trên thiết bị của người dùng.
Siêu dữ liệu của thiết bị
Android cũng cố gắng hạn chế quyền truy cập vào dữ liệu không phải là dữ liệu nhạy cảm, nhưng có thể gián tiếp tiết lộ các đặc điểm về người dùng, lựa chọn ưu tiên của người dùng và cách họ sử dụng thiết bị.
Theo mặc định, các ứng dụng không có quyền truy cập vào nhật ký hệ điều hành, trình duyệt, số điện thoại hoặc thông tin nhận dạng phần cứng / mạng. Nếu một ứng dụng yêu cầu quyền truy cập vào thông tin này tại thời điểm cài đặt, thì trình cài đặt sẽ nhắc người dùng hỏi xem ứng dụng có thể truy cập vào thông tin đó hay không. Nếu người dùng không cấp quyền truy cập, ứng dụng sẽ không được cài đặt.
Tổ chức phát hành chứng chỉ
Android bao gồm một tập hợp các Tổ chức phát hành chứng chỉ hệ thống đã cài đặt, được tin cậy trên toàn hệ thống. Trước Android 7.0, nhà sản xuất thiết bị có thể sửa đổi nhóm CA được vận chuyển trên thiết bị của họ. Tuy nhiên, các thiết bị chạy Android 7.0 trở lên sẽ có một bộ CA hệ thống thống nhất vì nhà sản xuất thiết bị không được phép sửa đổi nữa.
Để được thêm làm CA công khai mới vào bộ CA gốc của Android, CA phải hoàn tất Quy trình đưa CA của Mozilla vào, sau đó gửi yêu cầu tính năng đối với Android ( https://code.google.com/p/android/issues/entry) để thêm CA vào bộ CA gốc của Android trong Dự án nguồn mở Android (AOSP).
Vẫn có các CA dành riêng cho thiết bị và không được đưa vào nhóm CA cốt lõi của AOSP, chẳng hạn như CA riêng của nhà mạng có thể cần thiết để truy cập an toàn vào các thành phần của cơ sở hạ tầng của nhà mạng, chẳng hạn như cổng SMS/MMS. Nhà sản xuất thiết bị nên chỉ đưa CA riêng tư vào các thành phần/ứng dụng cần tin tưởng các CA này. Để biết thêm thông tin chi tiết, hãy xem phần Cấu hình bảo mật mạng.
Ký ứng dụng
Tính năng ký mã cho phép nhà phát triển xác định tác giả của ứng dụng và cập nhật ứng dụng mà không cần tạo các giao diện và quyền phức tạp. Mọi ứng dụng chạy trên nền tảng Android đều phải do nhà phát triển ký. Google Play hoặc trình cài đặt gói trên thiết bị Android sẽ từ chối những ứng dụng cố gắng cài đặt mà không được ký.
Trên Google Play, tính năng ký ứng dụng giúp Google tin tưởng nhà phát triển và nhà phát triển tin tưởng ứng dụng của mình. Nhà phát triển biết rằng ứng dụng của họ được cung cấp, chưa sửa đổi cho thiết bị Android; đồng thời, nhà phát triển có thể chịu trách nhiệm về hành vi của ứng dụng.
Trên Android, việc ký ứng dụng là bước đầu tiên để đặt ứng dụng vào hộp cát ứng dụng. Chứng chỉ ứng dụng đã ký xác định mã nhận dạng người dùng nào được liên kết với ứng dụng nào; các ứng dụng khác nhau chạy theo các mã nhận dạng người dùng khác nhau. Tính năng ký ứng dụng đảm bảo rằng một ứng dụng không thể truy cập vào bất kỳ ứng dụng nào khác, ngoại trừ thông qua IPC được xác định rõ ràng.
Khi một ứng dụng (tệp APK) được cài đặt trên thiết bị Android, Trình quản lý gói sẽ xác minh rằng tệp APK đó đã được ký đúng cách bằng chứng chỉ có trong tệp APK đó. Nếu chứng chỉ (hoặc chính xác hơn là khoá công khai trong chứng chỉ) khớp với khoá dùng để ký bất kỳ tệp APK nào khác trên thiết bị, thì tệp APK mới có thể chỉ định trong tệp kê khai rằng tệp APK đó sẽ chia sẻ UID với các tệp APK khác được ký tương tự.
Ứng dụng có thể được bên thứ ba (OEM, nhà mạng, thị trường thay thế) ký hoặc tự ký. Android cung cấp tính năng ký mã bằng chứng chỉ tự ký mà nhà phát triển có thể tạo mà không cần sự trợ giúp hoặc quyền bên ngoài. Ứng dụng không bắt buộc phải do một cơ quan trung ương ký. Android hiện không thực hiện quy trình xác minh CA cho chứng chỉ ứng dụng.
Các ứng dụng cũng có thể khai báo quyền bảo mật ở cấp độ bảo vệ Chữ ký, chỉ hạn chế quyền truy cập vào các ứng dụng được ký bằng cùng một khoá, đồng thời duy trì UID và Hộp cát ứng dụng riêng biệt. Bạn có thể tạo mối quan hệ chặt chẽ hơn với Hộp cát ứng dụng dùng chung thông qua tính năng UID dùng chung, trong đó hai hoặc nhiều ứng dụng được ký bằng cùng một khoá nhà phát triển có thể khai báo một UID dùng chung trong tệp kê khai của chúng.
Xác minh ứng dụng
Android 4.2 trở lên hỗ trợ tính năng xác minh ứng dụng. Người dùng có thể chọn bật tính năng "Xác minh ứng dụng" và yêu cầu trình xác minh ứng dụng đánh giá ứng dụng trước khi cài đặt. Tính năng xác minh ứng dụng có thể cảnh báo người dùng nếu họ cố gắng cài đặt một ứng dụng có thể gây hại; nếu một ứng dụng đặc biệt xấu, thì tính năng này có thể chặn việc cài đặt.
Quản lý quyền kỹ thuật số
Nền tảng Android cung cấp một khung quản lý quyền kỹ thuật số (DRM) có thể mở rộng, cho phép các ứng dụng quản lý nội dung được bảo vệ quyền theo các quy tắc hạn chế về giấy phép liên kết với nội dung đó. Khung DRM hỗ trợ nhiều giao thức DRM; nhà sản xuất thiết bị sẽ quyết định giao thức DRM mà thiết bị hỗ trợ.
Khung DRM của Android được triển khai trong hai lớp cấu trúc (xem hình dưới đây):
-
API khung DRM được hiển thị cho các ứng dụng thông qua khung ứng dụng Android và chạy thông qua máy ảo ART cho các ứng dụng chuẩn.
-
Trình quản lý DRM mã gốc, triển khai khung DRM và hiển thị giao diện cho các trình bổ trợ DRM (trình đại diện) để xử lý việc quản lý quyền và giải mã cho nhiều giao thức DRM
Hình 3. Cấu trúc của DRM trên nền tảng Android