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

Trước đây, Android chỉ hỗ trợ kích thước trang bộ nhớ 4 KB, vốn có tối ưu hoá hiệu suất bộ nhớ hệ thống cho tổng dung lượng bộ nhớ trung bình Các thiết bị Android thường có. Kể từ Android 15, AOSP hỗ trợ các thiết bị được định cấu hình để sử dụng kích thước trang là 16 KB (16 KB thiết bị). Nếu ứng dụng của bạn dùng thư viện NDK, hãy trực tiếp hoặc gián tiếp thông qua SDK, thì bạn sẽ phải tạo lại ứng dụng để hoạt động trên các thiết bị 16 KB này.

Khi nhà sản xuất thiết bị tiếp tục tạo ra các thiết bị có số lượng lớn bộ nhớ vật lý (RAM), nhiều thiết bị trong số này sẽ sử dụng 16 KB (và lớn hơn) để tối ưu hoá hiệu suất của thiết bị. Đang thêm khả năng hỗ trợ các thiết bị có kích thước trang 16 KB cho phép ứng dụng của bạn chạy trên trên thiết bị và giúp ứng dụng của bạn hưởng lợi từ hiệu suất tương ứng. các điểm cải tiến khác. Nếu không biên dịch lại, các ứng dụng có thể không hoạt động trên các thiết bị 16 KB khi chúng được sản xuất trong các bản phát hành Android sau này.

Để giúp bạn tăng cường hỗ trợ cho ứng dụng của mình, chúng tôi đã cung cấp hướng dẫn về cách kiểm tra nếu ứng dụng của bạn bị ảnh hưởng thì làm cách nào để xây dựng 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 trình mô phỏng (bao gồm cả Android 15) hình ảnh hệ thống cho Trình mô phỏng Android).

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

Các thiết bị được định cấu hình với kích thước trang 16 KB sử dụng nhiều bộ nhớ hơn một chút trung bình, nhưng cũng 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 khi hệ thống chịu áp lực về bộ nhớ: Trung bình thấp hơn 3,16%, với mức cải thiệ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ụ điện năng trong quá trình khởi chạy ứng dụng: trung bình giảm 4,56%
  • Khởi động máy ảnh nhanh hơn: trung bình khởi động nóng nhanh hơn 4,48% và khởi động nguội nhanh hơn 6,60%
  • Cải thiện thời gian khởi động hệ thống: trung bình cải thiện 8% (khoảng 950 mili giây)

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

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

Nếu ứng dụng sử dụng bất kỳ mã gốc nào, thì bạn nên tạo lại ứng dụng để hỗ trợ các thiết bị 16 KB. Nếu không chắc chắn rằng ứ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, sau đó kiểm tra việc căn chỉnh các phân đoạn ELF cho mọi thư viện dùng chung mà bạn tìm thấy.

Nếu ứng dụng chỉ sử dụng mã viết bằng ngôn ngữ lập trình Java hoặc Kotlin, bao gồm tất cả cá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ó hiện tượng hồi quy ngoài dự kiế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 sử dụng mã gốc nếu có bất kỳ điều kiện nào sau đây:

  • Ứng dụng của bạn sử dụng mã C/C++ (gốc) bất kỳ. Nếu ứng dụng của bạn sử dụng Android NDK, thì ứng dụng đó sẽ sử dụng mã gốc.
  • Ứng dụng của bạn liên kết với mọi thư viện gốc hoặc phần phụ thuộc (chẳng hạn như SDK) của bên thứ ba sử dụng các thư viện hoặc phần phụ thuộc đó.
  • Ứng dụng của bạn được tạo bằng một trình tạo ứng dụng bên thứ ba sử dụng các 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 đã tạo. Để 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 một 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 APK…)

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

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

  4. Tìm trong thư mục lib, thư mục này 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, ứng dụng của bạn sẽ sử dụng mã gốc. Nếu không có tệp đối tượng dùng chung hoặc không có thư mục lib, thì ứng dụng của bạn không sử dụng mã gốc.

    Chế độ xem Công cụ phân tích APK cho thấy có các tệp đối tượng dùng chung

Kiểm tra việc căn chỉnh các phân đoạn ELF cho thư viện dùng chung

Đối với mọi thư viện dùng chung, hãy xác minh rằng các phân đoạn ELF của thư viện dùng chung được căn chỉnh đúng cách bằng cách căn chỉnh ELF 16 KB. Nếu đang phát triển trên Linux hoặc macOS, bạn có thể sử dụng tập lệnh check_elf_alignment.sh như mô tả trong phần sau. Bạn cũng có thể trực tiếp sử dụng các công cụ dòng lệnh.

Sử dụng tập lệnh check_elf_alignment.sh (Linux hoặc macOS)

Hãy làm theo các bước sau để kiểm tra việc căn chỉnh các phân đoạn ELF bằng tập lệnh check_elf_alignment.sh:

  1. Lưu tập lệnh check_elf_alignment.sh vào một tệp.

  2. Chạy tập lệnh trên tệp APK của ứng dụng:

    check_elf_alignment.sh APK_NAME.apk
    

    Tập lệnh sẽ xuất ra ALIGNED hoặc UNALIGNED cho tất cả thư viện dùng chung arm64-v8a.

  3. Nếu có bất kỳ thư viện dùng chung arm64-v8a hoặc x86_64 nào là UNALIGNED, bạn cần cập nhật gói cho các thư viện đó, sau đó biên dịch lại ứng dụng và kiểm thử lại bằng cách làm theo các bước trong phần này.

Trực tiếp sử dụng công cụ dòng lệnh

Hãy làm theo các bước sau để kiểm tra việc căn chỉnh các phân đoạn ELF bằng cách sử dụng trực tiếp các công cụ dòng lệnh:

  1. Đảm bảo bạn đã cài đặt cả Công cụ bản dựng SDK Android phiên bản 35.0.0 trở lên và Android NDK bằng Trình quản lý SDK trong Android Studio hoặc công cụ dòng lệnh sdkmanager.
  2. Giải nén tệp APK của ứng dụng:

    Linux hoặc macOS

    unzip APK_NAME.apk -d /tmp/my_apk_out
    

    Windows (PowerShell)

    Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
    
  3. Trong thư mục tạm thời mà bạn đã trích xuất tệp APK, hãy kiểm tra nội dung của thư mục lib để tìm các tệp đối tượng dùng chung (.so). Đây là những tệp đối tượng dùng chung mà bạn đã thấy trong khi xác định thư viện gốc bằng Công cụ phân tích APK. Chạy lệnh sau trên mỗi tệp đối tượng dùng chung:

    Linux hoặc macOS

    SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOAD
    

    Windows (PowerShell)

    SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"
    

    Trong đó, SDK_ROOT_LOCATION là đường dẫn đến thư mục mà bạn đã cài đặt SDK Android, SHARED_OBJECT_FILE là tên của tệp đối tượng dùng chung mà bạn đang kiểm tra và NDK_VERSION là phiên bản của Android NDK mà bạn đã cài đặt (ví dụ: 28.0.12433566). Kết quả sẽ có dạng như sau đối với mỗi tệp mà bạn kiểm tra:

    LOAD off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14
    LOAD off    0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14
    LOAD off    0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14
    
  4. Kiểm tra các dòng đầu ra để đảm bảo rằng các phân đoạn tải không có giá trị thấp hơn 2**14. Nếu có phân đoạn tải nào là 2**13, 2**12 hoặc giá trị thấp hơn, bạn cần cập nhật gói cho các thư viện đó, sau đó biên dịch lại ứng dụng và kiểm thử lại bằng cách làm theo các bước trong phần này.

  5. Tiếp theo, hãy chạy công cụ dòng lệnh zipalign trên tệp APK của ứng dụng:

    Linux hoặc macOS

    SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apk
    

    Windows (PowerShell)

    SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apk
    

    Trong đó, SDK_ROOT_LOCATION là đường dẫn đến thư mục bạn đã cài đặt SDK Android và APK_NAME là tên của tệp APK của ứng dụng. Dòng cuối cùng của kết quả sẽ hiển thị "Xác minh thành công" nếu tất cả thư viện dùng chung đều được căn chỉnh chính xác.

    Nếu xác minh không thành công, bạn cần phải điều chỉnh lại một số thư viện dùng chung. Vì vậy, bạn cần cập nhật gói cho các thư viện đó, sau đó biên dịch lại ứng dụng và kiểm thử lại bằng cách làm theo các bước trong phần này.

Tạo ứng dụng có hỗ trợ thiết bị 16 KB

Để hỗ trợ các thiết bị 16 KB, các ứng dụng sử dụng mã gốc phải hoàn tất các bước được nêu trong các phần sau. Nếu bạn cập nhật lên AGP phiên bản 8.5.1 trở lên và NDK phiên bản r28 trở lên, đồng thời sử dụng các phần phụ thuộc tạo sẵn tương thích với 16 KB, thì theo mặc định, các ứng dụng sẽ tương thích với 16 KB.

Cập nhật gói của thư viện dùng chung

Bạn nên nâng cấp lên AGP phiên bản 8.5.1 trở lên và sử dụng thư viện dùng chung không nén.

AGP phiên bản 8.5.1 trở lên

Các thiết bị 16 KB yêu cầu ứng dụng đi kèm với thư viện dùng chung không nén để căn chỉnh các thư viện đó trên ranh giới nén 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.5.1 trở lên. Hãy tham khảo phần Trợ lý nâng cấp trình bổ trợ Android cho Gradle để biết thông tin chi tiết về quy trình nâng cấp.

AGP phiên bản 8.5 trở xuống

Nếu bạn không thể nâng cấp AGP lên phiên bản 8.5.1 trở lên, thì giải pháp thay thế là chuyển sang sử dụng thư viện dùng chung được nén. Cập nhật cấu hình Gradle để Gradle nén các thư viện dùng chung khi đóng gói ứng dụng nhằm tránh các vấn đề cài đặt ứng dụng với thư viện dùng chung không được căn 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 bằng cách căn chỉnh ELF 16 KB

Các thiết bị 16 KB yêu cầu các phân đoạn ELF của thư viện dùng chung phải được căn chỉnh đúng cách bằng cách sử dụng tính năng căn chỉnh ELF 16 KB để ứng dụng của bạn chạy được.

Để 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 trong một trong các phần sau, tuỳ thuộc vào phiên bản Android NDK mà bạn đang sử dụng.

Android NDK r28 trở lên

Theo mặc định, NDK phiên bản r28 trở lên biên dịch 16 KB được căn chỉnh.

Android NDK r27

Để hỗ trợ biên dịch các thư viện dùng chung được căn chỉnh 16 KB bằng 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:

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:

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

Android NDK r26 trở xuống

Để hỗ trợ việc biên dịch các thư viện dùng chung được căn chỉnh 16 KB bằng 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")

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

Ngay cả khi ứng dụng của bạn được căn chỉnh 16 KB, ứng dụng 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 điều này, hãy hoàn tất 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ố hoặc thực thể PAGE_SIZE trong logic mã của bạn giả định rằng kích thước trang của thiết bị là 4 KB (4096).

    Thay vào đó, hãy sử dụng getpagesize() hoặc sysconf(_SC_PAGESIZE).

  2. Tìm các trường hợp sử dụng mmap() và các API khác yêu cầu đối số được căn chỉnh theo trang và thay thế bằng các đối số thay thế nếu cần.

Trong một số trường hợp, nếu ứng dụng của bạn sử dụng PAGE_SIZE làm giá trị thuận tiện không liên kết với kích thước trang cơ bản, thì điều này sẽ không khiến ứng dụng của bạn bị lỗi khi sử dụng ở chế độ 16 KB. Tuy nhiên, nếu giá trị này được truyền đến hạt nhân bằng mmap mà không có MAP_FIXED, thì hạt nhân vẫn sử dụng toàn bộ trang, gây lãng phí một số bộ nhớ. Vì những lý do này, PAGE_SIZE không được xác định khi chế độ 16 KB được bật trên NDK r27 trở lên.

Nếu ứng dụng của bạn sử dụng PAGE_SIZE theo cách này và không bao giờ trực tiếp truyền giá trị này đến hạt nhân, thì thay vì sử dụng PAGE_SIZE, hãy tạo một biến mới có tên mới để phản ánh rằng biến đó được dùng cho các mục đích khác và không phản ánh trang bộ nhớ thực.

Kiểm tra SDK để xem có hỗ trợ 16 KB hay không

Nhiều SDK tương thích với kích thước trang 16 KB, đặc biệt là nếu bạn tự tạo SDK hoặc tải các SDK tạo sẵn gần đây. Tuy nhiên, do một số SDK tạo sẵn hoặc phiên bản SDK không tương thích với 16 KB, bạn nên kiểm tra trang web của từng nhà cung cấp SDK để xác định phiên bản nào sẽ sử dụng với 16 KB.

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

Sau khi tạo ứng dụng hỗ trợ 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. Để thực hiện việc này, hãy làm theo các bước sau:

  1. Thiết lập SDK Android 15.

  2. Thiết lập một trong các môi trường kiểm thử sau:

  3. Khởi động thiết bị kiểm thử, sau đó chạy lệnh sau để xác minh rằng thiết bị đó đang sử dụng môi trường 16 KB:

    adb shell getconf PAGE_SIZE
    

    Lệnh này sẽ trả về giá trị 16384.

  4. Chạy lệnh zipalign sau đây để xác minh rằng ứng dụng của bạn đã được căn chỉnh 16 KB, trong đó APK_NAME là tên của tệp APK của ứng dụng:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  5. Kiểm thử kỹ lưỡng ứng dụng, tập trung vào mọi khía cạnh có thể bị ảnh hưởng bởi việc thay đổi các thực thể mã tham chiếu đến kích thước trang cụ thể.

Thiết lập Trình mô phỏng Android bằng hình ảnh hệ thống Android 15 dựa trên 16 KB

Để thiết lập môi trường 16 KB bằng Trình mô phỏng Android, hãy làm theo các bước sau:

  1. Hình ảnh hệ thống trình mô phỏng Android 15 dựa trên 16 KB tương thích với Android Studio Jellyfish | 2023.3.1 trở lên. Tuy nhiên, để có trải nghiệm tốt nhất khi làm việc với Android 15 Beta, hãy tải phiên bản xem trước mới nhất của Android Studio xuống.

    Hãy nhớ rằng bạn có thể giữ nguyên phiên bản Android Studio hiện có, vì bạn có thể cài đặt song song nhiều phiên bản Android Studio.

  2. Trong Android Studio, hãy nhấp vào Tool (Công cụ) > SDK Manager (Trình quản lý SDK).

  3. Trong thẻ SDK Platforms (Nền tảng SDK), hãy đánh dấu vào Show Package Details (Hiện chi tiết gói), sau đó mở rộng phần Android VanillaIceCream Preview (Bản dùng thử Android VanillaIceCream) và chọn một hoặc cả hai hình ảnh hệ thống trình mô phỏng sau đây, tuỳ thuộc vào thiết bị ảo mà bạn muốn tạo:

    • Hình ảnh hệ thống ARM 64 v8a thử nghiệm của API của Google có kích thước trang 16k
    • Hình ảnh hệ thống Intel x86_64 Atom có kích thước trang 16k thử nghiệm của API của Google

    Tải hình ảnh hệ thống trình mô phỏng 16 KB xuống bằng Trình quản lý SDK trong Android Studio

  4. Nhấp vào Apply > OK (Áp dụng > OK) để tải hình ảnh hệ thống mà bạn đã chọn xuống.

  5. Làm theo các bước để thiết lập thiết bị ảo cho Android 15 và khi được nhắc chọn hình ảnh hệ thống, hãy chọn hình ảnh hệ thống 16 KB mà bạn đã tải xuống. Nếu hình ảnh hệ thống 16 KB không được đề xuất tự động, bạn có thể tìm thấy hình ảnh đó trong thẻ Hình ảnh khác.

    Tìm hình ảnh trình mô phỏng 16 KB trong thẻ Hình ảnh khác

  1. Trong Trình quản lý thiết bị, hãy nhấp vào biểu tượng 3 dấu chấm bên cạnh hình ảnh 16 KB, sau đó nhấp vào Hiện trên ổ đĩa.
  2. Trong thư mục này, hãy tìm tệp config.ini.
  3. Thêm dòng sau vào tệp config.ini rồi lưu các thay đổi:

    kernel.parameters = androidboot.page_shift=14
    
  4. Để xác minh các thay đổi, hãy chạy lệnh sau. Lệnh này sẽ trả về 16384:

    adb shell getconf PAGE_SIZE
    

Bật chế độ 16 KB trên thiết bị bằng tuỳ chọn cho nhà phát triển

Bật/tắt nhà phát triển Khởi động có kích thước trang 16KB khởi động thiết bị ở chế độ 16 KB.

Kể từ Android 15 QPR1, bạn có thể sử dụng tuỳ chọn dành cho nhà phát triển có sẵn trên một số khởi động thiết bị ở chế độ 16 KB và tiến hành kiểm tra trên thiết bị.

Tuỳ chọn cho nhà phát triển này có trên các thiết bị sau:

  • Pixel 8 và 8 Pro (chạy Android 15 QPR1 Beta 1 trở lên)