سابقًا، كان نظام Android لا يدعم سوى أحجام صفحات الذاكرة التي تبلغ 4 كيلوبايت، والتي تحتوي على لتحسين أداء ذاكرة النظام للحصول على متوسط إجمالي الذاكرة التي كان لديهم عادةً أجهزة Android. بدءًا من نظام التشغيل Android 15، يتوافق "بروتوكول AOSP" مع الأجهزة التي تم إعدادها لاستخدام حجم صفحة يبلغ 16 كيلوبايت (16 كيلوبايت) الأجهزة). إذا كان تطبيقك يستخدم أي مكتبات NDK، سواء بشكل مباشر أو بشكل غير مباشر من خلال إحدى حِزم SDK، ستحتاج إلى إعادة إنشاء التطبيق يعمل على هذه الأجهزة التي يبلغ حجمها 16 كيلوبايت.
مع استمرار الشركات المصنّعة للأجهزة في تصميم أجهزة تحتوي على كميات أكبر من ذاكرة فعلية (RAM)، ستعتمد العديد من هذه الأجهزة على سعة 16 كيلوبايت ( أكبر في النهاية) لتحسين أداء الجهاز. جارٍ الإضافة بالنسبة إلى الأجهزة التي حجمها 16 كيلوبايت، يمكن تشغيل تطبيقك على هذه الأجهزة وتساعد تطبيقك على الاستفادة من الأداء المرتبط التحسينات. قد لا تعمل التطبيقات على الأجهزة التي يبلغ حجمها 16 كيلوبايت بدون إعادة التجميع. عند إنتاجها في إصدارات Android المستقبلية.
ولمساعدتك على توفير الدعم لتطبيقك، قدّمنا إرشادات حول كيفية التحقق من إذا تأثّر تطبيقك إعادة إنشاء تطبيقك (إن أمكن)، وكيفية اختبار تطبيقك في بيئة بحجم 16 كيلوبايت باستخدام أدوات المحاكاة (بما في ذلك Android 15) صور النظام لمحاكي Android).
المزايا ومكاسب الأداء
تستهلك الأجهزة التي تم ضبطها على أحجام صفحات تبلغ 16 كيلوبايت مساحة أكبر قليلاً من الذاكرة في المتوسط، لكنها تُجري أيضًا تحسينات متنوعة في الأداء لكل من النظام والتطبيقات:
- أوقات تشغيل التطبيق أقل عندما يكون النظام تحت ضغط الذاكرة: 3.16% انخفاضًا في المتوسط، مع تحسينات أكثر أهمية (تصل إلى %30) لبعض التطبيقات التي اختبرناها
- انخفاض في استهلاك الطاقة أثناء تشغيل التطبيق: انخفاض بنسبة% 4.56 في المتوسّط
- تشغيل أسرع للكاميرا: عمليات تشغيل أسرع بنسبة 4.48% في المتوسط، وعمليات تشغيل على البارد أسرع بنسبة 6.60% في المتوسط
- مدة تشغيل النظام المحسَّنة: تحسّنت بنسبة %8 (950 ملي ثانية تقريبًا) في المتوسّط
تستند هذه التحسينات إلى اختبارنا الأوّلي، ومن المرجّح أن تختلف النتائج على الأجهزة الفعلية. وسنقدّم تحليلاً إضافيًا للفوائد المحتملة للتطبيقات أثناء مواصلة الاختبار.
التحقّق مما إذا كان تطبيقك قد تأثّر
إذا كان تطبيقك يستخدم أي رمز أصلي، عليك إعادة بناء تطبيقك ليتوافق مع الأجهزة التي تبلغ سعة ذاكرتها 16 كيلوبايت. إذا لم تكن متأكّدًا مما إذا كان تطبيقك يستخدم رمزًا أصليًا، يمكنك استخدام أداة APK Analyzer لتحديد ما إذا كان هناك أي رمز أصلي، ثم التحقّق من محاذاة أقسام ELF لذى أي مكتبات مشترَكة تعثر عليها.
إذا كان تطبيقك يستخدم فقط رمزًا برمجيًا مكتوبًا بلغة Java أو Kotlin، بما في ذلك جميع المكتبات أو حِزم SDK، يعني ذلك أنّ تطبيقك متوافق مع الأجهزة التي تبلغ سعتها 16 كيلوبايت. ومع ذلك، ننصحك باختبار تطبيقك في بيئة حجمها 16 كيلوبايت للتأكّد من عدم حدوث تدهورٍ unexpected في سلوك التطبيق.
هل يستخدم تطبيقك رمزًا أصليًا؟
يستخدم تطبيقك رمزًا أصليًا في حال انطباق أيّ مما يلي:
- يستخدم تطبيقك أي رمز برمجي (أصلي) من C/C++. إذا كان تطبيقك يستخدم حزمة تطوير البرامج (SDK) لنظام التشغيل Android، يعني ذلك أنّ تطبيقك يستخدم رمزًا أصليًا.
- يرتبط تطبيقك بأي مكتبات أو ملحقات تابعة لجهات خارجية (مثل حِزم SDK) تستخدمها.
- تم إنشاء تطبيقك بواسطة منشئ تطبيقات تابع لجهة خارجية يستخدم مكتبات محلية على الجهاز.
تحديد المكتبات المجمّعة من رموز برمجية أصلية باستخدام أداة تحليل ملفات APK
أداة تحليل حِزم APK هي أداة تتيح لك تقييم جوانب مختلفة من حِزم APK التي تم إنشاؤها. لتحديد ما إذا كان تطبيقك يستخدم رمزًا أصليًا أو مكتبات، اتّبِع الخطوات التالية:
- افتح Android Studio، ثم انقر على ملف > فتح واختَر أي مشروع.
من شريط القوائم، انقر على الإنشاء > تحليل حزمة APK...
اختَر حزمة APK التي تريد تحليلها.
ابحث في مجلد
lib
الذي يستضيف ملفات العناصر المشترَكة (.so
) في حال توفّرها. إذا كانت هناك أي ملفات مكونات مشترَكة، سيستخدم تطبيقك رمزًابرمجيًا هُويًا. إذا لم تكن هناك ملفات مثيل مشترَكة أو لم يكن هناك مجلدlib
، هذا يعني أنّ تطبيقك لا يستخدم رمزًا أصليًا.
التحقّق من محاذاة أجزاء ELF للمكتبات المشتركة
بالنسبة إلى أي مكتبات مشترَكة، تأكَّد من أنّ أقسام ELF للمكتبات المشترَكة
محاذاة بشكل صحيح باستخدام محاذاة ELF التي تبلغ 16 كيلوبايت. إذا كنت تُجري عملية التطوير على
نظام التشغيل Linux أو macOS، يمكنك استخدام النص البرمجي check_elf_alignment.sh
كما هو موضّح في
القسم التالي. يمكنك أيضًا استخدام أدوات سطر الأوامر مباشرةً.
استخدام النص البرمجي check_elf_alignment.sh (لنظام التشغيل Linux أو macOS)
اتّبِع الخطوات التالية للتحقّق من محاذاة أقسام ELF باستخدام نص ملف برمجي
check_elf_alignment.sh
:
احفظ نص
check_elf_alignment.sh
البرمجي في ملف.شغِّل النص البرمجي على ملف APK لتطبيقك باتّباع الخطوات التالية:
check_elf_alignment.sh APK_NAME.apk
يعرض النص البرمجي إما
ALIGNED
أوUNALIGNED
لجميعarm64-v8a
المكتبات المشتركة.إذا كانت أي من المكتبات المشتركة من النوع
arm64-v8a
أوx86_64
UNALIGNED
، عليك تعديل حِزم هذه المكتبات، ثم إعادة تجميع تطبيقك وإعادة الاختبار باتّباع الخطوات الواردة في هذا القسم.
استخدام أدوات سطر الأوامر مباشرةً
اتّبِع الخطوات التالية للتحقّق من محاذاة أقسام ELF باستخدام أدوات سطر الأوامر مباشرةً:
- تأكَّد من تثبيت الإصدار 35.0.0 أو إصدار أحدث من أدوات إنشاء حزمة تطوير البرامج (SDK) لنظام التشغيل Android و
مجموعة تطوير البرامج (NDK) لنظام التشغيل Android باستخدام مدير حِزم SDK في "استوديو Android" أو أداة سطر الأوامر
sdkmanager
. استخرِج ملف APK لتطبيقك باتّباع الخطوات التالية:
نظام التشغيل Linux أو macOS
unzip APK_NAME.apk -d /tmp/my_apk_out
نظام التشغيل Windows (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
في الدليل المؤقت الذي استخرجت إليه ملف APK، تحقّق من محتويات الدليل
lib
بحثًا عن ملفات العناصر المشتركة (.so
). هذه هي ملفات العناصر المشتركة نفسها التي كنت ستظهر لك أثناء تحديد المكتبات الأصلية باستخدام أداة "محلل حِزم APK". نفِّذ الأمر التالي على كل ملف منملفّات العناصر المشترَكة:نظام التشغيل Linux أو 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"
حيث يكون
SDK_ROOT_LOCATION
هو المسار إلى directory الذي ثبَّت فيه حزمة تطوير البرامج (SDK) لنظام التشغيل Android، وSHARED_OBJECT_FILE
هو اسم ملف العنصر المشترَك الذي تفحصه، وNDK_VERSION
هو إصدار Android NDK الذي ثبَّته (على سبيل المثال،28.0.12433566
). سيظهر الإخراج على النحو التالي لكل ملف تفحصه: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
راجِع أسطر الإخراج للتأكّد من أنّ أقسام الحمولة لا تحتوي على قيم أقل من
2**14
. إذا كانت أيّ أجزاء من الحمولة ذات قيمة2**13
أو2**12
أو أقل، عليك تعديل حِزم هذه المكتبات، ثم إعادة تجميع تطبيقك وإعادة الاختبار باتّباع الخطوات الواردة في هذا القسم.بعد ذلك، يمكنك تشغيل أداة سطر الأوامر
zipalign
على ملف APK لتطبيقك:نظام التشغيل Linux أو 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
حيث يشير
SDK_ROOT_LOCATION
إلى مسار الدليل الذي ثبَّت فيه حزمة تطوير البرامج (SDK) لنظام التشغيل Android، وAPK_NAME
هو اسم ملف APK لتطبيقك. سيظهر في السطر الأخير من الإخراج عبارة "تم التحقق بنجاح" إذا كانت كل مكتبات المشترَكة مُحاذاة بشكل صحيح.إذا تعذّر إكمال عملية التحقّق، يجب إعادة محاذاة بعض المكتبات المشتركة، لذلك عليك تعديل حِزم هذه المكتبات، ثم إعادة تجميع تطبيقك وإعادة الاختبار باتّباع الخطوات الواردة في هذا القسم.
إنشاء تطبيقك ليتوافق مع الأجهزة التي تستخدم صفحات بحجم 16 كيلوبايت
لتتوافق التطبيقات مع الأجهزة التي تستخدم صفحات ذاكرة بحجم 16 كيلوبايت، يجب أن تُكمل التطبيقات التي تستخدم رمزًا أصليًا الخطوات الموضّحة في الأقسام التالية. في حال الترقية إلى الإصدار 8.5.1 أو إصدار أحدث من AGP والإصدار r28 أو إصدار أحدث من NDK واستخدام تبعيات مُسبقة الإنشاء متوافقة مع 16 كيلوبايت، ستكون التطبيقات متوافقة مع 16 كيلوبايت تلقائيًا.
تعديل حِزم المكتبات المشتركة
ننصحك بالترقية إلى الإصدار 8.5.1 من AGP أو إصدار أحدث واستخدام المكتبات المشتركة غير المضغوطة.
الإصدار 8.5.1 من AGP أو إصدار أحدث
تتطلّب الأجهزة التي تستخدم صفحات بحجم 16 كيلوبايت أن تكون التطبيقات التي يتم شحنها مزوّدة بمكتبات مشتركة غير مضغوطة لكي تتم محاذاتها على حدود مُحاذاة ملفات zip بحجم 16 كيلوبايت. لإجراء ذلك، عليك الترقية إلى الإصدار 8.5.1 من المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) أو إصدار أحدث. يُرجى الرجوع إلى قسم Android مساعِد ترقية مكوّنات Gradle الإضافية للحصول على تفاصيل عن عملية الترقية.
الإصدار 8.5 من AGP أو إصدار أقدم
إذا لم تتمكّن من ترقية AGP إلى الإصدار 8.5.1 أو إصدار أحدث، يمكنك بدلاً من ذلك التبديل إلى استخدام المكتبات المشترَكة المضغوطة. عدِّل إعدادات Gradle ليقوم Gradle بضغط مكتباتك المشتركة عند تجميع تطبيقك لتجنُّب حدوث مشاكل في تثبيت التطبيق بسبب عدم تطابق المكتبات المشتركة.
رائع
في ملف build.gradle
، أضِف الخيار التالي:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
في ملف build.gradle.kts
، أضِف الخيار التالي:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
تجميع تطبيقك باستخدام محاذاة ELF بحجم 16 كيلوبايت
تتطلّب الأجهزة التي تستخدم تنسيق 16 كيلوبايت محاذاة أقسام ELF للمكتبات المشتركة بشكل صحيح باستخدام محاذاة ELF بحجم 16 كيلوبايت لكي يعمل تطبيقك.
لتجميع تطبيقك باستخدام محاذاة ELF بحجم 16 كيلوبايت، أكمِل الخطوات الواردة في أحد الأقسام التالية استنادًا إلى إصدار Android NDK الذي تستخدمه.
الإصدار r28 من Android NDK والإصدارات الأحدث
يُنشئ الإصدار r28 من NDK والإصدارات الأحدث ملفات بتنسيق 16 كيلوبايت تلقائيًا.
الإصدار r27 من Android NDK
لتفعيل تجميع المكتبات المشتركة المتوافقة مع 16 كيلوبايت باستخدام الإصدار ndk-build
من Android NDK
r27 والإصدارات الأحدث، عليك تعديل 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
الإصدار r26 من Android NDK والإصدارات الأقدم
لتتمكّن من تجميع مكتبات مشترَكة مُعدَّة لتكون 16 كيلوبايت باستخدام الإصدار r26 من Android NDK
أو الإصدارات الأقدم، عليك تعديل إعدادات ndk-build
أو cmake
على النحو التالي:
ndk-build
عدِّل Android.mk
لتفعيل محاذاة ELF بحجم 16 كيلوبايت:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
عدِّل CMakeLists.txt
لتفعيل محاذاة ELF بحجم 16 كيلوبايت:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
البحث عن نُسخ الرموز البرمجية التي تشير إلى أحجام صفحات معيّنة
حتى إذا كان تطبيقك مُحاذَى بحجم 16 كيلوبايت، يمكن أن يواجه تطبيقك أخطاء إذا كانت الأماكن في الرمز البرمجي تفترض أنّ الجهاز يستخدم حجم صفحة معيّنًا. لتجنُّب ذلك، عليك إكمال الخطوات التالية:
أزِل أيّ تبعيات مضمّنة تشير إلى الثابت
PAGE_SIZE
أو المثيلات في منطق الرمز البرمجي التي تفترض أنّ حجم صفحة الجهاز هو 4 كيلوبايت (4096
).استخدِم
getpagesize()
أوsysconf(_SC_PAGESIZE)
بدلاً من ذلك.ابحث عن استخدامات
mmap()
وواجهات برمجة التطبيقات الأخرى التي تتطلّب دالّات ALIGNED_TO_PAGE واستبدِلها ببدائل عند الضرورة.
في بعض الحالات، إذا كان تطبيقك يستخدم PAGE_SIZE
كقيمة ملائمة غير مرتبطة
بحجم الصفحة الأساسي، لن يؤدي ذلك إلى تعطُّل تطبيقك عند
استخدامه في وضع 16 كيلوبايت. ومع ذلك، إذا تم تمرير هذه القيمة إلى النواة باستخدام
mmap
بدون MAP_FIXED
، سيظلّ استخدام النواة لصفحة كاملة، ما يؤدي إلى إهدار
بعض الذاكرة. لهذه الأسباب، لا يتم تحديد PAGE_SIZE
عند تفعيل وضع 16 كيلوبايت
على NDK r27 والإصدارات الأحدث.
إذا كان تطبيقك يستخدم PAGE_SIZE
بهذه الطريقة ولا يُمرِّر هذه القيمة مباشرةً إلى
النواة، يمكنك إنشاء متغيّر جديد باسم
جديد بدلاً من استخدام PAGE_SIZE
للإشارة إلى أنّه يُستخدَم لأغراض أخرى ولا يشير إلى صفحة ذاكرة
حقيقية.
التحقّق من حِزم تطوير البرامج (SDK) للتأكّد من توافقها مع صفحات الذاكرة بحجم 16 كيلوبايت
تتوافق العديد من حِزم SDK مع أحجام الصفحات التي تبلغ 16 كيلوبايت، خاصةً إذا كنت بصدد إنشائها بنفسك أو الحصول على حِزم مُعدّة مسبقًا مؤخرًا. ومع ذلك، بما أنّ بعض الإصدارات المُسبقة من حزمة SDK أو إصدارات حزمة SDK غير متوافقة مع حجم 16 كيلوبايت، عليك الانتقال إلى الموقع الإلكتروني لكل موفِّر لحزمة SDK لتحديد الإصدار الذي يجب استخدامه مع حجم 16 كيلوبايت.
اختبار تطبيقك في بيئة حجمها 16 كيلوبايت
بعد إنشاء تطبيقك ليتوافق مع الأجهزة التي تستخدم 16 كيلوبايت، عليك اختبار تطبيقك في بيئة تستخدم 16 كيلوبايت لمعرفة ما إذا كان تطبيقك يواجه أي تراجعات. لإجراء هذا، اتبع هذه الخطوات:
إعداد إحدى بيئات الاختبار التالية:
شغِّل جهازك التجريبي، ثم نفِّذ الأمر التالي للتأكّد من أنّه يستخدم بيئة بسعة 16 كيلوبايت:
adb shell getconf PAGE_SIZE
من المفترض أن يعرض الأمر القيمة
16384
.نفِّذ الأمر
zipalign
التالي للتحقّق من أنّ تطبيقك مُحاذاً بحجم 16 كيلوبايت، حيث يكون APK_NAME هو اسم ملف APK الخاص بتطبيقك:zipalign -c -P 16 -v 4 APK_NAME.apk
اختبِر تطبيقك بدقة، مع التركيز على أيّ أقسام قد تتأثّر ب تغيير مثيلات الرموز البرمجية التي تشير إلى أحجام صفحات معيّنة.
إعداد "محاكي Android" باستخدام صورة نظام Android 15 المستندة إلى 16 كيلوبايت
لإعداد بيئة بسعة 16 كيلوبايت باستخدام "محاكي Android"، اتّبِع الخطوات التالية:
تتوافق صور نظام المحاكي لنظام التشغيل Android 15 المستندة إلى 16 كيلوبايت مع IDE Android Studio Jellyfish | 2023.3.1 أو إصدار أحدث. للحصول على أفضل تجربة عند العمل مع الإصدار التجريبي من Android 15، نزِّل أحدث إصدار من الإصدار التجريبي من "استوديو Android".
تذكَّر أنّه يمكنك إبقاء الإصدار الحالي من Android Studio مثبّتًا، لأنّه يمكنك تثبيت إصدارات متعددة جنبًا إلى جنب.
في "استوديو Android"، انقر على الأدوات > أداة إدارة حِزم تطوير البرامج (SDK).
في علامة التبويب أنظمة تشغيل حِزم تطوير البرامج (SDK)، ضَع علامة في المربّع بجانب عرض تفاصيل الحزمة، ثم وسِّع القسم Android VanillaIceCream Preview واختَر صورة واحدة أو كلتا الصورتين لنظام المحاكي التالي، استنادًا إلى الأجهزة الافتراضية التي تريد إنشاؤها:
- صورة نظام Google APIs Experimental 16k Page Size ARM 64 v8a
- صورة نظام Google APIs Experimental 16k Page Size Intel x86_64 Atom
انقر على تطبيق > حسنًا لتنزيل صور النظام التي اخترتها.
اتّبِع خطوات إعداد جهاز افتراضي لنظام التشغيل Android 15، وعندما يُطلب منك اختيار صورة نظام، اختَر صورة النظام التي تم تنزيلها بحجم 16 كيلوبايت. إذا لم يتم اقتراح هذا الخيار تلقائيًا، يمكنك العثور على صورة النظام التي تبلغ 16 كيلوبايت في علامة التبويب صور أخرى.
- في "مدير الأجهزة"، انقر على النقاط الثلاث بجانب الصورة التي تبلغ 16 كيلوبايت، ثم انقر على عرض على القرص.
- في هذا المجلد، ابحث عن ملف
config.ini
. أضِف السطر التالي إلى ملف
config.ini
واحفظ التغييرات:kernel.parameters = androidboot.page_shift=14
للتحقّق من التغييرات، شغِّل الأمر التالي الذي من المفترض أن يعرض الرسالة التالية:
16384
:adb shell getconf PAGE_SIZE
تفعيل الوضع 16 كيلوبايت على جهاز باستخدام خيارات المطوّرين
بدءًا من الإصدار Android 15 QPR1، يمكنك استخدام خيار المطوّر المتاح على أجهزة معيّنة لتشغيل الجهاز في وضع 16 كيلوبايت وإجراء الاختبار على الجهاز.
يتوفّر خيار المطوّر هذا على الأجهزة التالية:
- Pixel 8 وPixel 8 Pro (مع نظام التشغيل Android 15 QPR1 أو إصدار أحدث)
- Pixel 8a (مع الإصدار 15 QPR1 من Android أو إصدار أحدث)
- Pixel 9 وPixel 9 Pro وPixel 9 Pro XL (مع الإصدار 2 من الإصدار التجريبي من Android 15 QPR2 أو إصدار أحدث)