16 केबी वाले पेज साइज़ का इस्तेमाल करें

अब तक, Android पर सिर्फ़ 4 केबी मेमोरी पेज का साइज़ काम करता था, जिसमें कुल मेमोरी की औसत मात्रा के लिए ऑप्टिमाइज़ की गई सिस्टम मेमोरी परफ़ॉर्मेंस आम तौर पर, Android डिवाइसों पर यह सुविधा ज़्यादा काम करती थी. Android 15 और इसके बाद के वर्शन में, AOSP काम करता है ऐसे डिवाइस जिन्हें 16 केबी (16 केबी) के पेज साइज़ का इस्तेमाल करने के लिए कॉन्फ़िगर किया गया है डिवाइसों के हिसाब से). अगर आपका ऐप्लिकेशन किसी भी NDK लाइब्रेरी का इस्तेमाल करता है, तो सीधे तौर पर है, तो आपको इसके लिए अपना ऐप्लिकेशन फिर से बनाना होगा: काम करता है.

जैसा कि डिवाइस बनाने वाली कंपनियां, बड़ी संख्या में डिवाइसों को बनाना जारी रख रही हैं फ़िज़िकल मेमोरी (रैम) का इस्तेमाल करते हैं, तो इनमें से कई डिवाइस 16 केबी (और पेज का साइज़ तय करना होता है. जोड़ा जा रहा है 16 केबी वाले पेज साइज़ वाले डिवाइसों पर काम करने से, आपका ऐप्लिकेशन इन डिवाइसों पर काम करता है डिवाइस और आपके ऐप्लिकेशन को इनसे जुड़ी परफ़ॉर्मेंस का फ़ायदा मिलता है सुधार किए गए हैं. फिर से कंपाइल किए बिना, हो सकता है कि ऐप्लिकेशन 16 केबी वाले डिवाइसों पर काम न करें करने के लिए डिज़ाइन किया गया है.

आपके ऐप्लिकेशन के लिए सहायता जोड़ने में आपकी मदद करने के लिए, हमने यह देखने का तरीका बताने के लिए दिशा-निर्देश दिए हैं अगर इसका असर आपके ऐप्लिकेशन पर पड़ा है, तो ऐप्लिकेशन को फिर से बनाएं (अगर लागू हो) और अपने ऐप्लिकेशन की जांच करने का तरीका एम्युलेटर का इस्तेमाल करके, 16 केबी एनवायरमेंट (इसमें Android 15 शामिल है) Android Emulator के लिए सिस्टम इमेज).

फ़ायदे और परफ़ॉर्मेंस में सुधार

配置为 16 KB 页面的设备平均使用的内存会略多,但系统和应用性能也会有所提升:

  • 在系统面临内存压力时缩短应用启动时间:平均降低了 3.16%,对于我们测试过的一些应用而言,改进幅度更显著(提升幅度高达 30%)
  • 降低应用启动时的功耗:平均降低 4.56%
  • 相机启动速度更快:平均热启动速度加快 4.48%,冷启动速度平均加快 6.60%
  • 缩短了系统启动时间:平均缩短了 1.5%(约 0.8 秒)

这些改进基于我们的初始测试,实际设备上的结果可能会有所不同。在继续测试的过程中,我们会进一步分析应用的潜在益处。

देखें कि क्या आपके ऐप्लिकेशन पर असर पड़ा है

如果您的应用使用任何原生代码,则您应重新构建支持 16 KB 设备的应用。如果您不确定自己的应用是否使用了原生代码,可以使用 APK 分析器来确定是否存在任何原生代码

如果您的应用仅使用以 Java 编程语言或 Kotlin 编写的代码(包括所有库或 SDK),那么该应用已经支持 16 KB 设备。不过,我们建议您在 16 KB 的环境中测试应用,以确认应用行为是否存在意外回归问题。

क्या आपका ऐप्लिकेशन, नेटिव कोड का इस्तेमाल करता है?

आपका ऐप्लिकेशन नेटिव कोड का इस्तेमाल तब करता है, जब इनमें से कोई भी शर्त लागू हो:

  • आपका ऐप्लिकेशन किसी भी C/C++ (नेटिव) कोड का इस्तेमाल करता है. अगर आपका ऐप्लिकेशन Android NDK का इस्तेमाल करता है, तो इसका मतलब है कि आपका ऐप्लिकेशन नेटिव कोड का इस्तेमाल करता है.
  • आपका ऐप्लिकेशन, तीसरे पक्ष की उन लाइब्रेरी या डिपेंडेंसी से लिंक होता है जो इनका इस्तेमाल करती हैं.
  • आपके ऐप्लिकेशन को तीसरे पक्ष के ऐसे ऐप्लिकेशन बिल्डर ने बनाया है जो डिवाइस पर नेटिव लाइब्रेरी का इस्तेमाल करता है.

APK ऐनालाइज़र का इस्तेमाल करके नेटिव लाइब्रेरी पहचानें

APK विश्लेषक एक टूल है. इसकी मदद से, बने हुए APK के अलग-अलग पहलुओं का आकलन किया जा सकता है. यह पता लगाने के लिए कि आपका ऐप्लिकेशन नेटिव कोड या लाइब्रेरी का इस्तेमाल करता है या नहीं, यह तरीका अपनाएं:

  1. Android Studio खोलें. इसके बाद, फ़ाइल > खोलें पर क्लिक करें और कोई प्रोजेक्ट चुनें.
  2. मेन्यू बार से, बिल्ड > APK का विश्लेषण करें... पर क्लिक करें

    APK ऐनालाइज़र लॉन्च करने के लिए Studio Build मेन्यू का विकल्प

  3. वह APK चुनें जिसका विश्लेषण करना है.

  4. lib फ़ोल्डर में देखें. इसमें शेयर किए गए ऑब्जेक्ट (.so) की फ़ाइलें हो सकती हैं. अगर शेयर किए गए ऑब्जेक्ट वाली कोई फ़ाइल मौजूद होती है, तो आपका ऐप्लिकेशन नेटिव कोड का इस्तेमाल करता है. अगर शेयर किए गए कोई ऑब्जेक्ट फ़ाइल मौजूद नहीं है या कोई lib फ़ोल्डर नहीं है, तो आपका ऐप्लिकेशन नेटिव कोड का इस्तेमाल नहीं करता.

    APK ऐनालाइज़र का व्यू, जिसमें शेयर की गई ऑब्जेक्ट फ़ाइलें मौजूद हैं

16 केबी वाले डिवाइसों के लिए अपना ऐप्लिकेशन बनाना

16 केबी वाले डिवाइस पर काम करने के लिए, नेटिव कोड का इस्तेमाल करने वाले ऐप्लिकेशन को नीचे दिए गए चरणों को पूरा करना होगा. अगर AGP के 8.5.1 या इसके बाद के वर्शन और NDK के r28 या इसके बाद के वर्शन पर अपडेट किया जाता है और 16 केबी के साथ काम करने वाली पहले से बनी डिपेंडेंसी का इस्तेमाल किया जाता है, तो ऐप्लिकेशन डिफ़ॉल्ट रूप से 16 केबी के साथ काम करते हैं.

शेयर की गई लाइब्रेरी की पैकेजिंग अपडेट करना

हमारा सुझाव है कि आप AGP के 8.5.1 या उसके बाद के वर्शन पर अपग्रेड करें और बिना संपीड़ित की गई शेयर की गई लाइब्रेरी का इस्तेमाल करें.

AGP का 8.5.1 या इसके बाद का वर्शन

16 केबी वाले डिवाइसों के लिए ज़रूरी है कि वे ऐप्लिकेशन जिनमें शेयर की गई बिना कंप्रेस की हुई लाइब्रेरी की सुविधा हो, ताकि उन्हें 16 केबी की ज़िप-अलाइन वाली सीमा पर अलाइन किया जा सके. ऐसा करने के लिए, आपको 'Android Gradle प्लग इन (AGP)' के 8.5.1 या इसके बाद वाले वर्शन पर अपग्रेड करना होगा. अपग्रेड की प्रोसेस के बारे में जानने के लिए, Android Gradle प्लग इन अपग्रेड असिस्टेंट सेक्शन देखें.

AGP वर्शन 8.5 या इससे पहले का वर्शन

अगर AGP को 8.5.1 या इसके बाद वाले वर्शन पर अपग्रेड नहीं किया जा सकता, तो दूसरा विकल्प यह है कि आप कंप्रेस की गई शेयर की गई लाइब्रेरी का इस्तेमाल करें. अपने Gradle कॉन्फ़िगरेशन को अपडेट करें, ताकि Gradle आपके ऐप्लिकेशन को पैकेज करते समय, शेयर की गई लाइब्रेरी को कंप्रेस कर सके. इससे, अलाइन न की गई शेयर की गई लाइब्रेरी की वजह से, ऐप्लिकेशन इंस्टॉल करने से जुड़ी समस्याओं से बचा जा सकता है.

ग्रूवी

अपनी build.gradle फ़ाइल में, यह विकल्प जोड़ें:

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

Kotlin

अपनी build.gradle.kts फ़ाइल में, यह विकल्प जोड़ें:

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

16 केबी ईएलएफ़ अलाइनमेंट का इस्तेमाल करके अपने ऐप्लिकेशन को कंपाइल करें

आपका ऐप्लिकेशन चल सके, इसके लिए 16 केबी डिवाइसों पर, शेयर की गई लाइब्रेरी के ईएलएफ़ सेगमेंट को 16 केबी ईएलएफ़ अलाइनमेंट का इस्तेमाल करके अलाइन करना ज़रूरी है.

16 केबी ईएलएफ़ अलाइनमेंट का इस्तेमाल करके अपने ऐप्लिकेशन को कंपाइल करने के लिए, इस्तेमाल किए जा रहे Android एनडीके के वर्शन के हिसाब से इनमें से किसी एक सेक्शन में दिया गया तरीका अपनाएं.

Android NDK r28 और इसके बाद वाला वर्शन

एनडीके वर्शन r28 और उसके बाद के वर्शन, डिफ़ॉल्ट रूप से कंपाइल 16 केबी-लाइन किए गए होते हैं.

Android एनडीके r27

Android NDK के r27 और इसके बाद के वर्शन के साथ, शेयर की गई 16 केबी अलाइन की गई लाइब्रेरी को इकट्ठा करने के लिए, आपको अपने ndk-build, build.gradle, build.gradle.kts या लिंकर फ़्लैग को इस तरह से अपडेट करना होगा:

ndk-build

आपके Application.mk में:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

ग्रूवी

अपनी build.gradle फ़ाइल में, आर्ग्युमेंट -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

अपनी build.gradle.kts फ़ाइल में, -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")
      }
    }
  }
}

अन्य बिल्ड सिस्टम

लिंकर के लिए ये फ़्लैग तय करें:

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

Android NDK r26 और उससे पहले के वर्शन

Android NDK के वर्शन r26 या उससे पहले के वर्शन के साथ, 16 केबी के अलाइन किए गए साइज़ वाली शेयर की गई लाइब्रेरी को कंपाइल करने के लिए, आपको अपने ndk-build या cmake कॉन्फ़िगरेशन को इस तरह अपडेट करना होगा:

ndk-build

16 केबी ईएलएफ़ अलाइनमेंट चालू करने के लिए, अपना Android.mk अपडेट करें:

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

CMake

16 केबी ईएलएफ़ अलाइनमेंट चालू करने के लिए, अपना CMakeLists.txt अपडेट करें:

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

ऐसे कोड इंस्टेंस देखें जो खास पेज साइज़ का रेफ़रंस देते हैं

अगर आपका ऐप्लिकेशन 16 केबी-अलाइन किया गया है, तब भी अगर आपके कोड में मौजूद जगह को यह लगता है कि डिवाइस एक खास पेज साइज़ का इस्तेमाल कर रहा है, तो आपके ऐप्लिकेशन में गड़बड़ियां हो सकती हैं. इससे बचने के लिए, यह तरीका अपनाएं:

  1. अपने कोड लॉजिक में, हार्ड कोड की गई ऐसी सभी डिपेंडेंसी हटाएं जो PAGE_SIZE कॉन्सटेंट या इंस्टेंस का रेफ़रंस देती हैं, जो यह मानती हैं कि डिवाइस के पेज का साइज़ 4 केबी (4096) है.

    इसके बजाय, getpagesize() या sysconf(_SC_PAGESIZE) का इस्तेमाल करें.

  2. mmap() और ऐसे अन्य एपीआई के इस्तेमाल का पता लगाएं जिनके लिए पेज अलाइनमेंट की ज़रूरत होती है. साथ ही, जहां ज़रूरी हो वहां विकल्पों को बदलें.

कुछ मामलों में, अगर आपका ऐप्लिकेशन PAGE_SIZE का इस्तेमाल ऐसी सुविधाजनक वैल्यू के तौर पर करता है जो पेज के साइज़ से जुड़ी नहीं है, तो 16 केबी मोड में इस्तेमाल करने पर, आपका ऐप्लिकेशन काम करना बंद नहीं करेगा. हालांकि, अगर इस वैल्यू को MAP_FIXED के बिना mmap के साथ कर्नेल को पास किया जाता है, तो भी कर्नेल पूरे पेज का इस्तेमाल करता है. इससे कुछ मेमोरी बर्बाद होती है. इन वजहों से, NDK r27 और उसके बाद के वर्शन पर 16 केबी मोड चालू होने पर, PAGE_SIZE की वैल्यू तय नहीं होती.

अगर आपका ऐप्लिकेशन इस तरह से PAGE_SIZE का इस्तेमाल करता है और इस वैल्यू को कभी भी सीधे कर्नेल को पास नहीं करता है, तो PAGE_SIZE का इस्तेमाल करने के बजाय, नए नाम के साथ एक नया वैरिएबल बनाएं. इससे यह पता चलता है कि इसका इस्तेमाल अन्य कामों के लिए किया जाता है और यह असल मेमोरी पेज को नहीं दिखाता.

अपने ऐप्लिकेशन को 16 केबी के एनवायरमेंट में टेस्ट करना

जब आप 16 केबी वाले डिवाइस के लिए अपना ऐप्लिकेशन बना लें, तो आपको यह देखने के लिए 16 केबी वाले एनवायरमेंट में अपने ऐप्लिकेशन की जांच करनी होगी कि आपके ऐप्लिकेशन पर कोई रिग्रेशन तो नहीं आ रहा. ऐसा करने के लिए, इन चरणों का अनुसरण करें:

  1. Android 15 SDK टूल सेट अप करें.

  2. टेस्टिंग के लिए इनमें से कोई एक एनवायरमेंट सेट अप करें:

  3. अपना टेस्ट डिवाइस चालू करें. इसके बाद, यह पुष्टि करने के लिए नीचे दिया गया निर्देश चलाएं कि वह 16 केबी वाले एनवायरमेंट का इस्तेमाल कर रहा है:

    adb shell getconf PAGE_SIZE
    

    निर्देश से 16384 की वैल्यू मिलनी चाहिए.

  4. किसी भी शेयर की गई लाइब्रेरी के लिए, पुष्टि करें कि शेयर की गई लाइब्रेरी के ELF सेगमेंट, 16 KB ELF अलाइनमेंट का इस्तेमाल करके सही तरीके से अलाइन किए गए हैं. इस प्रोसेस में मदद पाने के लिए, इस स्क्रिप्ट का इस्तेमाल किया जा सकता है:

    #!/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. स्क्रिप्ट को किसी फ़ाइल में सेव करें, जैसे कि alignment.sh.

    2. अपने ऐप्लिकेशन की APK फ़ाइल को निकालने के लिए:

        unzip APK_NAME.apk -d /tmp/my_apk_out
        ```
    
    1.  Run the script on the extracted files in the `/tmp/my_apk_out`
        directory:
    
    ```none {: .devsite-terminal .devsite-click-to-copy }
        alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
        ```
    
    The script outputs either `ALIGNED` or `UNALIGNED` for all the `arm64-v8a`
        shared libraries.
    
    1.  If any `arm64-v8a` shared libraries are `UNALIGNED`, you'll need to
        [update the packaging for those libraries][20], then [recompile your
        app][21] and retest by following the steps in this section.
    
  5. यह पुष्टि करने के लिए कि आपका ऐप्लिकेशन 16 केबी के हिसाब से अलाइन है, यह zipalign कमांड चलाएं. यहां APK_NAME, आपके ऐप्लिकेशन की APK फ़ाइल का नाम है:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  6. अपने ऐप्लिकेशन की पूरी तरह से जांच करें. साथ ही, उन जगहों पर फ़ोकस करें जिन पर पेज के खास साइज़ का रेफ़रंस देने वाले कोड इंस्टेंस में बदलाव का असर पड़ सकता है.

Android 15 की 16 केबी वाली सिस्टम इमेज की मदद से, Android एमुलेटर सेट अप करना

Android एमुलेटर का इस्तेमाल करके 16 केबी का एनवायरमेंट सेट अप करने के लिए, यह तरीका अपनाएं:

  1. Android 15 के एम्युलेटर सिस्टम की इमेज, 16 केबी के हिसाब से बनाई गई हैं. साथ ही, इन इमेज को Android Studio JPG | 2023.3.1 या इसके बाद के वर्शन के साथ भी इस्तेमाल किया जा सकता है. हालांकि, Android 15 बीटा वर्शन का इस्तेमाल करते समय बेहतर अनुभव पाने के लिए, Android Studio का नया प्री-रिलीज़ वर्शन डाउनलोड करें.

    याद रखें कि Android Studio के मौजूदा वर्शन को इंस्टॉल किया जा सकता है, क्योंकि एक साथ कई वर्शन इंस्टॉल किए जा सकते हैं.

  2. Android Studio में, टूल > SDK मैनेजर पर क्लिक करें.

  3. SDK प्लैटफ़ॉर्म टैब में, पैकेज की जानकारी दिखाएं को चुनें. इसके बाद, Android VenillaIceCream Preview सेक्शन को बड़ा करें. इसके बाद, आपको जिन वर्चुअल डिवाइसों को बनाना है उनके आधार पर, यहां दिए गए एम्युलेटर सिस्टम की एक या दोनों इमेज चुनें:

    • Google API एक्सपेरिमेंटल 16k पेज साइज़ ARM 64 v8a सिस्टम इमेज
    • Google API एक्सपेरिमेंटल 16k पेज साइज़ Intel x86_64 Atom सिस्टम इमेज

    Android Studio में SDK मैनेजर का इस्तेमाल करके, एम्युलेटर सिस्टम की 16 केबी की इमेज डाउनलोड करें

  4. आपने जो सिस्टम इमेज चुनी हैं उन्हें डाउनलोड करने के लिए, लागू करें > ठीक है पर क्लिक करें.

  5. Android 15 के लिए वर्चुअल डिवाइस सेट अप करने का तरीका अपनाएं. इसके बाद, जब आपसे सिस्टम इमेज चुनने के लिए कहा जाए, तो 16 केबी की वह सिस्टम इमेज चुनें जिसे आपने डाउनलोड किया है. अगर यह अपने-आप सुझाई नहीं जाती है, तो अन्य इमेज टैब में जाकर, 16 केबी की सिस्टम इमेज देखी जा सकती है.

    'अन्य इमेज' टैब में, 16 केबी की एम्युलेटर वाली इमेज ढूंढें.

  1. डिवाइस मैनेजर में, 16 केबी की इमेज के बगल में मौजूद तीन बिंदुओं पर क्लिक करें. इसके बाद, डिस्क पर दिखाएं पर क्लिक करें.
  2. इस फ़ोल्डर में, config.ini फ़ाइल ढूंढें.
  3. config.ini फ़ाइल में, यह लाइन जोड़ें और अपने बदलाव सेव करें:

    kernel.parameters = androidboot.page_shift=14
    
  4. अपने बदलावों की पुष्टि करने के लिए, यह कमांड चलाएं. इससे आपको 16384 दिखेगा:

    adb shell getconf PAGE_SIZE
    

डेवलपर विकल्पों का इस्तेमाल करके डिवाइस पर 16 केबी मोड चालू करें

16 केबी के पेज साइज़ वाला बूट डेवलपर टॉगल करें डिवाइस को 16 केबी मोड में बूट करने का विकल्प होता है.

Android 15 QPR1 की शुरुआत में, ये काम किए जा सकते हैं डेवलपर के लिए सेटिंग और टूल की उस सुविधा का इस्तेमाल करें जो आपके ब्राउज़र पर उपलब्ध है डिवाइस को 16 केबी मोड में बूट करने और डिवाइस पर टेस्ट करने के लिए.

डेवलपर के लिए बना यह विकल्प, इन डिवाइसों पर उपलब्ध है:

  • Pixel 8 और 8 Pro (Android 15 QPR1 Beta 1 या इसके बाद के वर्शन के साथ)