Hạn chế đối với giao diện không phải SDK

Kể từ Android 9 (API cấp 28), nền tảng này sẽ hạn chế việc sử dụng giao diện không phải SDK. Các hạn chế này áp dụng mỗi khi ứng dụng tham chiếu đến một giao diện không phải SDK hoặc cố gắng nhận xử lý bằng cách sử dụng cơ chế phản chiếu (reflection) hoặc JNI. Những quy tắc hạn chế này được áp dụng nhằm giúp cải thiện trải nghiệm của người dùng và nhà phát triển, đồng thời giảm nguy cơ xảy ra sự cố cho người dùng cũng như trong quá trình phát hành khẩn cấp cho nhà phát triển. Để biết thêm thông tin về quyết định này, hãy xem nội dung Cải thiện độ ổn định bằng cách giảm mức sử dụng giao diện không phải SDK.

Phân biệt giao diện SDK và giao diện không phải SDK

Nhìn chung, giao diện SDK công khai là những giao diện xuất hiện trong Package Index (Chỉ mục gói) của khung Android. Phương thức xử lý giao diện không phải SDK là phương thức triển khai chi tiết mà API sẽ tóm tắt. Vì vậy, các giao diện này có thể thay đổi mà không cần thông báo trước.

Để tránh sự cố và hành vi ngoài dự kiến, ứng dụng chỉ nên sử dụng các phần của các lớp trong SDK được ghi trong tài liệu chính thức. Tức là bạn không nên truy cập các phương thức hoặc trường không được liệt kê trong SDK khi tương tác với một lớp bằng các cơ chế như cơ chế phản chiếu.

Danh sách API không phải SDK

Với mỗi bản phát hành Android, các giao diện bổ sung không phải SDK cũng bị hạn chế. Chúng tôi hiểu rằng những quy tắc hạn chế này có thể ảnh hưởng đến quy trình phát hành của bạn. Vì vậy, chúng tôi muốn đảm bảo rằng bạn có các công cụ để phát hiện hoạt động sử dụng giao diện không phải SDK, có cơ hội để gửi phản hồi cho chúng tôi, cũng như có thời gian để lập kế hoạch và điều chỉnh theo các chính sách mới.

Nhằm giảm thiểu tác động của quy định hạn chế các giao diện không phải SDK đối với quy trình phát triển của bạn, các giao diện không phải SDK sẽ được chia theo các danh sách để xác định mức độ hạn chế của việc sử dụng các SDK đó, tuỳ thuộc vào cấp độ API bạn đang nhắm đến. Bảng sau đây mô tả từng loại trong những danh sách này:

Danh sách Thẻ mã Nội dung mô tả
Danh sách chặn
  • blocked
  • Không dùng nữa: blacklist
Những giao diện không phải SDK mà bạn không thể sử dụng, bất kể cấp độ API mục tiêu của ứng dụng. Nếu ứng dụng của bạn cố gắng truy cập một trong những giao diện này, thì hệ thống sẽ gửi thông báo lỗi.
Chặn có điều kiện
  • max-target-x
  • Không dùng nữa: greylist-max-x

Kể từ Android 9 (API cấp 28), mỗi cấp độ API đều sẽ chứa các giao diện không phải SDK bị hạn chế khi một ứng dụng nhắm đến cấp độ API đó.

Các danh sách này được gắn nhãn theo cấp độ API tối đa (max-target-x) mà một ứng dụng có thể nhắm đến trước khi ứng dụng đó không còn truy cập được các giao diện không phải SDK trong danh sách đó nữa. Ví dụ: giao diện không phải SDK không bị chặn trong Android Pie nhưng hiện đã bị chặn trong Android 10 có trong danh sách max-target-p (greylist-max-p), trong đó "p" là viết tắt của Pie hoặc Android 9 (API cấp 28).

Nếu ứng dụng của bạn cố gắng truy cập vào một giao diện bị hạn chế ở cấp độ API mục tiêu, thì hệ thống sẽ coi như API đó thuộc danh sách chặn.

Không được hỗ trợ
  • unsupported
  • Không dùng nữa: greylist
Những giao diện không phải SDK không bị hạn chế và ứng dụng của bạn có thể sử dụng. Tuy nhiên, xin lưu ý rằng những giao diện này không được hỗ trợ và có thể thay đổi mà không có thông báo. Những giao diện này sẽ bị chặn có điều kiện trong các phiên bản Android sau này có trong danh sách max-target-x.
SDK
  • Cả public-apisdk
  • Không dùng nữa: Cả public-apiwhitelist
Những giao diện có thể sử dụng thoải mái và hiện được hỗ trợ trong khung Package Index (Chỉ mục gói) trong tài liệu chính thức của Android.
API kiểm thử
  • test-api
Những giao diện dùng để kiểm thử hệ thống nội bộ, chẳng hạn như những API hỗ trợ kiểm thử thông qua Bộ kiểm tra tính tương thích (CTS). Các API kiểm thử không nằm trong SDK. Kể từ Android 11 (API cấp 30), API kiểm thử sẽ được đưa vào danh sách chặn. Vì vậy, ứng dụng không được phép sử dụng các API này bất kể cấp độ API mục tiêu. Tất cả API kiểm thử đều không được hỗ trợ và có thể thay đổi mà không có thông báo, bất kể cấp độ API của nền tảng.

Mặc dù bạn có thể sử dụng một số giao diện không phải SDK (tuỳ thuộc vào cấp độ API mục tiêu của ứng dụng), nhưng việc sử dụng phương thức hoặc trường nào đó không phải SDK luôn có nguy cơ cao làm hỏng ứng dụng. Nếu ứng dụng của bạn dựa vào giao diện không phải SDK, thì bạn nên bắt đầu lập kế hoạch di chuyển sang giao diện SDK hoặc các giải pháp thay thế khác. Nếu không tìm được giải pháp thay thế cho việc sử dụng giao diện không phải SDK đối với một tính năng trong ứng dụng, thì bạn nên yêu cầu một API công khai mới.

Xác định xem giao diện thuộc danh sách nào

Danh sách giao diện không phải SDK được xây dựng trong nền tảng. Xem các phần sau đây để biết thông tin về từng bản phát hành Android.

Android 15

Đối với Android 15 (API cấp 35), bạn có thể tải tệp sau đây xuống. Tệp này mô tả tất cả giao diện không phải SDK và danh sách tương ứng:

Tệp: hiddenapi-flags.csv

Giá trị tổng kiểm SHA-256: 40134e205e58922a708c453726b279a296e6a1f34a988abd90cec0f3432ea5a9

Để tìm hiểu thêm về những thay đổi đối với danh sách API không phải SDK trong Android 15, xem bài viết Thông tin cập nhật về các quy tắc hạn chế đối với giao diện không phải SDK trên Android 15.

Android 14

Đối với Android 14 (API cấp 34), bạn có thể tải tệp sau đây xuống. Tệp này mô tả tất cả giao diện không phải SDK và danh sách tương ứng:

Tệp: hiddenapi-flags.csv

Giá trị tổng kiểm SHA-256: 7e00db074cbe51c51ff4b411f7b48e98692951395c5c17d069c822cc1d0eae0f

Để tìm hiểu thêm về những thay đổi đối với danh sách API không phải SDK trong Android 14, hãy xem nội dung Thông tin cập nhật về những quy tắc hạn chế đối với giao diện không phải SDK trong Android 14.

Android 13

Đối với Android 13 (API cấp 33), bạn có thể tải tệp sau đây xuống. Tệp này mô tả tất cả các giao diện không phải SDK và danh sách tương ứng:

Tệp: hiddenapi-flags.csv

Giá trị tổng kiểm SHA-256: 233a277aa8ac475b6df61bffd95665d86aac6eb2ad187b90bf42a98f5f2a11a3

Để tìm hiểu thêm về những thay đổi đối với danh sách API không phải SDK trong Android 13, bao gồm cả các lựa chọn thay thế API công khai được đề xuất đối với API bị chặn có điều kiện trong Android 13, hãy xem nội dung Thông tin cập nhật về những quy tắc hạn chế đối với giao diện không phải SDK trong Android 13.

Android 12

Đối với Android 12 (API cấp 31), bạn có thể tải tệp sau đây xuống. Tệp này mô tả tất cả giao diện không phải SDK và danh sách tương ứng:

Tệp: hiddenapi-flags.csv

Giá trị tổng kiểm SHA-256: 40674ff4291eb268f86561bf687e69dbd013df9ec9531a460404532a4ac9a761

Để tìm hiểu thêm về những thay đổi đối với danh sách API không phải SDK trong Android 12, bao gồm cả các lựa chọn thay thế API công khai được đề xuất đối với API bị chặn có điều kiện trong Android 12, hãy xem nội dung Thay đổi đối với danh sách trong Android 12.

Android 11

Đối với Android 11 (API cấp 30), bạn có thể tải tệp sau đây xuống. Tệp này mô tả tất cả giao diện không phải SDK và danh sách tương ứng.

Tệp: hiddenapi-flags.csv

Giá trị tổng kiểm SHA-256: a19d839f4f61dc9c94960ae977b2e0f3eb30f880ba1ffe5108e790010b477a56

Để tìm hiểu thêm về những thay đổi đối với danh sách API không phải SDK trong Android 11, bao gồm cả các lựa chọn thay thế API công khai được đề xuất đối với API bị chặn có điều kiện trong Android 11, hãy xem nội dung Thay đổi đối với danh sách trong Android 11.

Android 10

Đối với Android 10 (API cấp 29), bạn có thể tải tệp sau đây xuống. Tệp này mô tả tất cả giao diện không phải SDK và danh sách tương ứng.

Tệp: hiddenapi-flags.csv

Giá trị tổng kiểm SHA-256: f22a59c215e752777a114bd9b07b0b6b4aedfc8e49e6efca0f99681771c5bfeb

Để tìm hiểu thêm về những thay đổi đối với danh sách API không phải SDK trong Android 10, bao gồm cả các lựa chọn thay thế API công khai được đề xuất đối với API bị chặn có điều kiện trong Android 10, hãy xem nội dung Thay đổi đối với danh sách trong Android 10.

Android 9

Đối với Android 9 (API cấp 28), tệp văn bản sau đây chứa danh sách API không phải SDK không bị hạn chế (nêu trong danh sách xám): hiddenapi-light-greylist.txt.

Danh sách chặn (blacklist) và danh sách API bị chặn có điều kiện (danh sách xám đen) được bắt nguồn từ thời gian xây dựng.

Tạo danh sách qua AOSP (Dự án nguồn mở Android)

Khi làm việc với AOSP, bạn có thể tạo tệp hiddenapi-flags.csv chứa tất cả giao diện không phải SDK và danh sách tương ứng. Để thực hiện việc này, hãy tải nguồn AOSP xuống rồi chạy lệnh sau:

m out/soong/hiddenapi/hiddenapi-flags.csv

Sau đó, bạn có thể tìm thấy tệp này ở vị trí sau:

out/soong/hiddenapi/hiddenapi-flags.csv

Hành vi dự kiến khi truy cập giao diện bị hạn chế không phải SDK

Bảng sau đây mô tả hành vi mà bạn có thể lường trước nếu ứng dụng của bạn cố gắng truy cập vào một giao diện không phải SDK thuộc danh sách chặn.

Phương tiện truy cập Kết quả
Hướng dẫn Dalvik tham chiếu trường Gửi NoSuchFieldError
Hướng dẫn Dalvik tham chiếu phương pháp Gửi NoSuchMethodError
Phản chiếu bằng cách sử dụng Class.getDeclaredField() hoặc Class.getField() Gửi NoSuchFieldException
Phản chiếu bằng cách sử dụng Class.getDeclaredMethod(), Class.getMethod() Gửi NoSuchMethodException
Phản chiếu bằng cách sử dụng Class.getDeclaredFields(), Class.getFields() Không có thành phần nào không phải SDK trong kết quả
Phản chiếu bằng cách sử dụng Class.getDeclaredMethods(), Class.getMethods() Không có thành phần nào không phải SDK trong kết quả
JNI sử dụng env->GetFieldID() Trả về NULL, gửi NoSuchFieldError
JNI sử dụng env->GetMethodID() Trả về NULL, gửi NoSuchMethodError

Kiểm thử giao diện không phải SDK trên ứng dụng

Có một số phương pháp mà bạn có thể sử dụng để kiểm thử giao diện không phải SDK trên ứng dụng.

Kiểm thử bằng ứng dụng có thể gỡ lỗi

Bạn có thể kiểm thử giao diện không phải SDK bằng cách tạo và chạy một ứng dụng có thể gỡ lỗi (debuggable app) trên thiết bị hoặc trình mô phỏng chạy Android 9 (API cấp 28) trở lên. Hãy đảm bảo rằng thiết bị hoặc trình mô phỏng mà bạn đang sử dụng phù hợp với cấp độ API mục tiêu của ứng dụng.

Trong khi chạy kiểm thử trên ứng dụng, hệ thống sẽ in một thông điệp nhật ký nếu ứng dụng của bạn truy cập một số giao diện cụ thể không phải SDK. Bạn có thể kiểm thử thông điệp nhật ký của ứng dụng để tìm những thông tin chi tiết sau:

  • Lớp (class), tên (name) và kiểu (type) được khai báo (ở định dạng mà Android Runtime sử dụng).
  • Phương tiện truy cập: sử dụng cơ chế liên kết, phản chiếu, hoặc sử dụng JNI.
  • Danh sách chứa giao diện không phải SDK đó.

Bạn có thể sử dụng adb logcat để truy cập những thông điệp nhật ký này; chúng xuất hiện trong PID của ứng dụng đang chạy. Ví dụ: có thể đọc một mục trong nhật ký như sau:

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

Kiểm thử bằng StrictMode API

Bạn cũng có thể kiểm thử các giao diện không phải SDK bằng cách sử dụng StrictMode API. Hãy sử dụng phương thức detectNonSdkApiUsage để bật tính năng này. Sau khi bật StrictMode API, bạn có thể nhận lệnh gọi lại cho mỗi lần sử dụng giao diện không phải SDK bằng cách sử dụng penaltyListener, trong đó bạn có thể triển khai phương thức xử lý tuỳ chỉnh. Đối tượng Violation được cung cấp trong lệnh gọi lại xuất phát từ Throwable, còn dấu vết ngăn xếp kèm theo cho biết ngữ cảnh sử dụng.

Kiểm thử bằng công cụ veridex

Bạn cũng có thể chạy công cụ phân tích tĩnh veridex trên tệp APK. Công cụ veridex quét toàn bộ cơ sở mã của tệp APK (bao gồm cả mọi thư viện của bên thứ ba) và báo cáo mọi lần sử dụng giao diện không phải SDK mà công cụ này tìm thấy.

Công cụ veridex có một số hạn chế như sau:

  • Không phát hiện được lệnh gọi qua JNI.
  • Chỉ phát hiện được một tập hợp con lệnh gọi qua phản chiếu.
  • Số liệu phân tích về các đường dẫn mã không hoạt động chỉ áp dụng cho các lượt kiểm tra cấp độ API.
  • Chỉ có thể chạy trên các máy hỗ trợ hướng dẫn SSE4.2 và POPCNT.

Windows

Tệp nhị phân Windows gốc không được cung cấp, nhưng bạn có thể chạy công cụ veridex trên Windows bằng cách thực thi tệp nhị phân Linux bằng Windows Subsystem for Linux (Hệ thống phụ Windows dành cho Linux – WSL). Trước khi làm theo các bước trong phần này, hãy cài đặt WSL rồi chọn Ubuntu làm bản phân phối Linux.

Sau khi cài đặt Ubuntu, hãy chạy một thiết bị đầu cuối Ubuntu rồi làm theo những bước sau:

  1. Tải công cụ veridex xuống từ kho lưu trữ tạo sẵn cho Android Runtime.
  2. Giải nén nội dung của tệp appcompat.tar.gz.
  3. Trong thư mục đã giải nén, hãy tìm tệp veridex-linux.zip rồi giải nén tệp này.
  4. Chuyển đến thư mục đã giải nén rồi chạy lệnh sau, trong đó your-app.apk là tệp APK mà bạn muốn kiểm thử:

    ./appcompat.sh --dex-file=your-app.apk
    

macOS

Để chạy công cụ veridex trên macOS, hãy làm theo các bước sau:

  1. Tải công cụ veridex xuống từ kho lưu trữ tạo sẵn cho Android Runtime.
  2. Giải nén nội dung của tệp appcompat.tar.gz.
  3. Trong thư mục đã giải nén, hãy tìm tệp veridex-mac.zip rồi giải nén tệp này.
  4. Chuyển đến thư mục đã giải nén rồi chạy lệnh sau, trong đó /path-from-root/your-app.apk là đường dẫn đến tệp APK mà bạn muốn kiểm thử, bắt đầu từ thư mục gốc của hệ thống:

    ./appcompat.sh --dex-file=/path-from-root/your-app.apk
    

Linux

Để chạy công cụ veridex trên Linux, hãy làm theo các bước sau:

  1. Tải công cụ veridex xuống từ kho lưu trữ tạo sẵn cho Android Runtime.
  2. Giải nén nội dung của tệp appcompat.tar.gz.
  3. Trong thư mục đã giải nén, hãy tìm tệp veridex-linux.zip rồi giải nén tệp này.
  4. Chuyển đến thư mục đã giải nén rồi chạy lệnh sau, trong đó your-app.apk là tệp APK mà bạn muốn kiểm thử:

    ./appcompat.sh --dex-file=your-app.apk
    

Kiểm thử bằng công cụ tìm lỗi mã nguồn của Android Studio

Bất cứ khi nào bạn tạo bản dựng ứng dụng trong Android Studio, công cụ tìm lỗi mã nguồn (lint tool) sẽ kiểm tra mã nguồn của bạn để tìm các vấn đề tiềm ẩn. Nếu ứng dụng của bạn sử dụng giao diện không phải SDK, thì có thể bạn sẽ thấy lỗi bản dựng hoặc cảnh báo, tuỳ thuộc vào việc giao diện đó thuộc danh sách nào.

Bạn cũng có thể chạy công cụ tìm lỗi mã nguồn qua dòng lệnh hoặc chạy yêu cầu kiểm tra theo cách thủ công trên một dự án, thư mục hoặc tệp cụ thể.

Kiểm thử bằng Play Console

Khi bạn tải ứng dụng lên một kênh kiểm thử trong Play Console, ứng dụng của bạn sẽ được tự động kiểm thử để tìm các vấn đề tiềm ẩn và báo cáo trước khi ra mắt sẽ được tạo. Nếu ứng dụng của bạn sử dụng giao diện không phải SDK, thì lỗi hoặc cảnh báo sẽ xuất hiện trong báo cáo trước khi ra mắt, tuỳ thuộc vào việc giao diện đó thuộc danh sách nào.

Để biết thêm thông tin, hãy xem phần Khả năng tương thích với Android trong nội dung Sử dụng báo cáo trước khi ra mắt để xác định các vấn đề.

Yêu cầu API công khai mới

Nếu không tìm được giải pháp thay thế việc sử dụng giao diện không phải SDK cho một tính năng trong ứng dụng, thì bạn có thể yêu cầu API công khai mới bằng cách tạo yêu cầu về tính năng trong công cụ theo dõi lỗi của chúng tôi.

Khi tạo yêu cầu về tính năng, hãy cung cấp những thông tin sau:

  • API không được hỗ trợ mà bạn đang sử dụng, bao gồm cả phần mô tả đầy đủ trong thông báo logcat Accessing hidden ....
  • Lý do mà bạn cần sử dụng các API đó, bao gồm cả thông tin về tính năng cấp cao cần có API, chứ không chỉ có thông tin cấp thấp.
  • Tại sao mọi API công khai có liên quan đều chưa đáp ứng được mục đích của bạn.
  • Mọi giải pháp thay thế khác mà bạn đã thử và lý do chúng đều không hiệu quả.

Khi bạn cung cấp những thông tin chi tiết này trong yêu cầu về tính năng, khả năng được cấp API công khai mới sẽ tăng lên.

Câu hỏi khác

Phần này bao gồm câu trả lời cho một số câu hỏi khác mà nhà phát triển hay hỏi:

Câu hỏi chung

Làm cách nào để Google chắc chắn rằng sẽ nắm bắt được nhu cầu của tất cả ứng dụng thông qua công cụ theo dõi lỗi?

Chúng tôi đã tạo các danh sách ban đầu cho Android 9 (API cấp 28) thông qua bản phân tích tĩnh về các ứng dụng đã được bổ sung bằng các phương thức sau:

  • kiểm thử thủ công các ứng dụng hàng đầu trên Play và ngoài Play
  • báo cáo nội bộ
  • tự động thu thập dữ liệu qua người dùng nội bộ
  • báo cáo bản dùng thử cho nhà phát triển
  • bản phân tích tĩnh bổ sung được thiết kế để tính thêm kết quả dương tính giả một cách thận trọng

Khi đánh giá danh sách cho mỗi bản phát hành mới, chúng tôi xem xét hoạt động sử dụng API cũng như phản hồi của nhà phát triển thông qua công cụ theo dõi lỗi.

Làm cách nào để tôi có thể cho phép truy cập vào giao diện không phải SDK?

Bạn có thể cho phép truy cập vào các giao diện không phải SDK trên thiết bị phát triển bằng cách sử dụng các lệnh adb để thay đổi chính sách thực thi API. Các lệnh mà bạn sử dụng còn tuỳ thuộc vào cấp độ API. Những lệnh này không đòi hỏi thiết bị bị can thiệp hệ thống.

Android 10 (API cấp 29) trở lên

Để cho phép truy cập, hãy sử dụng các lệnh adb sau

:

adb shell settings put global hidden_api_policy  1

Để đặt lại chính sách thực thi API về chế độ cài đặt mặc định, hãy sử dụng lệnh sau:

adb shell settings delete global hidden_api_policy
Android 9 (API cấp 28)

Để cho phép truy cập, hãy sử dụng các lệnh adb sau:

adb shell settings put global hidden_api_policy_pre_p_apps  1
adb shell settings put global hidden_api_policy_p_apps 1

Để đặt lại chính sách thực thi API về chế độ cài đặt mặc định, hãy sử dụng các lệnh sau:

adb shell settings delete global hidden_api_policy_pre_p_apps
adb shell settings delete global hidden_api_policy_p_apps

Bạn có thể đặt số nguyên trong chính sách thực thi API thành một trong các giá trị sau:

  • 0: Vô hiệu hoá tất cả giao diện người dùng không phải SDK. Việc sử dụng chế độ cài đặt này sẽ vô hiệu hoá tất cả thông điệp nhật ký về mức sử dụng giao diện không phải SDK và ngăn bạn kiểm thử ứng dụng bằng cách sử dụng StrictMode API. Bạn không nên sử dụng chế độ cài đặt này.
  • 1: Cho phép truy cập tất cả giao diện không phải SDK, nhưng in thông điệp nhật ký kèm theo cảnh báo đối với mọi hoạt động sử dụng giao diện không phải SDK. Khi sử dụng chế độ cài đặt này, bạn cũng có thể kiểm thử ứng dụng bằng cách sử dụng StrictMode API.
  • 2: Không cho phép sử dụng giao diện không phải SDK thuộc danh sách chặn hoặc bị chặn có điều kiện cho cấp độ API mục tiêu của bạn.

Câu hỏi về danh sách giao diện không phải SDK

Tôi có thể tìm thấy các danh sách API không phải SDK ở đâu trong ảnh hệ thống?

Chúng được mã hoá trong các bit cờ truy cập trường và phương thức trong các tệp dex nền tảng. Không có tệp riêng biệt nào trong ảnh hệ thống cho thấy các danh sách này.

Danh sách API không phải SDK có như nhau trên các thiết bị của nhà sản xuất thiết bị gốc (OEM) có cùng phiên bản Android không?

OEM có thể thêm giao diện riêng vào danh sách chặn (danh sách cấm) nhưng không thể xoá giao diện khỏi danh sách API AOSP không phải SDK. CDD ngăn chặn những thay đổi như vậy và các chương trình kiểm thử CTS giúp đảm bảo rằng Android Runtime thực thi danh sách.

Có quy định hạn chế nào đối với giao diện không phải NDK trong mã gốc không?

SDK Android bao gồm cả giao diện Java. Nền tảng này đã bắt đầu hạn chế quyền truy cập giao diện không phải NDK đối với mã C/C++ gốc trong Android 7 (API cấp 26). Để biết thêm thông tin, hãy xem nội dung Cải thiện độ ổn định bằng quy định hạn chế biểu tượng C/C++ riêng tư trong Android N.

Dự kiến có hạn chế nào đối với thao tác trong tệp dex2oat hoặc DEX không?

Chúng tôi hiện không có kế hoạch hạn chế quyền truy cập vào tệp nhị phân dex2oat, nhưng chúng tôi không có ý định làm ổn định định dạng tệp DEX hoặc giao diện công khai ngoài các phần được chỉ định công khai trong định dạng có thể thực thi Dalvik. Chúng tôi giữ quyền sửa đổi hoặc loại bỏ dex2oat và các phần chưa được chỉ định của định dạng DEX vào bất cứ lúc nào. Ngoài ra, xin lưu ý rằng các tệp bắt nguồn từ dex2oat như ODEX (còn gọi là OAT), VDEX và CDEX đều là các định dạng không xác định.

Nếu một SDK quan trọng của bên thứ ba (ví dụ: một trình làm rối mã nguồn) không thể tránh việc sử dụng giao diện không phải SDK nhưng lại cam kết duy trì khả năng tương thích với các phiên bản Android trong tương lai thì sao? Trong trường hợp này, Android có thể từ bỏ các yêu cầu về khả năng tương thích không?

Chúng tôi chưa có kế hoạch từ bỏ các yêu cầu về khả năng tương thích theo từng SDK. Nếu nhà phát triển SDK chỉ có thể duy trì khả năng tương thích bằng cách dựa vào các giao diện trong danh sách không được hỗ trợ (trước đây là danh sách xám), thì họ nên bắt đầu lên kế hoạch chuyển sang giao diện SDK hoặc các phương án thay thế khác và yêu cầu API công khai mới bất cứ khi nào không tìm được giải pháp thay thế cho việc sử dụng giao diện không phải SDK.

Các quy định hạn chế đối với giao diện không phải SDK có áp dụng cho tất cả ứng dụng (bao gồm cả ứng dụng hệ thống và ứng dụng bên thứ nhất, không chỉ ứng dụng bên thứ ba) hay không?

Có, tuy nhiên, chúng tôi miễn trừ các ứng dụng được ký bằng khoá nền tảng và một số ứng dụng ảnh hệ thống. Xin lưu ý rằng các trường hợp miễn trừ này chỉ áp dụng cho các ứng dụng thuộc ảnh hệ thống (hoặc ứng dụng ảnh hệ thống mới cập nhật). Danh sách này chỉ dành cho các ứng dụng xây dựng dựa trên API nền tảng riêng tư, thay vì API SDK (khi LOCAL_PRIVATE_PLATFORM_APIS := true).