Hộp cát về quyền riêng tư trên Bản xem trước dành cho nhà phát triển Android 1 đã ra mắt! Tìm hiểu cách bắt đầutiếp tục cung cấp ý kiến phản hồi.

Thời gian chạy SDK

Gửi ý kiến phản hồi

Nền tảng Android sử dụng khái niệm hộp cát ứng dụng để duy trì các ranh giới bảo mật và khả năng thực thi mạnh mẽ của mã ứng dụng so với các ranh giới quy trình. Đối với các ứng dụng, đây là một phương pháp thông dụng để đưa mã bên thứ ba vào, thường ở dạng SDK, chẳng hạn như SDK quảng cáo hay SDK phân tích. Việc sử dụng lại này cho phép nhà phát triển ứng dụng tập trung vào sự khác biệt của ứng dụng trong khi vẫn tận dụng được nghiên cứu của các chuyên gia trong ngành để mở rộng phạm vi thực thi vượt ra khỏi những gì mà họ có thể tự thực hiện một cách dễ dàng.

Giống như hầu hết các hệ điều hành, trong Android, SDK được thực thi trong hộp cát của ứng dụng lưu trữ, thừa kế các quyền và đặc quyền tương tự của ứng dụng lưu trữ, đồng thời có quyền truy cập vào bộ nhớ của ứng dụng lưu trữ đó. Mặc dù cấu trúc này giúp SDK và ứng dụng tích hợp một cách linh hoạt nhưng lại khiến những dữ liệu người dùng chưa tiết lộ có thể bị thu thập và chia sẻ. Hơn nữa, các nhà phát triển ứng dụng có thể cũng chưa nhận biết hết được chức năng của SDK bên thứ ba cũng như dữ liệu mà SDK đó truy cập vào dẫn đến việc giải thích về các phương pháp thu thập và chia sẻ dữ liệu của ứng dụng trở nên khó khăn.

Trên Android 13, chúng tôi dự định thêm một tình năng mới vào nền tảng để SDK bên thứ ba có thể chạy trong một môi trường thời gian chạy riêng gọi là SDK Thời gian chạy. SDK Thời gian chạy cung cấp các biện pháp đảm bảo và bảo vệ mạnh mẽ hơn sau đây cho hoạt động thu thập và chia sẻ dữ liệu người dùng:

  • Sửa đổi môi trường thực thi
  • Xác định rõ các quyền cũng như quyền truy cập dữ liệu cho các SDK

Mục tiêu

Đề xuất này nhằm đạt được các mục tiêu sau đây:

  • Giảm hoạt động truy cập và chia sẻ đối với dữ liệu ứng dụng chưa được tiết lộ của người dùng bằng SDK bên thứ ba thông qua việc cách ly quy trình, cũng như xác định rõ API và biện pháp kiểm soát truy cập vào dữ liệu. Hãy tìm hiểu thêm về cách ly quy trình trong một phần riêng của tài liệu này.
  • Giảm hoạt động theo dõi chưa tiết lộ đối với hoạt động dùng ứng dụng của người dùng bằng SDK bên thứ ba thông qua việc giới hạn SDK truy cập vào các giá trị nhận dạng riêng, lâu dài.
  • Tăng tốc hoạt động phân phối bản cập nhật SDK cho ứng dụng một cách an toàn bằng cách giảm bớt gánh nặng cho nhà phát triển ứng dụng và người dùng cuối. Hãy tìm hiểu thêm về mô hình phân phối SDK đáng tin cậy đề xuất trong một phần khác của tài liệu này.
  • Giúp nhà phát triển ứng dụng giải thích rõ hơn về hoạt động truy cập và chia sẻ dữ liệu trên ứng dụng của họ.
  • Giúp nhà phát triển SDK ngăn các SDK khác can thiệp thông qua việc giới hạn một số cấu trúc ngôn ngữ không an toàn, chẳng hạn như phản xạ và mã JNI.
  • Giúp SDK quảng cáo phát hiện và ngăn chặn lưu lượng truy cập không hợp lệ cũng như hành vi gian lận trong quảng cáo thông qua kiểm soát toàn bộ các chế độ xem từ xa hiển thị nội dung nghe nhìn.
  • Giảm thiểu tác động quá mức đối với nhà phát triển SDK và ứng dụng nhiều nhất có thể.

Các SDK sẽ thực thi trong một quy trình tách biệt

SDK Thời gian chạy đề xuất hỗ trợ các SDK tương thích — được gọi là SDK hỗ trợ thời gian chạy (RE) trong phần còn lại của tài liệu này — để vận hành trong một quy trình riêng cho ứng dụng. Nền tảng hỗ trợ giao tiếp hai chiều giữa quy trình của ứng dụng và SDK Thời gian chạy. Hãy xem phần giao tiếp của tài liệu này để biết thông tin chi tiết. Các SDK không phải RE vẫn giữ nguyên trong quy trình của ứng dụng như hiện nay. Hình 1 minh hoạ những thay đổi sau đây:

Trước:


Sau:

Hình 1. Vị trí tương đối của SDK hỗ trợ thời gian chạy trước và sau khi được thêm vào SDK Thời gian chạy. Sơ đồ "trước" (đầu tiên) cho thấy mã gọi SDK, cùng với các SDK nhận lệnh gọi từ mã này, đều thuộc quy trình của ứng dụng. Sơ đồ "sau" (thứ hai) cho thấy rằng, trong quy trình trước của ứng dụng, mã gọi SDK giao tiếp với giao diện SDK. Sau đó, các giao diện này vượt qua ranh giới của quy trình vào quy trình SDK Thời gian chạy để tự gọi SDK.

Mô hình phân phối đáng tin cậy mới dành cho SDK

Quy trình tách SDK khỏi ứng dụng như đề xuất sẽ thúc đẩy khái niệm phân tách khác, một khái niệm cho phân phối ứng dụng và SDK. Đề xuất của chúng tôi đòi hỏi có cơ chế cài đặt và phân phối đáng tin cậy, để đảm bảo cài đặt đúng SDK trong SDK Thời gian chạy của ứng dụng. Điều này giúp người dùng và nhà phát triển ứng dụng sẽ không tải SDK không hợp lệ, trong khi vẫn hỗ trợ cửa hàng ứng dụng giảm đáng kể gánh nặng của việc phân phối SDK đối với nhà phát triển ứng dụng.

SDK không cần phải liên kết và đóng gói theo cách tĩnh cùng với các ứng dụng của chúng trước khi tải lên cửa hàng ứng dụng để phân phối nữa. Quy trình sau đây sẽ diễn ra:

  1. Nhà phát triển SDK có thể tải SDK đã lập phiên bản của họ lên cửa hàng ứng dụng, tách riêng khỏi chính các ứng dụng đó.
  2. Nhà phát triển ứng dụng có thể chỉ định các phần phụ thuộc SDK theo phiên bản, bản dựng và tải lên một bản phát hành ứng dụng không bao gồm phần phụ thuộc SDK thực.
  3. Khi người dùng tải ứng dụng này xuống, quy trình cài đặt có thể sử dụng phần phụ thuộc SDK đã chỉ định của ứng dụng để tải chúng xuống từ cửa hàng ứng dụng.

Cơ chế phân phối mới này cho phép nhà phát triển SDK thực hiện những thay đổi không gây ra lỗi (nghĩa là, không có thay đổi đối với API hay ngữ nghĩa học) đối với SDK và phân phối cho các thiết bị mà không có sự can thiệp của nhà phát triển ứng dụng. Những thay đổi không gây ra lỗi đối với SDK này có thể được triển khai hoặc hoàn nguyên, mà không nhất thiết phải chờ các nhà phát triển ứng dụng tạo lại ứng dụng bằng SDK mới hay chờ người dùng cuối cập nhật ứng dụng. Nhà phát triển ứng dụng vẫn cần cập nhật những thay đổi có thể gây lỗi, nhưng nhà phát triển SDK có thể cập nhật những thay đổi không gây ra lỗi mới nhất, đồng thời khắc phục nhanh hơn và nhất quán hơn cho nhiều người hơn, theo cách lý tưởng là giảm thiểu sự hỗ trợ liên quan đến phiên bản.

Hình 2 minh hoạ những thay đổi đề xuất trong quá trình phân phối SDK:

Trước:

Sơ đồ trước

Sau:

Sơ đồ sau
Hình 2. Thiết kế phân phối SDK, trước và sau khi ra mắt SDK Thời gian chạy. Nhà phát triển SDK sẽ không gửi được trực tiếp SDK cho ứng dụng nữa; thay vào đó, nhà phát triển SDK sử dụng giao diện người dùng tải lên SDK để xuất bản SDK lên cửa hàng ứng dụng. Sau đó, cửa hàng ứng dụng sẽ xử lý hoạt động phân phối ứng dụng, cùng với mọi phần phụ thuộc SDK, cho thiết bị của người dùng cuối.

Những thay đổi về cách thức tạo, chạy, phân phối SDK và ứng dụng

Đây là đề xuất ban đầu cho công nghệ phân phối và SDK Thời gian chạy linh hoạt. Các phần sau đây đề xuất một loạt những thay đổi đối với nhiều danh mục sau đây:

  • Quyền truy cập: Quyền, bộ nhớ, dung lượng lưu trữ
  • Thực thi: Ngôn ngữ, thay đổi về thời gian chạy, vòng đời, hiển thị nội dung nghe nhìn
  • Giao tiếp: Ứng dụng với SDK và SDK với SDK
  • Phát triển: Cách tạo, gỡ lỗi, thử nghiệm trong mô hình này
  • Phân phối: Cách phân phối, cập nhật, hoàn nguyên đối với các phiên bản Android, ứng dụng và SDK

Tài liệu này cũng bao gồm phần Câu hỏi thường gặp để giúp giải đáp các câu hỏi thường gặp.

Đây là đề xuất thiết kế ban đầu. Chúng tôi hiểu rằng đây có thể là sự thay đổi có ý nghĩa đối với một số thành phần của hệ sinh thái. Do đó, chúng tôi tích cực kêu gọi ý kiến phản hồi của bạn và mong bạn cung cấp ý kiến phản hồi thông qua công cụ theo dõi lỗi này.

Quyền truy cập

Quản lý quyền riêng tư của hệ thống nghĩa là quản lý cách các bên khác nhau truy cập vào các tài nguyên khác nhau. Để thực hiện tuyên bố giá trị về quyền riêng tư, chúng tôi dự định cập nhật mô hình truy cập vào ứng dụng, SDK và dữ liệu người dùng để tuân thủ nguyên tắc về đặc quyền tối thiểu nhằm ngăn chặn hành vi truy cập vào những dữ liệu có thể là dữ liệu nhạy cảm chưa được tiết lộ.

Quyền của SDK

Trong một quy trình riêng, SDK Thời gian chạy sẽ có một tập hợp quyền được xác định rõ ràng, chứ không thừa kế các quyền mà người dùng cấp cho ứng dụng. Dựa trên nghiên cứu sơ bộ về các quyền do SDK liên quan đến quảng cáo sử dụng, chúng tôi đề xuất rằng SDK trong Thời gian chạy sẽ có các quyền sau đây theo mặc định:

  • INTERNET: Truy cập vào Internet để có thể giao tiếp với dịch vụ web.
  • ACCESS_NETWORK_STATE: Truy cập vào thông tin về mạng.
  • Quyền truy cập vào API bảo vệ quyền riêng tư. API này cung cấp các tính năng quảng cáo cốt lõi mà không cần truy cập vào giá trị nhận dạng trên nhiều ứng dụng. Dù tên quyền chưa được hoàn tất, nhưng các API này sẽ bị giới hạn theo quyền tiếp cận của ứng dụng đối với các quyền này.
  • AD_ID: Khả năng yêu cầu mã nhận dạng cho quảng cáo. Khả năng này cũng sẽ bị giới hạn theo quyền tiếp cận của ứng dụng đối với quyền này.
  • BIND_GET_INSTALL_REFERRER_SERVICE: Khả năng sử dụng Google Play Install Referrer API để phân phối nguồn của lượt cài đặt ứng dụng.

Hiện tại, chúng tôi đang tìm hiểu xem có cần cấp quyền bổ sung hay không và cách cấp quyền bổ sung nhằm giới hạn mức tác động đối với người dùng cuối từ cả khía cạnh quyền riêng tư và khả năng hữu dụng. Chúng tôi yêu cầu phản hồi về bất kỳ trường hợp sử dụng nào mà tập hợp quyền này có thể chưa được đáp ứng.

Bộ nhớ

Như đã giải thích trong phần về quyền SDK của tài liệu này, SDK Thời gian chạy có dung lượng bộ nhớ riêng do có quy trình riêng. Theo mặc định, cấu trúc này sẽ từ chối quyền truy cập của SDK vào dung lượng bộ nhớ của ứng dụng. Tương tự, ứng dụng sẽ không truy cập được vào dung lượng bộ nhớ của SDK. Chúng tôi dự định giữ lại hành vi mặc định này để tuân theo nguyên tắc về đặc quyền tối thiểu.

Bộ nhớ

Đề xuất này nhằm cân bằng giữa nhu cầu cho SDK truy cập vào bộ nhớ để hoạt động bình thường và giảm thiểu hoạt động theo dõi trên ứng dụng và trên quy trình bằng bộ nhớ lâu dài. Chúng tôi đang đề xuất nội dung cập nhật sau đây về cách truy cập vào bộ nhớ hiện nay:

  • Một ứng dụng không thể truy cập trực tiếp vào bộ nhớ SDK và ngược lại.
  • SDK không thể truy cập vào bộ nhớ bên ngoài của thiết bị.
  • Trong mỗi SDK Thời gian chạy, tất cả các SDK đều có thể truy cập vào cả hai bộ nhớ và bộ nhớ riêng tư cho SDK nhất định.

Giống như mô hình bộ nhớ hiện tại, bộ nhớ không có các giới hạn tuỳ ý về kích thước và thời lượng (nói cách khác, bộ nhớ không phải là nhất thời nhưng sẽ bị xoá vào thời điểm gỡ cài đặt ứng dụng).

Thực thi

Để đảm bảo có một hệ thống riêng tư giữa các ứng dụng, SDK và người dùng, ngữ cảnh thực thi (định dạng mã, cấu trúc ngôn ngữ, API dễ truy cập và dữ liệu hệ thống) cần phải thực thi lại những ranh giới về quyền riêng tư này, hoặc tối thiểu là không tạo ra cơ hội can thiệp vào những ranh giới đó. Đồng thời, chúng tôi muốn giữ lại quyền truy cập vào nền tảng phong phú này cũng như phần lớn các tính năng thời gian chạy mà SDK hiện có. Ở đây, chúng tôi đề xuất một loạt các nội dung cập nhật cho môi trường thời gian chạy để tạo ra sự cân bằng này.

Mã Android (ứng dụng và SDK) chủ yếu được Android Runtime (ART) diễn giải, để xem mã được viết bằng ngôn ngữ lập trình Kotlin hay Java. Sự phong phú của ART và cấu trúc ngôn ngữ mà ART cung cấp, cùng với khả năng có thể xác minh khi so sánh với các lựa chọn thay thế — cụ thể là mã gốc — có vẻ tạo ra sự cân bằng phù hợp giữa chức năng và quyền riêng tư. Chúng tôi đề xuất rằng mã SDK chỉ bao gồm mã byte Dex, thay vì hỗ trợ quyền truy cập JNI.

Chúng tôi biết rằng có các trường hợp sử dụng, chẳng hạn như sử dụng SQLite đóng gói tuỳ chỉnh, mà do việc sử dụng mã gốc, sẽ cần phải thay thế bằng phương án khác, chẳng hạn như phiên bản SQLite tích hợp của SDK Android.

SELinux

Trên Android, mỗi quy trình (bao gồm cả những quy trình chạy dưới dạng thư mục gốc) chạy trong một ngữ cảnh SELinux cụ thể, cho phép kernel quản lý quyền kiểm soát truy cập vào các dịch vụ hệ thống, tệp, thiết bị và các quy trình khác. Để đảm bảo phần lớn trường hợp sử dụng SDK mà vẫn giảm thiểu sự can thiệp vào các biện pháp bảo vệ quyền riêng tư mà chúng tôi đang cố gắng cải thiện, chúng tôi đề xuất nội dung cập nhật sau đây đối với ngữ cảnh SELinux của ứng dụng không thuộc hệ thống cho SDK Thời gian chạy:

  • Chỉ một số dịch vụ hệ thống mới có thể truy cập được. (đang trong quá trình thiết kế)
  • Các SDK chỉ có thể tải và thực thi mã trong APK của chúng.
  • Chỉ truy cập được vào một số thuộc tính hệ thống. (đang trong quá trình thiết kế)

API

Mặc dù hầu hết các API ngôn ngữ dựa trên Java đều hỗ trợ mô hình quyền riêng tư mà chúng tôi đang cố gắng đạt được trong SDK Thời gian chạy, có một vài API dựa trên Java khiến khó bảo đảm quyền riêng tư của người dùng và SDK, chẳng hạn như API phản chiếu và API gọi. Do đó, chúng tôi dự định ngăn quyền truy cập vào 2 bộ API này từ trong SDK Thời gian chạy, có thể cùng với các API khác mà chúng tôi đang tích cực tìm hiểu, và thu thập ý kiến phản hồi về tác động đến các trường hợp sử dụng khác nhau. Chúng tôi sẽ chia sẻ đề xuất đầy đủ trong nội dung cập nhật trong tương lai.

Ngoài ra, các bản phát hành gần đây trên nền tảng Android đã ngày càng hạn chế quyền truy cập vào giá trị nhận dạng lâu dài để cải thiện vấn đề quyền riêng tư. Đối với SDK Thời gian chạy, chúng tôi đặt ra quyền truy cập giới hạn hơn vào các giá trị nhận dạng có thể được dùng để theo dõi trên ứng dụng.

Cuối cùng, SDK RE sẽ không thể sử dụng API thông báo để gửi thông báo cho người dùng vào bất kỳ thời điểm nào.

Vòng đời

SDK ứng dụng hiện tuân theo vòng đời của ứng dụng máy chủ, nghĩa là khi ứng dụng truy cập vào hoặc rời khỏi nền trước, tắt hoặc bị hệ điều hành buộc dừng do áp lực về bộ nhớ, SDK của ứng dụng cũng làm vậy. Đề xuất phân tách SDK của ứng dụng vào một quy trình khác mà chúng tôi đưa ra cho thấy những thay đổi sau đây đối với vòng đời:

  • Người dùng hoặc hệ điều hành có thể chấm dứt ứng dụng. SDK Thời gian chạy sẽ tự động chấm dứt ngay sau đó.
  • Hệ điều hành có thể chấm dứt SDK Thời gian chạy do áp lực bộ nhớ hoặc một ngoại lệ chưa được xử lý trong SDK chẳng hạn.

    SDK Thời gian chạy vận hành ở mức độ ưu tiên thấp hơn một chút so với ứng dụng liên kết; do đó, rất có khả năng là một ứng dụng sẽ bị chấm dứt ngay sau SDK Thời gian chạy do áp lực về bộ nhớ. Trong trường hợp không phải như vậy, hoặc trong trường hợp có lý do khác , đề xuất này đưa ra các phương thức gọi lại trong vòng đời liên quan cho nhà phát triển ứng dụng để họ xử lý ngoại lệ này và khởi động lại SDK Thời gian chạy bằng lệnh gọi init(). Lệnh này sẽ tải lại SDK Thời gian chạy.

    Trong trường hợp liên tục có lỗi, nhà phát triển ứng dụng sẽ cần lên kế hoạch xuống cấp nhẹ mà không có SDK hoặc thông báo cho người dùng nếu SDK đóng vai trò quan trọng đối với chức năng cốt lõi của ứng dụng. Để biết thêm thông tin về mối tương tác này giữa ứng dụng với SDK, hãy xem phần giao tiếp của tài liệu này.

SDK không phải RE có thể tiếp tục sử dụng các dữ liệu gốc tiêu chuẩn của hệ điều hành có sẵn cho ứng dụng được nhúng — bao gồm cả máy chủ, hoạt động và thông báo — trong khi các SDK RE thì không làm được như vậy.

Hiển thị nội dung nghe nhìn

Có những SDK hiển thị nội dung, như văn bản, hình ảnh và video trong chế độ xem dành riêng cho ứng dụng. Để làm được điều này, chúng tôi đề xuất cách tiếp cận hiển thị từ xa, trong đó SDK sẽ hiển thị nội dung nghe nhìn từ trong SDK Thời gian chạy nhưng sử dụng SurfaceControlViewHost API để cho phép nội dung nghe nhìn hiển thị trong chế độ xem dành riêng cho ứng dụng. Phương thức này mang đến cho SDK khả năng hiển thị nội dung nghe nhìn theo cách riêng tư với người dùng, trong khi ngăn chặn và phát hiện các hoạt động tương tác không hợp lệ hoặc gian lận của người dùng với nội dung nghe nhìn đã hiển thị.

Quảng cáo gốc, những quảng cáo không do SDK mà do ứng dụng hiển thị, sẽ được SDK hỗ trợ trong SDK Thời gian chạy. Quy trình thu thập tín hiệu và tìm nạp mẫu quảng cáo sẽ diễn ra một cách nhất quán với các quảng cáo không phải là quảng cáo gốc. Tuy nhiên, các biện pháp bảo vệ hiển thị của SDK Thời gian chạy được cung cấp cho chế độ hiển thị WebView thông thường của SDK có thể không khả thi. Chúng tôi đang tích cực nghiên cứu khía cạnh này.

Quảng cáo dạng video trong luồng phát là những quảng cáo chạy trong luồng với video, hiển thị trong trình phát của một ứng dụng. Do video phát trong trình phát của ứng dụng chứ không phải trình phát hay chế độ xem trong SDK, mô hình hiển thị sẽ khác với các định dạng quảng cáo khác. Chúng tôi đang tích cực tìm hiểu các cơ chế hỗ trợ cả tính năng chèn quảng cáo phía máy chủ và chèn quảng cáo dựa trên SDK.

Tình trạng hệ thống

Chúng tôi tìm cách giảm thiểu tác động đối với tình trạng hệ thống mà SDK Thời gian chạy tạo ra với thiết bị của người dùng cuối, và đang thiết kế những phương pháp để làm vậy. Tuy nhiên, có nhiều khả năng một số thiết bị Android 13 cấp thấp với tài nguyên hệ thống rất hạn chế, chẳng hạn như Android (phiên bản Go), sẽ không hỗ trợ SDK Thời gian chạy do tác động đối với tình trạng hệ thống. Chúng tôi sẽ sớm chia sẻ các yêu cầu tối thiểu cần thiết để sử dụng SDK Thời gian chạy có hiệu quả.

Hình thức giao tiếp

Vì các ứng dụng và SDK hiện chạy trong cùng một quy trình nên hình thức giao tiếp giữa chúng là tự do và không có trung gian. Ngoài ra, Android cho phép giao tiếp trong ứng dụng ngay cả khi hoạt động giao tiếp bắt đầu và kết thúc bằng SDK. Mô hình giao tiếp luồng tự do này hỗ trợ nhiều trường hợp sử dụng khác nhau mà vẫn mang đến khả năng chia sẻ dữ liệu chưa tiết lộ giữa các ứng dụng và giữa các SDK ở trong và giữa các ứng dụng. Chúng tôi đang đề xuất nội dung cập nhật sau đây cho mô hình giao tiếp này nhằm tìm cách tạo ra sự cân bằng giữa giá trị của hoạt động giao tiếp và việc hiện thực hoá các mục tiêu đã nêu.

Ứng dụng với SDK

Giao diện giữa ứng dụng và SDK là cách giao tiếp thông dụng nhất với SDK, và API của SDK bao gồm rất nhiều sự đổi mới và khác biệt của giao diện người dùng. Chúng tôi cố gắng duy trì khả năng đổi mới và tạo ra sự khác biệt cho API của SDK. Do đó, đề xuất của chúng tôi giúp SDK có thể hiển thị API cho ứng dụng, và bảo đảm rằng ứng dụng có thể được hưởng lợi từ toàn bộ những tính năng đổi mới.

Do cấu trúc ranh giới quy trình của SDK Thời gian chạy, chúng tôi dự định tạo ra một lớp dồn, có thể truy cập trong ứng dụng, để chuyển lệnh gọi và phản hồi API hoặc lệnh gọi lại trên ranh giới này giữa ứng dụng và SDK. Chúng tôi dự định rằng giao diện cho lớp dồn này sẽ do nhà phát triển SDK xác định và được tạo bằng các công cụ tạo nguồn mở chính thức mà chúng tôi phát triển.

Với đề xuất này, chúng tôi muốn nhà phát triển ứng dụng và SDK không phải dồn mã nguyên mẫu mà vẫn mang lại sự linh hoạt cho nhà phát triển SDK và đảm bảo rằng mã SDK chạy trong SDK Thời gian chạy để hiện thực các mục tiêu về quyền riêng tư. Nếu chúng tôi tiến hành theo cách này, công cụ và ngôn ngữ xác định API cần được thiết kế bằng dữ liệu đầu vào của bạn.

Mô hình tương tác chung sẽ như sau:

  • Ứng dụng gọi SDK thông qua giao diện, truyền vào lệnh gọi lại.
  • SDK đáp ứng không đồng bộ với các yêu cầu và phản hồi bằng lệnh gọi lại.
  • Điều này được khái quát hoá vào mô hình nhà xuất bản – người đăng ký bất kỳ, nghĩa là một ứng dụng có thể đăng ký các sự kiện trong SDK bằng lệnh gọi lại, và khi những sự kiện này xảy ra, lệnh gọi lại sẽ được kích hoạt.

Hệ quả của cấu trúc trên quy trình mới của đề xuất này là có 2 vòng đời quy trình cần được quản lý: một vòng đời cho ứng dụng và vòng đời còn lại cho SDK Thời gian chạy. Đề xuất của chúng tôi tìm cách tự động hoá nhiều nhất có thể, giảm thiểu tác động đối với nhà phát triển ứng dụng và SDK. Hình 3 minh hoạ cách tiếp cận mà chúng tôi đang cân nhắc:

Sơ đồ
Hình 3. Sơ đồ trình tự minh hoạ các hoạt động tương tác trong khi khởi động ứng dụng và SDK.

Nền tảng sẽ hiển thị API mới dành cho ứng dụng để chủ động tải SDK vào quy trình SDK Thời gian chạy, nhận thông báo về các thay đổi đối với trạng thái của quy trình và tương tác với SDK được tải vào SDK Thời gian chạy.

  • Trước tiên, một ứng dụng sẽ đăng ký lệnh gọi lại để nhận được thông báo về các sự kiện, chẳng hạn như khi quy trình SDK Thời gian chạy khởi động lại hoặc khi SDK gửi dữ liệu trở lại ứng dụng. Ví dụ: một ứng dụng có thể đăng ký lệnh gọi lại trong khi khởi động ứng dụng.

    Đoạn mã sau đây cung cấp ví dụ minh hoạ về API:

    SdkRuntimeManager.registerSdkRuntimeCallback(SdkRuntimeCallback callback,
        Executor executor)
    
  • Trước khi một ứng dụng có thể tương tác với SDK, trước tiên, ứng dụng sẽ yêu cầu nền tảng tải SDK. Để đảm bảo tính toàn vẹn của hệ thống, các ứng dụng sẽ chỉ định SDK mà chúng dự định tải trong tệp kê khai, và những SDK này sẽ là những SDK duy nhất được phép tải. Ứng dụng có thể yêu cầu tải một SDK cụ thể hoặc tất cả các SDK được xác định trong tệp kê khai. Điều này sẽ cho phép ứng dụng tải SDK trong khi khởi động ứng dụng hoặc khi khởi động lại SDK Thời gian chạy.

    Đoạn mã sau đây cung cấp ví dụ minh hoạ về API:

    SdkRuntimeManager.loadSdk(String sdkName, LoadSdkCallback callback,
        Executor executor)
    
    SdkRuntimeManager.loadAllSdks(LoadAllSdksCallback callback,
        Executor executor)
    
  • Sau khi một SDK được tải vào SDK Thời gian chạy, đề xuất của chúng tôi cho phép ứng dụng tương tác với SDK thông qua lớp dồn được tạo trên giao diện của SDK. Các lệnh gọi được dồn thông qua một sendData() theo cách không rõ ràng. Ví dụ minh hoạ:

    SdkRuntimeManager.sendData(String sdkName, Bundle data)
    
  • Như đã giải thích trong phần hiển thị nội dung nghe nhìn của tài liệu này, để một ứng dụng có SDK hiển thị nội dung nghe nhìn trong chế độ xem, ứng dụng có thể gọi cho requestSurfacePackage() và tìm nạp SurfaceControlViewHost.SurfacePackage phù hợp.

    Đoạn mã sau đây cung cấp ví dụ minh hoạ về API:

    SdkRuntimeManager.requestSurfacePackage(String sdkName, IBinder appToken,
        int displayId, Bundle extraParams,
        RequestSurfacePackageCallback callback, Executor executor)
    
  • Sau đó, ứng dụng nhúng SurfacePackage đã trả về vào SurfaceView qua setChildSurfacePackage API trong SurfaceView.

    Đoạn mã sau đây cung cấp ví dụ minh hoạ về API:

    SurfaceView.setChildSurfacePackage(SurfacePackage surfacePackage)
    

Đề xuất của chúng tôi là API sendData() và requestSurfacePackage() phải mang tính khái quát và không dùng để ứng dụng gọi trực tiếp. Thay vào đó, các API này phải được gọi bằng tham chiếu API đã tạo được thảo luận ở trên để giảm gánh nặng cho nhà phát triển ứng dụng.

SDK với SDK

Trường hợp này là khi 2 SDK trong cùng một ứng dụng cần giao tiếp. Điều này có thể xảy ra khi một SDK nhất định được thiết kế để bao gồm các SDK cấu thành, và có thể xảy ra khi 2 SDK từ các bên khác nhau cần cộng tác để đáp ứng yêu cầu của ứng dụng gọi.

Có 2 trường hợp chính cần xem xét:

  • Khi cả hai SDK đều là RE. Trong trường hợp này, cả hai SDK đều đang chạy trong SDK Thời gian chạy với tất cả các biện pháp bảo vệ, bao gồm cả thiếu khả năng phản xạ để khám phá. SDK không thể giao tiếp như chúng thường làm trong ứng dụng hiện nay. Do đó, chúng tôi đang thiết kế các API trong SDK Thời gian chạy để đăng ký và khám phá SDK nhằm tạo điều kiện cho hoạt động giao tiếp.
  • Khi chỉ có một SDK là RE.
    • Nếu SDK gọi đang chạy trong ứng dụng, điều này sẽ không khác với trường hợp ứng dụng đang gọi SDK thứ hai trong SDK Thời gian chạy.
    • Nếu SDK gọi đang chạy trong SDK Thời gian chạy, chúng tôi dự định hiển thị lệnh gọi sendData(...) chung mà mã trong ứng dụng lắng nghe, xử lý và phản hồi bằng lệnh gọi lại đã cung cấp. Chúng tôi đang tích cực nghiên cứu vân đề này.

Chúng tôi xem xét các trường hợp sử dụng sau đây khi thiết kế dữ liệu gốc:

  1. Dàn xếp và đặt giá thầu. Nhiều SDK quảng cáo cung cấp tính năng dàn xếp hoặc đặt giá thầu, trong đó SDK gọi nhiều SDK khác cho một lượt hiển thị quảng cáo (dàn xếp) hoặc để thu thập tín hiệu chạy phiên đấu giá (đặt giá thầu). Thông thường, SDK điều phối sẽ gọi các SDK khác thông qua bộ chuyển đổi do SDK điều phối cung cấp. Do các dữ liệu gốc ở trên, SDK điều phối, RE hay không phải RE, sẽ có thể truy cập vào tất cả SDK RE và không phải RE để hoạt động bình thường. Chúng tôi đang tích cực nghiên cứu về vấn đề hiển thị trong bối cảnh này.
  2. Khám phá tính năng. Một số sản phẩm SDK bao gồm các SDK nhỏ hơn mà thông qua một quy trình khám phá liên SDK, xác định bộ tính năng dành cho nhà phát triển ứng dụng. Chúng tôi hy vọng việc đăng ký và khám phá dữ liệu gốc sẽ hỗ trợ trường hợp sử dụng này.
  3. Mô hình thuê bao của nhà xuất bản. Một số SDK sẽ có một nhà xuất bản sự kiện trung tâm mà các SDK khác hoặc ứng dụng có thể đăng ký thông báo thông qua các lệnh gọi lại. Các liệu gốc nói trên sẽ hỗ trợ trường hợp sử dụng này.

Ứng dụng với ứng dụng

Đây là hoạt động giao tiếp liên ứng dụng, trong đó tối thiểu một trong hai quy trình đang giao tiếp là SDK RE. Do là hoạt động giao tiếp trên các ứng dụng, đây là vectơ tự nhiên để chia sẻ dữ liệu chưa tiết lộ.

Do đó, SDK Thời gian chạy sẽ không thể giao tiếp với bất kỳ quy trình ứng dụng nào khác thông qua bất kỳ phương tiện nào, bao gồm cả thông báo và ý định. Vậy nên, không có SDK nào trong SDK Thời gian chạy có thể giao tiếp với bất kỳ ứng dụng nào khác hoặc bất kỳ SDK RE nào được một ứng dụng khác lưu trữ.

Quá trình phát triển

Nguyên tắc chính trong đề xuất này là giảm thiểu tác động đối với hệ sinh thái của nhà phát triển trong phạm vi có thể. Do đó, đề xuất này sẽ cung cấp cho nhà phát triển một tập hợp toàn diện các công cụ phát triển để viết, tạo, gỡ lỗi ứng dụng và SDK RE. Tuy nhiên, để đảm bảo tính toàn vẹn của đề xuất này, sẽ có một số thay đổi đối với cách định cấu hình, ghi nhận và tạo ứng dụng và SDK RE.

Ghi nhận quyền tác giả

Android Studio và công cụ liên quan sẽ được cập nhật để nhận biết được môi trường SDK Thời gian chạy, giúp đảm bảo rằng nhà phát triển đã định cấu hình chính xác các ứng dụng và SDK RE, đồng thời đảm bảo rằng các lệnh gọi cũ hoặc không được hỗ trợ đều được cập nhật lên lựa chọn thay thế mới hơn nếu phù hợp. Trong giai đoạn ghi nhận quyền tác giả, có một vài bước mà đề xuất của chúng tôi yêu cầu nhà phát triển thực hiện.

Nhà phát triển ứng dụng

Các ứng dụng cần chỉ định SDK RE và phần phụ thuộc chứng chỉ SDK trong tệp kê khai ứng dụng. Trong đề xuất, chúng tôi coi đây là nguồn đáng tin cậy từ các nhà phát triển ứng dụng trong suốt đề xuất này. Ví dụ:

  • Tên: Tên gói của SDK hoặc thư viện.
  • Phiên bản chính: Mã phiên bản chính của SDK.
  • Chuỗi đại diện chứng chỉ: Chuỗi đại diện chứng chỉ của bản dựng SDK. Đối với một bản dựng nhất định, chúng tôi đề xuất nhà phát triển SDK lấy và đăng ký giá trị này thông qua cửa hàng ứng dụng liên quan.

Điều này chỉ áp dụng cho các SDK do cửa hàng ứng dụng phân phối, cho dù là RE hay không. Các ứng dụng liên kết SDK theo cách tĩnh sẽ sử dụng cơ chế phần phụ thuộc hiện tại.

Do mục tiêu giảm thiểu tác động đối với nhà phát triển, điều quan trọng là sau khi chỉ định cấp độ API mục tiêu hỗ trợ SDK Thời gian chạy, nhà phát triển ứng dụng chỉ cần có một bản dựng cho dù bản dựng đó chạy trên thiết bị có hay không hỗ trợ SDK Thời gian chạy.

Nhà phát triển SDK

Trong thiết kế đề xuất của chúng tôi, nhà phát triển SDK RE cần khai báo rõ ràng một thành phần mới đại diện cho SDK hoặc thực thể thư viện trong tệp kê khai. Ngoài ra, cũng cần có một tập hợp giá trị tương tự làm phần phụ thuộc, cùng với phiên bản nhỏ:

  • Tên: Tên gói của SDK hoặc thư viện.
  • Phiên bản chính: Mã phiên bản chính của SDK.
  • Phiên bản nhỏ: Mã phiên bản nhỏ của SDK.

Nếu nhà phát triển SDK RE có các SDK RE khác làm phần phụ thuộc thời gian xây dựng, họ có thể cần khai báo các SDK đó theo cách giống với cách nhà phát triển ứng dụng khai báo phần phụ thuộc tương tự. SDK RE phụ thuộc vào các SDK không phải RE sẽ liên kết với chúng theo cách tĩnh. Điều này có thể gây ra vấn đề được phát hiện vào thời gian xây dựng hoặc trong khi thông qua thử nghiệm nếu SDK không phải RE cần chức năng mà SDK Thời gian chạy không hỗ trợ hoặc nếu SDK phải chạy trong quy trình của ứng dụng.

Nhà phát triển SDK RE có thể muốn tiếp tục hỗ trợ các thiết bị không được RE hỗ trợ, chẳng hạn như Android 12 trở xuống và như đã đề cập trong phần Tình trạng hệ thống của tài liệu này, các thiết bị Android 13 cấp thấp có tài nguyên hệ thống rất giới hạn. Chúng tôi đang nghiên cứu các phương thức tiếp cận để đảm bảo nhà phát triển SDK có thể giữ lại một cơ sở mã để hỗ trợ môi trường RE và môi trường không phải RE.

Bản dựng

Nhà phát triển ứng dụng

Chúng tôi kỳ vọng rằng không có nhiều thay đổi đối với nhà phát triển ứng dụng trong bước xây dựng. Các phần phụ thuộc SDK, cho dù được phân phối cục bộ hay do cửa hàng ứng dụng phân phối (RE hay không), đều cần tồn tại trên máy để tìm lỗi mã nguồn, biên dịch và xây dựng. Chúng tôi dự định rằng Android Studio tóm tắt những thông tin chi tiết này từ nhà phát triển ứng dụng thông qua cách sử dụng bình thường và thực hiện theo cách minh bạch nhất có thể.

Mặc dù chúng tôi dự kiến rằng bản GỠ LỖI cần bao gồm tất cả mã và biểu tượng sẽ xuất hiện trong bản gỡ lỗi để có thể gỡ lỗi, bản PHÁT HÀNH phải xoá tất cả các SDK do cửa hàng ứng dụng phân phối (RE hoặc không) khỏi cấu phần mềm cuối cùng (không bắt buộc).

Chúng tôi đang ở giai đoạn thiết kế ban đầu và sẽ chia sẻ nhiều hơn khi có thông tin cụ thể.

Nhà phát triển SDK

Chúng tôi đang nghiên cứu lộ trình để đảm bảo rằng các phiên bản RE và không phải RE của một SDK có thể được tích hợp vào một cấu phần mềm để phân phối. Qua đó, nhà phát triển ứng dụng không cần hỗ trợ các bản dựng riêng cho phiên bản RE và không phải RE của SDK.

Tương tự như với ứng dụng, SDK phần phụ thuộc do cửa hàng ứng dụng phân phối sẽ cần tồn tại trên máy để tìm lỗi mã nguồn, biên dịch và xây dựng. Chúng tôi kỳ vọng Android Studio sẽ hỗ trợ việc này một cách liền mạch.

Thử nghiệm

Nhà phát triển ứng dụng

Như đã mô tả trong đề xuất, nhà phát triển ứng dụng có thể thử nghiệm ứng dụng của họ trên các thiết bị chạy Android 13 theo cách thông thường. Sau khi họ đã tích hợp ứng dụng, ứng dụng có thể được cài đặt trên trình mô phỏng hoặc thiết bị RE. Quá trình cài đặt này sẽ đảm bảo SDK chính xác được cài đặt vào SDK Thời gian chạy cho thiết bị hoặc trình mô phỏng, cho dù SDK được lấy từ kho lưu trữ SDK từ xa hay bộ nhớ đệm từ hệ thống bản dựng.

Nhà phát triển SDK

Nhà phát triển SDK thường sử dụng các ứng dụng thử nghiệm tại chỗ trên thiết bị và trình mô phỏng để thử nghiệm quá trình phát triển của họ. Đề xuất của chúng tôi không thay đổi điều này. Ngoài ra, quá trình xác thực trong ứng dụng sẽ tuân theo cùng các bước như đã nêu đối với nhà phát triển ứng dụng ở trên, với một cấu phần mềm bản dựng cho cả ứng dụng RE và ứng dụng không phải RE. Nhà phát triển SDK sẽ có thể sử dụng mã cho dù mã có trong SDK Thời gian chạy hay không, mặc dù có một số giới hạn về công cụ gỡ lỗi và lập hồ sơ nâng cao. Chúng tôi đang tích cực nghiên cứu khía cạnh này.

Hoạt động phân phối

Thông qua đề xuất thiết kế tách riêng một ứng dụng khỏi các SDK của nó, bạn có thể phân phối SDK trên cửa hàng ứng dụng. Đây là khả năng chung, không dành riêng cho bất kỳ cửa hàng ứng dụng cụ thể nào. Bạn sẽ thấy rõ những lợi ích sau đây:

  • Đảo bảo chất lượng và sự nhất quán của SDK.
  • Đơn giản hoá hoạt động xuất bản cho nhà phát triển SDK.
  • Tiến hành phát hành các bản cập nhật phiên bản nhỏ của SDK cho ứng dụng đã cài đặt.

Để hỗ trợ phân phối SDK, cửa hàng ứng dụng có thể cần cung cấp hầu hết các khả năng sau:

  • Cơ chế để nhà phát triển SDK tải các SDK có thể phân phối trên cửa hàng ứng dụng lên cửa hàng, cập nhật, hoàn nguyên và có thể là xoá chúng.
  • Một cơ chế để đảm bảo tính toàn vẹn của SDK và nguồn của SDK, ứng dụng và nguồn của ứng dụng và giải quyết các phần phụ thuộc.
  • Một cơ chế triển khai SDK trên thiết bị đáng tin cậy, có hiệu quả một cách nhất quán.

Câu hỏi thường gặp

  1. SDK liên quan đến quảng cáo là gì?

    Một SDK hỗ trợ bất kỳ phần nào trong hoạt động nhắm mục tiêu người dùng bằng tin nhắn vì mục đích thương mại, trên các ứng dụng không phải của nhà quảng cáo. SDK này bao gồm, nhưng không giới hạn ở, SDK phân tích, trong đó các nhóm người dùng có thể được tạo để nhắm mục tiêu tiếp theo, SDK phân phát quảng cáo, SDK tránh sử dụng sai và SDK tránh gian lận cho quảng cáo, SDK tương tác và SDK phân bổ.

  2. Có SDK nào chạy được trong SDK Thời gian chạy không?

    Mặc dù trọng tâm ban đầu là dành cho SDK liên quan đến quảng cáo, các nhà phát triển SDK không liên quan đến quảng cáo mong muốn một quy trình chuyên nghiệp về quyền riêng tư và tin rằng họ có thể vận hành trong những điều kiện đã nêu ở trên có thể chia sẻ ý kiến phản hồi về các SDK của họ đang chạy trong SDK Thời gian chạy. Tuy nhiên, SDK Thời gian chạy không được thiết kế để tương thích với tất cả các thiết kế SDK. Ngoài các hạn chế đã nêu, SDK Thời gian chạy có thể không phù hợp với những SDK cần giao tiếp trong thời gian thực hoặc giao tiếp thông lượng cao với ứng dụng máy chủ.

  3. Tại sao chúng tôi chọn tách biệt quy trình thay vì tách biệt trong thời gian chạy dựa trên Java của một ứng dụng?

    Hiện tại, thời gian chạy dựa trên Java chưa sẵn sàng hỗ trợ các ranh giới bảo mật cần thiết để có sự bảo đảm về quyền riêng tư mà chúng tôi mong muốn mang lại cho người dùng Android. Nếu đang cố gắng triển khai giải pháp như vậy, bạn cần nỗ lực trong nhiều năm mà không chắc chắn sẽ thành công. Do đó, chúng tôi chọn sử dụng các ranh giới quy trình. Đây là công nghệ chúng ta đều hiểu rõ và đã được thử nghiệm theo thời gian.