Hỗ trợ kích thước trang 16 khảo sát KB

Trước đây, Android chỉ hỗ trợ các kích thước trang bộ nhớ 4 KB, giúp tối ưu hoá hiệu suất bộ nhớ hệ thống cho tổng dung lượng bộ nhớ trung bình mà các thiết bị Android thường có. Kể từ Android 15, Android sẽ hỗ trợ các thiết bị được định cấu hình để sử dụng kích thước trang là 16 KB (thiết bị 16 KB).

Khi nhà sản xuất thiết bị tiếp tục xây dựng các thiết bị có dung lượng bộ nhớ thực (RAM) lớn hơn, nhiều thiết bị trong số này có thể sẽ được định cấu hình với kích thước trang 16 KB (và sau cùng là lớn hơn) để tối ưu hoá hiệu suất của thiết bị. Việc thêm tính năng hỗ trợ cho các thiết bị 16 KB sẽ cho phép ứng dụng của bạn chạy trên các thiết bị này và giúp ứng dụng được hưởng lợi từ những điểm cải tiến về hiệu suất liên quan. Để giúp bạn giải quyết vấn đề này, chúng tôi đã hướng dẫn cách kiểm tra xem ứng dụng của bạn có bị ảnh hưởng hay không, cách tạo lại ứng dụng (nếu có) và cách kiểm thử ứng dụng trong môi trường 16 KB bằng cả trình mô phỏng và thiết bị thực.

Lợi ích và mức tăng hiệu suất

Các thiết bị được định cấu hình có kích thước trang 16 KB sử dụng bộ nhớ nhiều hơn một chút, nhưng cũng có được nhiều điểm cải tiến về hiệu suất cho cả hệ thống và ứng dụng:

  • Giảm thời gian khởi chạy ứng dụng trong khi hệ thống chịu áp lực về bộ nhớ: trung bình thấp hơn 3,16%, với nhiều cải tiến đáng kể hơn (lên đến 30%) đối với một số ứng dụng mà chúng tôi thử nghiệm
  • Giảm mức tiêu thụ pin trong khi khởi chạy ứng dụng: trung bình giảm 4,56%
  • Khởi động máy ảnh nhanh hơn: khởi động nóng nhanh hơn trung bình 4,48% và khởi động nguội nhanh hơn trung bình 6,60%
  • Cải thiện thời gian khởi động hệ thống: trung bình tăng 1,5% (khoảng 0,8 giây)

Những điểm cải tiến này dựa trên quy trình kiểm thử ban đầu của chúng tôi, và kết quả trên thiết bị thực tế có thể sẽ khác. Chúng tôi sẽ phân tích thêm về lợi ích tiềm năng của ứng dụng trong quá trình thử nghiệm.

Kiểm tra xem ứng dụng của bạn có bị ảnh hưởng không

Nếu ứng dụng của bạn sử dụng bất kỳ mã gốc nào, thì bạn nên tạo lại ứng dụng có hỗ trợ cho thiết bị 16 KB. Nếu không chắc ứng dụng của mình có sử dụng mã gốc hay không, bạn có thể sử dụng Công cụ phân tích APK để xác định xem có mã gốc nào hay không.

Nếu ứng dụng của bạn chỉ dùng mã được viết bằng ngôn ngữ lập trình Java hoặc Kotlin, bao gồm tất cả thư viện hoặc SDK, thì ứng dụng đã hỗ trợ thiết bị 16 KB. Tuy nhiên, bạn nên kiểm thử ứng dụng trong môi trường 16 KB để xác minh rằng không có sự hồi quy không mong muốn nào trong hành vi của ứng dụng.

Ứng dụng có sử dụng mã gốc không?

Ứng dụng của bạn sử dụng mã gốc nếu thuộc bất kỳ trường hợp nào sau đây:

  • Ứng dụng của bạn dùng mã C/C++ (gốc) bất kỳ. Nếu ứng dụng của bạn dùng Android NDK thì ứng dụng sẽ dùng mã gốc.
  • Ứng dụng của bạn liên kết với bất kỳ thư viện gốc nào của bên thứ ba.
  • Ứng dụng của bạn được xây dựng bởi một trình tạo ứng dụng bên thứ ba có sử dụng thư viện gốc trên thiết bị.

Xác định thư viện gốc bằng Công cụ phân tích APK

Công cụ phân tích APK là công cụ giúp bạn đánh giá nhiều khía cạnh của tệp APK đã dựng. Để xác định xem ứng dụng của bạn sử dụng mã gốc hay thư viện, hãy làm theo các bước sau:

  1. Mở Android Studio, sau đó nhấp vào File > Open (Tệp > Mở) rồi chọn dự án bất kỳ.
  2. Trên thanh trình đơn, hãy nhấp vào Build > Analyze APK... (Tạo > Phân tích tệp APK...).

    Tuỳ chọn trình đơn Studio Build để chạy Công cụ phân tích APK

  3. Chọn tệp APK bạn muốn phân tích.

  4. Tìm trong thư mục lib, nơi lưu trữ các tệp đối tượng dùng chung (.so) (nếu có). Nếu có bất kỳ tệp đối tượng dùng chung nào, thì ứng dụng sẽ sử dụng mã gốc. Nếu không có tệp đối tượng dùng chung nào hoặc không có thư mục lib thì ứng dụng không sử dụng mã gốc.

    Khung hiển thị Công cụ phân tích APK cho thấy có các tệp đối tượng được chia sẻ

Xây dựng ứng dụng với khả năng hỗ trợ thiết bị 16 KB

Để hỗ trợ các thiết bị 16 KB, các ứng dụng dùng mã gốc phải hoàn tất các bước được nêu trong những phần sau.

Cập nhật lên AGP phiên bản 8.3 trở lên

Các thiết bị 16 KB yêu cầu các ứng dụng đi kèm với thư viện chia sẻ không nén phải căn chỉnh các thiết bị đó trên ranh giới điều chỉnh theo zip 16 KB. Để làm việc này, bạn cần nâng cấp lên Trình bổ trợ Android cho Gradle (AGP) phiên bản 8.3 trở lên. Tham khảo phần Trợ lý nâng cấp của trình bổ trợ Android cho Gradle để biết thông tin chi tiết về quy trình nâng cấp.

Bạn nên sử dụng các thư viện dùng chung không nén, nhưng nếu không thể nâng cấp AGP lên phiên bản 8.3 trở lên, thì bạn có thể chuyển sang sử dụng các thư viện dùng chung được nén. Hãy cập nhật cấu hình Gradle để yêu cầu Gradle nén các thư viện dùng chung khi đóng gói ứng dụng của bạn nhằm tránh các vấn đề khi cài đặt ứng dụng khi các thư viện dùng chung chưa được điều chỉnh.

Groovy

Trong tệp build.gradle, hãy thêm tuỳ chọn sau:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

Kotlin

Trong tệp build.gradle.kts, hãy thêm tuỳ chọn sau:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
  }
}

Biên dịch ứng dụng của bạn bằng cách sử dụng căn chỉnh ELF 16 KB

Các thiết bị có dung lượng 16 KB yêu cầu các phân đoạn ELF của thư viện chia sẻ được căn chỉnh đúng cách bằng cách căn chỉnh ELF 16 KB để chạy được ứng dụng.

Để biên dịch ứng dụng bằng cách căn chỉnh ELF 16 KB, hãy hoàn thành các bước ở một trong những phần sau đây tuỳ thuộc vào phiên bản Android NDK mà bạn đang dùng.

Android NDK r26 trở xuống

Để hỗ trợ biên dịch các thư viện dùng chung được căn chỉnh 16 KB với Android NDK phiên bản r26 trở xuống, bạn cần cập nhật cấu hình ndk-build hoặc cmake như sau:

ndk-build

Cập nhật Android.mk để bật tính năng căn chỉnh ELF 16 KB:

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"

CMake

Cập nhật CMakeLists.txt để bật tính năng căn chỉnh ELF 16 KB:

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")

Android NDK r27 trở lên

Để hỗ trợ biên dịch các thư viện dùng chung được căn chỉnh 16 KB với Android NDK phiên bản r27 trở lên, bạn cần cập nhật ndk-build, build.gradle, build.gradle.kts hoặc cờ trình liên kết như sau:

ndk-build

Trong Application.mk của bạn:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

Groovy

Trong tệp build.gradle, hãy đặt đối số -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON:

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {
      // For ndk-build, instead use the ndkBuild block.
      cmake {
        // Passes optional arguments to CMake.
        arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
      }
    }
  }
}

Kotlin

Trong tệp build.gradle.kts, hãy đặt đối số -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON:

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {
      // For ndk-build, instead use the ndkBuild block.
      cmake {
        // Passes optional arguments to CMake.
        arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
      }
    }
  }
}

Các hệ thống xây dựng khác

Chỉ định các cờ trình liên kết sau đây:

-Wl,-z,max-page-size=16384

Kiểm tra các phiên bản mã tham chiếu đến các kích thước trang cụ thể

Ngay cả khi ứng dụng được căn chỉnh 16 KB, ứng dụng của bạn vẫn có thể gặp lỗi nếu các vị trí trong mã giả định rằng thiết bị đang sử dụng một kích thước trang cụ thể. Để tránh tình trạng này, hãy hoàn thành các bước sau:

  1. Xoá mọi phần phụ thuộc được mã hoá cứng tham chiếu đến hằng số PAGE_SIZE hoặc các thực thể trong logic mã giả định rằng kích thước trang của thiết bị là 4 KB (4096).

    Hãy sử dụng getpagesize() hoặc sysconf(_SC_PAGESIZE).

  2. Tìm cách sử dụng mmap() và các API khác yêu cầu đối số căn chỉnh trang và thay thế bằng lựa chọn thay thế khi cần.

Kiểm thử ứng dụng trong môi trường 16 KB

Sau khi xây dựng ứng dụng có hỗ trợ các thiết bị 16 KB, bạn nên kiểm thử ứng dụng trong môi trường 16 KB để xem ứng dụng có bị hồi quy hay không. Để làm việc này, hãy sử dụng một trong các môi trường thử nghiệm sau: