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 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 hay 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 sử dụng hệ điều hành 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 hoặc phần phụ thuộc nào của bên thứ ba sử dụng chúng.
  • Ứng dụng của bạn được xây dựng bằng 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 ứng dụng APK. Để xác định xem ứng dụng của bạn dùng mã gốc hay thư viện, hãy làm theo các bước sau các bước:

  1. Mở Android Studio, rồi nhấp vào File > (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 > (Tạo >) Phân tích APK...

    Tuỳ chọn trình đơn Xây dựng trong Studio để chạy APK
Trình phân tích

  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 được chia sẻ (.so) (nếu có) đều có sẵn. Nếu có tệp đối tượng dùng chung nào, ứng dụng của bạn sẽ sử dụng tệp 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 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 tệp đối tượng dùng chung
hiện tại

Xây dựng ứng dụng có hỗ trợ các 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 phần sau.

Cập nhật cách đóng gói thư viện dùng chung

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

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

Thiết bị 16 KB yêu cầu các ứng dụng đi kèm với thư viện dùng chung không nén phải căn chỉnh chúng trên ranh giới căn chỉnh zip 16 KB. Để làm việc này, bạn cần phải 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 Android Phần Trợ lý nâng cấp của trình bổ trợ Gradle để biết thông tin chi tiết về quá trình nâng cấp.

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

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

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

Để biên dịch ứng dụng bằng cách sử dụng 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 đây, tuỳ thuộc vào phiên bản Android NDK mà bạn đang sử dụng đang sử dụng.

Android NDK r26 trở xuống

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

ndk-build

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

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

CMake

Cập nhật CMakeLists.txt để bật 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 điều chỉnh cho phù hợp với kích thước 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 trình liên kết gắn cờ 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

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

Ngay cả khi ứng dụng được căn chỉnh theo kích thước 16 KB, ứng dụng vẫn có thể gặp lỗi nếu đặt trong mã của bạn, giả sử rằng thiết bị đang sử dụng kích thước trang cụ thể. Để tránh tình trạng nà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 PAGE_SIZE hằng số hoặc thực thể trong logic của mã giả định rằng trang của thiết bị có kích thước 4 KB (4096).

    Thay vào đó, 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 căn chỉnh trang đối số và thay thế bằng các 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 nhưng không phải là giá trị đó gắn với kích thước trang cơ bản thì điều này sẽ không làm cho ứ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 vào nhân với mmap mà không có MAP_FIXED, hạt nhân vẫn sử dụng toàn bộ trang sẽ làm lãng phí một phần bộ nhớ. Vì những lý do này, PAGE_SIZE không được xác định khi là 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ờ truyền trực tiếp giá trị này đến hạt nhân, sau đó thay vì sử dụng PAGE_SIZE, hãy tạo một biến mới bằng một biến mới để phản ánh rằng tên đó được sử dụng cho các mục đích khác và không phản ánh một trang kỷ niệm.

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

Sau khi tạo ứng dụng có hỗ trợ thiết bị 16 KB, bạn nên: kiểm thử ứng dụng của bạn trong môi trường 16 KB để xem ứng dụng có trải nghiệm không bất kỳ sự hồi quy nào. Để 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ị thử nghiệm rồi chạy lệnh sau để xác minh rằng tệp này sử dụng môi trường 16 KB:

    adb shell getconf PAGE_SIZE
    

    Lệnh này cần trả về giá trị 16384.

  4. Đối với mọi thư viện dùng chung, hãy xác minh rằng thư viện dùng chung Phân đoạn ELF là căn chỉnh đúng cách bằng cách sử dụng căn chỉnh ELF 16 KB. Bạn có thể sử dụng tập lệnh này để hãy trợ giúp về quy trình này:

    #!/bin/bash
    
    # usage: alignment.sh path to search for *.so files
    
    dir="$1"
    
    RED="\e[31m"
    GREEN="\e[32m"
    ENDCOLOR="\e[0m"
    
    matches="$(find $dir -name "*.so" -type f)"
    IFS=$'\n'
    for match in $matches; do
      res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)"
      if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then
        echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"
      else
        echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"
      fi
    done
    
    1. Lưu tập lệnh vào một tệp, chẳng hạn như alignment.sh.

    2. Giải nén tệp APK của ứng dụng:

      unzip APK_NAME.apk -d /tmp/my_apk_out
      
    3. Chạy tập lệnh trên các tệp đã giải nén trong /tmp/my_apk_out thư mục:

      alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
      

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

    4. Nếu thư viện dùng chung trên arm64-v8a có trạng thái là UNALIGNED, thì 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 tra lại bằng cách làm theo các bước trong phần này.

  5. Chạy lệnh zipalign sau đây để xác minh rằng ứng dụng của bạn 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
    
  6. Kiểm thử ứng dụng kỹ lưỡng, tập trung vào bất kỳ khía cạnh nào có thể bị ảnh hưởng bởi thay đổi các phiên bản 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 các bước:

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

    Hãy nhớ rằng bạn có thể giữ 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.

  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 mục Show Package Details (Hiện chi tiết gói), sau đó mở rộng phần Bản dùng thử Android VanillaIceCream rồi 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 bạn muốn tạo:

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

    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
Phòng thu

  4. Nhấp vào Áp dụng > OK để tải bất kỳ hình ảnh hệ thống nào 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à thời điểm đượ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 tính năng này không được tự động đề xuất, bạn có thể tìm thấy Hình ảnh hệ thống dài 16 KB trong thẻ Hình ảnh khác.

    Tìm hình ảnh trình mô phỏng 16 KB trong Other Image (Hình ảnh khác)
phím tab