Android 6.0 Marshmallow : The New Runtime Permission
Permission trong ứng dụng Android tạm hiểu là quyền cấp phép cho ứng dụng để thực hiện một tác vụ nào đó. Ví dụ một ứng dụng đọc báo cần quyền truy cập Internet, một ứng dụng có chức năng chụp ảnh cần quyền sử dụng đến Camera ... Bạn dễ dàng nhận ra một ứng dụng sẽ yêu cầu những Permission ...
Permission trong ứng dụng Android tạm hiểu là quyền cấp phép cho ứng dụng để thực hiện một tác vụ nào đó. Ví dụ một ứng dụng đọc báo cần quyền truy cập Internet, một ứng dụng có chức năng chụp ảnh cần quyền sử dụng đến Camera ...
Bạn dễ dàng nhận ra một ứng dụng sẽ yêu cầu những Permission nào khi tải và cài đặt từ Google Play :
Trước khi phát hành Android 6.0 Marshmallow, Permission trong Android được quyết định tất cả bởi người dùng tại thời điểm cài đặt ứng dụng. Điều này có nghĩa là nếu người dùng muốn sử dụng một ứng dụng, việc đầu tiên là họ phải chấp nhận tất cả Permission của ứng dụng đó. Điều này dẫn đến một lỗ hỏng bảo mật lớn vì người dùng không thể biết được với những Permission đó ứng dụng sẽ thực hiện những hành vi gì.
Permission trong Android là một trong những mối quan tâm an ninh lớn nhất khi cài đặt ứng dụng. Sau khi cài đặt, ứng dụng sẽ có thể truy cập tất cả các thứ trong phạm vi Permission của nó mà không cần quan tâm tới sự cho phép nào của người dùng.
Không có gì ngạc nhiên tại sao có rất nhiều kẻ xấu cố gắng để thu thập dữ liệu cá nhân của người dùng thông qua các điểm yếu bảo mật này. Hoặc đơn giản hơn, các ứng dụng rác có thể gửi tin nhắn ngầm trừ tiền trong tài khoản của bạn vì đơn giản ứng dụng đó có Permission được phép gửi tin nhắn SMS.
Nhóm phát triển Android cũng biết được vấn đề này. 7 năm trôi qua, cuối cùng hệ thống Permission trong Android cũng được thiết kế lại. Trong Android 6.0 Marshmallow, ứng dụng sẽ không được cấp phép bất kỳ Permission nào lúc cài đặt. Thay vào đó, ứng dụng phải yêu cầu người dùng cấp cho từng Permission tại thời điểm chạy, gọi là Runtime Permission.
Xin lưu ý rằng hộp thoại yêu cầu sự cho phép hiển thị ở trên sẽ không khởi tạo tự động. Lập trình viên phải tạo ra nó. Trong trường hợp này, lập trình viên cố gắng gọi một số hàm yêu cầu một Permisson mà người sử dụng ko cho phép, hàm sẽ gây ra Exception dẫn đến ứng dụng bị crash.
Bên cạnh đó, người dùng cũng có khả năng thu hồi các Permisson được cấp phép bất cứ lúc nào thông qua mục Settings của điện thoại.
Nếu bạn là lập trình viên Android như mình, bạn sẽ nhận ra rằng logic lập trình đã hoàn toàn thay đổi. Bạn không thể chỉ đơn giản gọi một hàm để làm công việc như trước mà bạn phải kiểm tra Permission cho từng hàm nếu ko ứng dụng của bạn sẽ bị crash.
Chính xác. Mình nói luôn rằng sẽ không dễ dàng. Mặc dù đó là một điều tuyệt vời cho người dùng nhưng nó thực sự là cơn ác mộng đối với lập trình viên như chúng ta. Chúng ta phải code lại như nào đó bởi vì nó chắc chắn sẽ có một vấn đề trong cả ngắn hạn và dài hạn.
Dù sao thì Runtime Permission mới này sẽ chỉ hoạt động khi chúng ta đặt targetSdkVersion của ứng dụng là 23, có nghĩa là nó được khai báo rằng ứng dụng đã được thử nghiệm trên API Level 23. Và tính năng này sẽ chỉ hoạt động trên Android 6.0 Marshmallow. Cùng một ứng dụng sẽ chạy với hành vi cũ nếu trên thiết bị cài đặt hệ điều hành trước Marshmallow.
Hệ thống Permission mới này có thể gây ra cho bạn một số thắc mắc ngay bây giờ. "Ứng dụng của tôi publish trên GG Play 3 năm trước đây. Nếu nó được cài đặt trên thiết bị Android 6.0, Runtime Permission được áp dụng, liệu Ứng dụng của tôi cũng sẽ bị crash ?!?"
Đừng quá lo lắng. Nhóm phát triển Android đã tính toán đến vấn đề này. Nếu targetSdkVersion của ứng dụng được thiết lập dưới 23. Nó sẽ được giả định rằng ứng dụng không được áp dụng hệ thống Permission mới và sẽ chuyển sang các hành vi cũ : người dùng phải chấp nhận mọi Permission một lần vào lúc cài đặt, và ứng dụng sẽ đc phép sử dụng tất cả các Permission đc cấp phép sau khi cài đặt.
Đúng vậy, ứng dụng sẽ chạy bình thường như trước. Lưu ý rằng người dùng vẫn có thể thu hồi Permission sau đó! Mặc dù Android 6.0 cảnh báo người dùng, nhưng họ có thể thu hồi Permisson bất cứ lúc nào.
Tiếp theo câu hỏi trong đầu của bạn ngay bây giờ. Nếu thế thì ứng dụng của tôi sẽ bị crash ?
Khi chúng ta gọi hàm mà yêu cầu một Permission ( người dùng có thể thay đổi ) với targetSdkVersion thấp hơn 23, sẽ không gây ra Exception nào cả. Thay vào đó nó sẽ chỉ đơn giản là không làm gì cả. Đối với các hàm mà trả về giá trị, nó sẽ trả về null hoặc 0 phụ thuộc vào từng trường hợp.
Nhưng bạn đừng mừng vội. Mặc dù ứng dụng sẽ không bị crash khi gọi một hàm. Nó vẫn có thể crash từ hàm có giá trị trả về.
Tin tốt (ít nhất là cho đến bây giờ) là những trường hợp như vậy hiếm xảy ra . Nếu có xảy ra thì các ứng dụng đó phải chấp nhận kết quả.
Nhưng về lâu dài, mình tin rằng sẽ có hàng triệu người dùng tắt đi một số Permission, khiến cho ứng dụng của chúng ta sẽ không làm việc một cách hoàn hảo trên thiết bị mới. Đó là điều không thể chấp nhận được.
Để cho ứng dụng chạy hoàn hảo, mình và các bạn phải bắt đầu làm việc đó ngay bây giờ!
Đối với ứng dụng mà không hỗ trợ Runtime Permission, KHÔNG phát hành nó với targetSdkVersion 23. Di chuyển targetSdkVersion đến 23 chỉ khi bạn đã chắc chắn hỗ trợ tốt cho Runtime Permisson.
Chú ý: Khi bạn tạo mới một Project trong Android Studio. targetSdkVersion sẽ được tự động thiết lập cho phiên bản mới nhất. Nếu bạn chưa sẵn sàng cho ứng dụng hỗ trợ Runtime Permission, bạn hãy để targetSdkVersion thấp xuống dưới 23, chẳng hạn 22.
Kì sau mình sẽ hướng dẫn các bạn sử dụng Runtime Permission trong Project một cách cụ thể.
Tham khảo : https://developer.android.com/preview/features/runtime-permissions.html