نظرة عامة على الميزات وواجهات برمجة التطبيقات

يقدّم Android 15 ميزات وواجهات برمجة تطبيقات جديدة رائعة للمطوّرين. تلخص الأقسام التالية هذه الميزات لمساعدتك في بدء استخدام واجهات برمجة التطبيقات ذات الصلة.

للحصول على قائمة مفصّلة بواجهات برمجة التطبيقات الجديدة والمعدّلة والتي تمت إزالتها، يُرجى الاطّلاع على تقرير اختلاف واجهات برمجة التطبيقات. للحصول على تفاصيل حول واجهات برمجة التطبيقات الجديدة، يُرجى الانتقال إلى مرجع واجهة برمجة تطبيقات Android، حيث يتم تمييز واجهات برمجة التطبيقات الجديدة من أجل إذن الوصول. بالإضافة إلى ذلك، للتعرّف على الجوانب التي قد تؤثر فيها تغييرات النظام الأساسي في تطبيقاتك، احرص على مراجعة تغييرات السلوك على نظام التشغيل Android 15 التي تؤثر في التطبيقات عند استهداف Android 15 وتغييرات السلوك التي تؤثر في جميع التطبيقات بغض النظر عن targetSdkVersion.

الكاميرا والوسائط

يتضمّن Android 15 مجموعة متنوعة من الميزات التي تعمل على تحسين تجربة الكاميرا والوسائط والتي تتيح لك الوصول إلى أدوات وأجهزة لمساعدة صنّاع المحتوى على تحقيق رؤيتهم على Android.

للحصول على مزيد من المعلومات حول أحدث الميزات وحلول المطوّرين لوسائط Android والكاميرا، يمكنك الاطّلاع على المقالة إنشاء وسائط Android وتجارب الكاميرا الحديثة من مؤتمر Google I/O.

تعزيز الإضاءة المنخفضة

يقدّم Android 15 ميزة تعزيز الإضاءة المنخفضة، وهو وضع جديد للإضاءة التلقائية يتوفّر لكل من الكاميرا 2 وإضافة الكاميرا في الوضع الليلي. تعمل ميزة "تعزيز الإضاءة المنخفضة" على ضبط مستوى تعرض بث معاينة البث في ظروف الإضاءة المنخفضة. ويختلف ذلك عن الطريقة التي تنشئ بها إضافة الكاميرا في الوضع الليلي الصور الثابتة، لأن الوضع الليلي يدمج مجموعة من الصور لإنشاء صورة واحدة محسَّنة. عندما يعمل الوضع الليلي بشكل جيد للغاية لإنشاء صورة ثابتة، لا يمكنه إنشاء بث مستمر للإطارات، ولكن يمكن لميزة "تعزيز الإضاءة المنخفضة" إجراء ذلك. وبالتالي، تتيح ميزة "تعزيز الإضاءة المنخفضة" إمكانات جديدة للكاميرا، مثل:

  • توفير معاينة محسّنة للصور، ليتمكّن المستخدمون من تأطير الصور ذات الإضاءة المنخفضة بشكل أفضل
  • جارٍ مسح رموز الاستجابة السريعة ضوئيًا في الإضاءة المنخفضة

إذا فعّلت ميزة "تعزيز الإضاءة المنخفضة"، يتم تشغيلها تلقائيًا عند انخفاض مستوى الإضاءة، ويتم إيقافها عند ارتفاع مستوى الإضاءة.

يمكن للتطبيقات تسجيل فيديو من بث المعاينة في ظروف الإضاءة المنخفضة لحفظ فيديو سطوع.

لمزيد من المعلومات، يمكنك الاطّلاع على تعزيز الإضاءة المنخفضة.

عناصر التحكّم في الكاميرا داخل التطبيق

يُضيف Android 15 إضافة جديدة لمزيد من التحكّم في أجهزة الكاميرا وخوارزمياته على الأجهزة المتوافقة:

  • تعديلات متقدّمة على قوة الفلاش، ما يتيح التحكّم الدقيق في شدة الفلاش في وضعَي SINGLE وTORCH أثناء التقاط الصور.

التحكّم في هامش النمو بنطاق HDR

يختار نظام التشغيل Android 15 هامش HDR المناسب لإمكانات الجهاز الأساسية وعمق البت في اللوحة. بالنسبة إلى الصفحات التي تحتوي على الكثير من المحتوى بنطاق SDR، مثل تطبيق مراسلة يعرض صورة مصغّرة واحدة بنطاق عالي الديناميكية، يمكن أن يؤثر هذا السلوك سلبًا في السطوع الملحوظ لمحتوى SDR. يتيح لك نظام التشغيل Android 15 التحكّم في هامش HDR من خلال setDesiredHdrHeadroom لتحقيق التوازن بين المحتوى العادي بنطاق عالي الديناميكية (SDR) والمحتوى العالي الديناميكية (HDR).

يبدو أنّ سطوع عناصر واجهة مستخدم SDR على الشاشة اليسرى أكثر اتساقًا من السطوع على الشاشة اليمنى، ما يحاكي المشاكل المحتملة في هامش النمو عند مزج المحتوى بنطاق عالي الديناميكية ونطاق SDR. من خلال ضبط هامش HDR، يمكنك تحقيق توازن أفضل بين المحتوى المعروض في SDR والمحتوى العالي الديناميكية.

التحكّم في مستوى الصوت

يتوافق نظام التشغيل Android 15 مع معيار CTA-2075 لصوت ارتفاع الصوت لمساعدتك في تجنُّب تناقضات ارتفاع الصوت وضمان عدم اضطرار المستخدمين إلى ضبط مستوى الصوت باستمرار عند التبديل بين المحتوى. ويستفيد النظام من الخصائص المعروفة لأجهزة الإخراج (سماعات الرأس ومكبّر الصوت) مع البيانات الوصفية لمستوى الصوت المتوفرة في محتوى الصوت AAC لضبط ارتفاع الصوت ومستويات ضغط النطاق الديناميكي بذكاء.

لتفعيل هذه الميزة، عليك التأكّد من توفّر البيانات الوصفية لارتفاع الصوت في محتوى AAC وتفعيل ميزة النظام الأساسي في تطبيقك. لإجراء ذلك، يمكنك إعداد عنصر LoudnessCodecController من خلال استدعاء طريقة الإنشاء على الإعدادات الأصلية باستخدام معرّف الجلسة الصوتية من AudioTrack المرتبط تلقائيًا. سيؤدي هذا تلقائيًا إلى بدء تطبيق تحديثات الصوت. يمكنك ضبط OnLoudnessCodecUpdateListener لتعديل مَعلمات ارتفاع الصوت أو فلترتها قبل تطبيقها على MediaCodec.

// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = …
val audioTrack = AudioTrack.Builder()
                                .setSessionId(sessionId)
                                .build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
   val lcController = LoudnessCodecController.create(mSessionId)
   // Starts applying audio updates for each added MediaCodec
}

وسيتم أيضًا تحديث AndroidX Media3 ExoPlayer لاستخدام واجهات برمجة تطبيقات LoudnessCodecController من أجل دمج التطبيق بسلاسة.

أجهزة MIDI 2.0 الافتراضية

أتاح نظام Android 13 إمكانية الاتصال بأجهزة MIDI 2.0 باستخدام USB التي تتواصل باستخدام حِزم MIDI الشاملة (UMP). يعمل Android 15 على توسيع نطاق دعم UMP ليشمل تطبيقات MIDI الافتراضية، ما يتيح لتطبيقات إنشاء المحتوى إمكانية التحكّم في تطبيقات جهاز التجميع كجهاز MIDI 2.0 افتراضي، تمامًا كما هو الحال مع جهاز USB MIDI 2.0.

فك ترميز برامج AV1 أكثر فعالية

شعار dav1d

إنّ برنامج dav1d، وهو برنامج فك ترميز برامج AV1 الشهير من VideoLAN، أصبح متاحًا الآن للأجهزة التي تعمل بنظام التشغيل Android التي لا تتيح فك ترميز AV1 في الأجهزة. ويزيد أداء dav1d بمقدار 3 مرات مقارنةً ببرنامج فك ترميز برامج AV1 القديم، ما يتيح تشغيل محتوى عالي الدقة AV1 للمزيد من المستخدمين، بما في ذلك بعض الأجهزة المنخفضة والمتوسطة.

في الوقت الحالي، يحتاج تطبيقك إلى الموافقة على استخدام dav1d من خلال استدعائه حسب الاسم "c2.android.av1-dav1d.decoder". dav1d هو برنامج فك ترميز برنامج AV1 التلقائي في تحديث لاحق. تم توحيد هذا الدعم وتوفيره على أجهزة Android 11 التي تتلقّى تحديثات نظام Google Play.

إنتاجية المطوّرين وأدواته

على الرغم من أنّ معظم جهودنا لتحسين مراكز الإنتاجية بالاستناد إلى أدوات مثل استوديو Android وJetpack Compose ومكتبات Android Jetpack ، نبحث دائمًا عن طرق في النظام الأساسي لمساعدتك في تحقيق رؤيتك بسهولة أكبر.

تحديثات OpenJDK 17

يواصل نظام Android 15 العمل على تحديث مكتبات Android الأساسية للتوافق مع الميزات المتوفّرة في أحدث إصدارات OpenJDK LTS.

ويتم تضمين الميزات والتحسينات الرئيسية التالية:

يتم تحديث واجهات برمجة التطبيقات هذه على أكثر من مليار جهاز يعمل بنظام التشغيل Android 12 (المستوى 31 من واجهة برمجة التطبيقات) والإصدارات الأحدث من خلال تحديثات نظام Google Play، ما يتيح لك استهداف أحدث ميزات البرمجة.

تحسينات على ملفات PDF

يتضمن Android 15 تحسينات مهمة على واجهات برمجة التطبيقات في PdfRenderer. يمكن أن تتضمن التطبيقات ميزات متقدّمة، مثل عرض الملفات المحمية بكلمة مرور والتعليقات التوضيحية وتعديل النماذج والبحث والاختيار بنسخة منها. تتم إتاحة تحسينات ملفات PDF الخطية لتسريع عرض ملفات PDF المحلية وتقليل استخدام الموارد.

تشمل آخر التعديلات التي أجريناها على عرض ملفات PDF ميزات، مثل البحث في ملف PDF مضمّن.

لقد تم نقل PdfRenderer إلى وحدة يمكن تحديثها باستخدام تحديثات نظام Google Play بشكل مستقل عن إصدار النظام الأساسي، ونحن نتيح هذه التغييرات مرة أخرى على Android 11 (المستوى 30 لواجهة برمجة التطبيقات) من خلال إنشاء إصدار متوافق من واجهة برمجة التطبيقات لمرحلة ما قبل Android 15، ويُطلق عليه اسم PdfRendererPreV.

نقدِّر ملاحظاتك بشأن التحسينات التي أجريناها على واجهة PdfRenderer API، ونخطط لتسهيل دمج واجهات برمجة التطبيقات هذه في تطبيقك مع مكتبة Android Jetpack القادمة.

التحسينات التلقائية لتبديل اللغات

أضاف نظام التشغيل Android 14 ميزة التعرّف على اللغات المتعددة على الجهاز فقط مع إمكانية التبديل التلقائي بين اللغات، ولكن قد يؤدي ذلك إلى إسقاط الكلمات، خاصةً عندما تبدِّل اللغات مع نسبة أقل من التوقف المؤقت بين الكلمتَين. يضيف نظام Android 15 عناصر تحكّم إضافية لمساعدة التطبيقات في ضبط هذا التبديل حسب حالة الاستخدام الخاصة بها. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS تحصر إمكانية التبديل التلقائي في بداية الجلسة الصوتية، في حين أنّ EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES توقِف تبديل اللغة بعد عدد محدّد من عمليات التبديل. هذه الخيارات مفيدة بشكل خاص إذا كنت تتوقع أن تكون هناك لغة واحدة منطوقة أثناء الجلسة ينبغي أن يتم التعرف عليها تلقائيًا.

تم تحسين واجهة برمجة تطبيقات الخطوط في OpenType Variable

يحسّن نظام التشغيل Android 15 من سهولة استخدام الخط المتغير OpenType. يمكنك الآن إنشاء مثيل FontFamily من خط متغيّر بدون تحديد محور الوزن باستخدام واجهة برمجة التطبيقات buildVariableFamily. يلغي عارض النص قيمة المحور wght لمطابقة النص المعروض.

وباستخدام واجهة برمجة التطبيقات الجديدة، يؤدي ذلك إلى تبسيط الرمز لإنشاء Typeface بشكل كبير:

Kotlin

val newTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build()

Java

Typeface newTypeface = Typeface.CustomFallbackBuilder(
            new FontFamily.Builder(
                new Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build();

في السابق، كنت تحتاج إلى المزيد من الرموز البرمجية لإنشاء Typeface نفسه:

Kotlin

val oldTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf")
                    .setFontVariationSettings("'wght' 400")
                    .setWeight(400)
                    .build())
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 100")
                        .setWeight(100)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 200")
                        .setWeight(200)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 300")
                        .setWeight(300)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 500")
                        .setWeight(500)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 600")
                        .setWeight(600)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 700")
                        .setWeight(700)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 800")
                        .setWeight(800)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 900")
                        .setWeight(900)
                        .build()
                ).build()
        ).build()

Java

Typeface oldTypeface = new Typeface.CustomFallbackBuilder(
    new FontFamily.Builder(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 400")
            .setWeight(400)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 100")
            .setWeight(100)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 200")
            .setWeight(200)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 300")
            .setWeight(300)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 500")
            .setWeight(500)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 600")
            .setWeight(600)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 700")
            .setWeight(700)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 800")
            .setWeight(800)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 900")
            .setWeight(900)
            .build()
    )
    .build()
).build();

في ما يلي مثال على طريقة عرض Typeface باستخدام كل من واجهات برمجة التطبيقات القديمة والجديدة:

مثال على كيفية اختلاف عرض Typeface باستخدام
واجهات برمجة التطبيقات الجديدة والقديمة

في هذا المثال، لا تتيح واجهة برمجة التطبيقات Typeface التي تم إنشاؤها باستخدام واجهة برمجة التطبيقات القديمة إنشاء قيم وزن خط دقيقة للمثيلات 350 و450 و550 و650 Font، لذلك يعود العارض إلى أقرب عرض ممكن. لذلك في هذه الحالة، يتم عرض 300 بدلاً من 350، ويتم عرض 400 بدلاً من 450، وهكذا. وعلى النقيض من ذلك، تُنشئ دالة Typeface التي تم إنشاؤها باستخدام واجهات برمجة التطبيقات الجديدة بشكلٍ ديناميكي مثيل Font لوزن معيّن، لذلك يتم عرض قيم الترجيح الدقيقة لـ 350 و450 و550 و650 أيضًا.

عناصر التحكّم في فواصل الأسطر الدقيقة

بدءًا من نظام التشغيل Android 15، يمكن لـ TextView وفاصل السطر الأساسي الاحتفاظ بالجزء المحدّد من النص في السطر نفسه لتحسين إمكانية القراءة. يمكنك الاستفادة من هذا تخصيص فاصل الأسطر باستخدام علامة <nobreak> في موارد السلسلة أو createNoBreakSpan. وبالمثل، يمكنك الحفاظ على الكلمات من الواصلة باستخدام العلامة <nohyphen> أو createNoHyphenationSpan.

على سبيل المثال، لا يشتمل مورد السلسلة التالي على فاصل أسطر، يظهر مع عرض النص "Pixel 8 Pro" في مكان غير مرغوب فيه:

<resources>
    <string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>

وفي المقابل، يتضمّن مورد السلسلة هذا العلامة <nobreak> التي تلفّ عبارة "Pixel 8 Pro." وتمنع فواصل الأسطر:

<resources>
    <string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>

يظهر الفرق في كيفية عرض هذه السلاسل في الصور التالية:

تنسيق لسطر من النص لا يتم فيه لف العبارة "Pixel 8 Pro" باستخدام علامة <nobreak>
تنسيق لسطر النص نفسه حيث يتم لف العبارة "Pixel 8 Pro" باستخدام علامة <nobreak>

أرشفة التطبيقات

أعلن فريقا Android وGoogle Play عن دعمهما لأرشفة التطبيقات في العام الماضي، ما سمح للمستخدمين بإخلاء بعض المساحة عن طريق إزالة التطبيقات التي نادرًا ما يتم استخدامها من الجهاز والتي تم نشرها باستخدام "مجموعة حزمات تطبيق Android" على Google Play. يشمل Android 15 الآن دعمًا على مستوى نظام التشغيل لأرشفة التطبيقات وإخراجها من الأرشيف، ما يسهّل على جميع متاجر التطبيقات تنفيذ هذا الإجراء.

يمكن للتطبيقات التي لديها إذن REQUEST_DELETE_PACKAGES استدعاء طريقة PackageInstaller requestArchive لطلب أرشفة حزمة تطبيق مثبّتة، ما يؤدي إلى إزالة حزمة APK وأي ملفات مخزَّنة مؤقتًا ولكن مع الاحتفاظ ببيانات المستخدم. يتم عرض التطبيقات المؤرشفة كتطبيقات قابلة للعرض من خلال واجهات برمجة تطبيقات LauncherApps، وسيرى المستخدمون معالجة واجهة المستخدم لتمييز أن هذه التطبيقات تمت أرشفتها. إذا نقر المستخدم على تطبيق من الأرشيف، سيتلقى المثبِّت المسؤول طلبًا لإخراجه من الأرشيف، ويمكن مراقبة عملية الاستعادة من خلال بث ACTION_PACKAGE_ADDED.

الرسومات

يوفّر Android 15 أحدث التحسينات المتعلّقة بالرسومات، بما في ذلك ANGLE على شكل إضافات وإضافات إلى نظام رسومات "لوحة الرسم".

تحديث الوصول إلى وحدة معالجة الرسومات في Android

شعار Vulkan

تطورت أجهزة Android إلى حد كبير منذ بدايتها حيث كان يتم تشغيل نظام التشغيل الأساسي على وحدة معالجة مركزية واحدة، كما تم الوصول إلى وحدات معالجة الرسومات باستخدام واجهات برمجة التطبيقات استنادًا إلى المخططات ذات الوظائف الثابتة. كانت واجهة برمجة التطبيقات Vulkan® للرسومات متاحة في NDK منذ نظام Android 7.0 (المستوى 24 لواجهة برمجة التطبيقات) ذات مستوى تجريدي أدنى يعكس بشكل أفضل الأجهزة الحديثة لوحدة معالجة الرسومات، وتوسّع نطاقها بشكل أفضل لتتوافق مع نوى وحدة معالجة مركزية متعددة، وتخفض النفقات العامة لبرنامج تشغيل وحدة المعالجة المركزية (CPU)، ما يؤدي إلى تحسُّن أداء التطبيق. يتوافق Vulkan مع جميع محرّكات الألعاب الحديثة.

Vulkan هي واجهة Android المفضلة لوحدة معالجة الرسومات. وبالتالي، يتضمّن نظام التشغيل Android 15 لغة ANGLE كطبقة اختيارية لتشغيل OpenGL® ES على شبكة Vulkan. سيؤدي الانتقال إلى محرِّك ANGLE إلى توحيد تنفيذ Android OpenGL من أجل تعزيز التوافق وتحسين الأداء في بعض الحالات. يمكنك اختبار ثبات تطبيق OpenGL ES وأدائه من خلال ANGLE من خلال تفعيل خيار المطوّرين في الإعدادات -> النظام -> خيارات المطوّرين -> تجريبية: تفعيل محرِّك ANGLE على Android 15.

Android ANGLE على خارطة طريق Vulkan

خطة تحقيق الأهداف المتعلّقة بواجهات برمجة تطبيقات وحدة معالجة الرسومات لنظام التشغيل Android.

في إطار تبسيط حزمة وحدة معالجة الرسومات، سنشحن من الآن فصاعدًا محرِّك ANGLE على أنّه برنامج تشغيل نظام GL على المزيد من الأجهزة الجديدة، ومن المتوقّع أن يكون OpenGL/ES متوفرًا فقط من خلال محرِّك ANGLE في المستقبل. ومع ذلك، نخطط لمواصلة دعم OpenGL ES على جميع الأجهزة.

الخطوات التالية المقترحة

استخدِم خيارات المطوّرين لتحديد برنامج تشغيل محرِّك ANGLE على OpenGL ES واختبار تطبيقك. وبالنسبة إلى المشاريع الجديدة، ننصحك بشدة باستخدام Vulkan لـ C/C++.

تحسينات على "لوحة الرسم"

يواصل Android 15 تحديث نظام رسومات Canvas من Android بإمكانات جديدة:

  • Matrix44 توفّر مصفوفة 4×4 لتحويل الإحداثيات التي يجب استخدامها عندما تريد معالجة اللوحة في العرض الثلاثي الأبعاد.
  • يتقاطع clipShader مع المقطع الحالي مع التظليل المحدد، بينما يضبط clipOutShader المقطع على الفرق بين المقطع الحالي وأداة التظليل، حيث يتعامل كل منهما مع أداة التظليل على أنه قناع ألفا. يدعم هذا رسم الأشكال المعقدة بكفاءة.

الأداء والبطارية

يواصل Android تركيزه على مساعدتك في تحسين أداء تطبيقاتك وجودتها. يقدّم Android 15 واجهات برمجة تطبيقات جديدة تساعد في زيادة كفاءة تنفيذ المهام في تطبيقك وتحسين أداء التطبيقات وجمع إحصاءات حول تطبيقاتك.

للاطّلاع على أفضل الممارسات الموفّرة للبطارية، وتصحيح الأخطاء في الشبكة واستخدام الطاقة، والاطّلاع على تفاصيل حول كيفية تحسين كفاءة عمل البطارية في الخلفية على نظام التشغيل Android 15 والإصدارات الأحدث من نظام التشغيل Android، يمكنك الاطّلاع على مقالة تحسين كفاءة العمل في الخلفية في نظام التشغيل Android من مؤتمر Google I/O.

واجهة برمجة التطبيقات ApplicationStartInfo

في الإصدارات السابقة من Android، كان بدء تشغيل التطبيق لغزًا إلى حدٍ ما. كان من الصعب تحديد ما إذا كان تطبيقك بدأ من حالة باردة أو دافئة أو ساخنة. وكان من الصعب أيضًا معرفة المدة التي قضاها تطبيقك في مراحل الإطلاق المختلفة، مثل إجراء مراحل عملية الإطلاق، واستدعاء onCreate، ورسم الإطار الأول، وغير ذلك. عندما تم إنشاء مثيل لصف Application، لم تكن هناك طريقة لمعرفة ما إذا كان التطبيق قد بدأ من خلال بث أو من مقدِّم محتوى أو وظيفة أو نسخة احتياطية أو اكتمال التشغيل أو منبّه أو جهاز Activity.

توفّر واجهة برمجة التطبيقات ApplicationStartInfo في نظام التشغيل Android 15 كل هذا وأكثر. يمكنك أيضًا اختيار إضافة الطوابع الزمنية الخاصة بك إلى التدفق للمساعدة في جمع بيانات التوقيت في مكان واحد. بالإضافة إلى جمع المقاييس، يمكنك استخدام ApplicationStartInfo للمساعدة مباشرةً في تحسين عملية بدء تشغيل التطبيق. على سبيل المثال، يمكنك التخلص من إنشاء مثيل مكلفة للمكتبات ذات الصلة بواجهة المستخدم داخل صف Application عند بدء تشغيل التطبيق بسبب بث البث.

معلومات تفصيلية حول حجم التطبيق

منذ إصدار Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، ضمّن نظام Android واجهة برمجة التطبيقات StorageStats.getAppBytes التي تلخّص حجم التطبيق المثبَّت على شكل عدد واحد من وحدات البايت، وهو مجموع حجم حزمة APK وحجم الملفات المستخرَجة من حزمة APK، والملفات التي تم إنشاؤها على الجهاز، مثل الرموز البرمجية المجمّعة مسبقًا (AOT). لا يقدم هذا الرقم إحصاءات مفيدة جدًا في ما يتعلق بكيفية استخدام تطبيقك للتخزين.

يضيف نظام التشغيل Android 15 واجهة برمجة التطبيقات StorageStats.getAppBytesByDataType([type])، التي تتيح لك الاطّلاع على إحصاءات حول كيفية استخدام تطبيقك لكل هذه المساحة، بما في ذلك أقسام ملفات APK ورمز AOT والرمز المرتبط بالتسريع والبيانات الوصفية والمكتبات والملفات الشخصية الإرشادية.

إنشاء الملفات التعريفية التي يديرها التطبيق

يتضمن Android 15 الفئة ProfilingManager الجديدة التي تتيح لك جمع معلومات التحليل عن بُعد من داخل تطبيقك. ونخطط لإضافة واجهة برمجة تطبيقات Android Jetpack على نحو تبسيط عملية إنشاء طلبات التحليل، إلا أنّ واجهة برمجة التطبيقات الأساسية ستتيح جمع البيانات والملفات الشخصية للكعب وأخذ عيّنات التكدس والمزيد. توفِّر هذه الميزة معاودة الاتصال بتطبيقك مع علامة متوفرة لتحديد ملف الإخراج الذي يتم تسليمه إلى دليل ملفات تطبيقك. تفرض واجهة برمجة التطبيقات قيودًا على المعدّل لتقليل تأثير الأداء.

تحسينات قاعدة بيانات SQLite

يقدّم Android 15 واجهات برمجة تطبيقات SQLite جديدة تكشف الميزات المتقدّمة من محرّك SQLite الأساسي الذي يستهدف مشاكل محدّدة في الأداء يمكن أن تحدث في التطبيقات.

وعلى المطوّرين الرجوع إلى أفضل الممارسات لأداء SQLite للاستفادة إلى أقصى حدّ من قاعدة بيانات SQLite، وخاصةً عند العمل مع قواعد البيانات الكبيرة أو عند تشغيل طلبات بحث حساسة لوقت الاستجابة.

  • المعاملات المؤجلة للقراءة فقط: عند إصدار معاملات للقراءة فقط (لا تتضمّن كشوف الحساب)، استخدِم beginTransactionReadOnly() وbeginTransactionWithListenerReadOnly(SQLiteTransactionListener) لإصدار معاملات DEFERRED للقراءة فقط. يمكن إجراء هذه المعاملات في الوقت نفسه، وإذا كانت قاعدة البيانات في وضع WAL، يمكن إجراؤها بشكل متزامن مع معاملات IMMEDIATE أو EXCLUSIVE.
  • عدد الصفوف والأرقام التعريفية: تمت إضافة واجهات برمجة تطبيقات جديدة لاسترداد عدد الصفوف التي تم تغييرها أو رقم تعريف آخر صف تم إدراجه بدون إصدار طلب بحث إضافي. تعرض getLastChangedRowCount() عدد الصفوف التي تم إدراجها أو تعديلها أو حذفها من خلال أحدث عبارة SQL ضمن المعاملة الحالية، بينما تعرض getTotalChangedRowCount() العدد على الاتصال الحالي. تعرض دالة getLastInsertRowId() rowid من الصف الأخير ليتم إدراجه في الاتصال الحالي.
  • البيانات الأولية: إصدار عبارة SQlite الأولية، مع استبعاد برامج تضمين الراحة وأي نفقات معالجة إضافية قد تتكبدها.

تحديثات "إطار عمل الأداء الديناميكي" من Android

يواصل Android 15 استثمارنا في إطار العمل الديناميكي لـ Android (ADPF)، وهو مجموعة من واجهات برمجة التطبيقات التي تتيح للألعاب والتطبيقات التي تستهلك قدرًا كبيرًا من الأداء إمكانية التفاعل مباشرةً مع أنظمة الطاقة والحرارة في أجهزة Android. على الأجهزة المتوافقة، سيضيف Android 15 إمكانات ADPF جديدة:

  • وضع كفاءة استهلاك الطاقة لجلسات التلميح للإشارة إلى أنّ سلاسل المحادثات المرتبطة بها يجب أن تفضّل توفير الطاقة على الأداء، وهو أمر رائع لأعباء العمل التي تستغرق وقتًا طويلاً في الخلفية.
  • يمكن تسجيل فترات عمل وحدة معالجة الرسومات ووحدة المعالجة المركزية في جلسات التلميح، ما يسمح للنظام بضبط ترددات وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات معًا لتلبية متطلبات أعباء العمل على أفضل نحو.
  • حدود هامش الارتفاع الحراري لتفسير حالة التقييد الحراري المحتملة استنادًا إلى توقّعات هامش الارتفاع.

لمزيد من المعلومات حول كيفية استخدام ADPF في تطبيقاتك وألعابك، يمكنك الانتقال إلى المستندات.

الخصوصية

يتضمّن Android 15 مجموعة متنوعة من الميزات التي تساعد مطوّري التطبيقات على حماية خصوصية المستخدمين.

رصد تسجيل الشاشة

يضيف نظام التشغيل Android 15 إمكانية تشغيل التطبيقات لرصد أنها يتم تسجيلها. يتم استدعاء معاودة الاتصال كلما انتقل التطبيق بين أن يكون مرئيًا أو غير مرئي ضمن تسجيل شاشة. يُعد التطبيق مرئيًا إذا كان يتم تسجيل الأنشطة التي يملكها المعرّف الفريد لعملية التسجيل. وبهذه الطريقة، إذا كان تطبيقك يجري عملية حساسة، يمكنك إبلاغ المستخدم بأنه يتم تسجيلها.

val mCallback = Consumer<Int> { state ->
  if (state == SCREEN_RECORDING_STATE_VISIBLE) {
    // We're being recorded
  } else {
    // We're not being recorded
  }
}

override fun onStart() {
   super.onStart()
   val initialState =
      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
   mCallback.accept(initialState)
}

override fun onStop() {
    super.onStop()
    windowManager.removeScreenRecordingCallback(mCallback)
}

إمكانات IntentFilter الموسَّعة

يدعم Android 15 توفير درجة دقة أكثر دقة عند استخدام Intent من خلال نظام UriRelativeFilterGroup الذي يحتوي على مجموعة من عناصر UriRelativeFilter التي تشكّل مجموعة من قواعد Intent المطابِقة التي يجب استيفاء كلّ منها، بما في ذلك مَعلمات طلب البحث لعناوين URL وأجزاء عناوين URL وقواعد الحظر أو الاستبعاد.

يمكن تحديد هذه القواعد في ملف XML AndroidManifest باستخدام علامة <uri-relative-filter-group> الجديدة التي يمكن أن تتضمّن علامة android:allow بشكل اختياري. يمكن أن تحتوي هذه العلامات على علامات <data> التي تستخدم سمات علامات البيانات الحالية، بالإضافة إلى السمتَين android:query وandroid:fragment الجديدتَين.

إليك مثال على بنية AndroidManifest:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:domain="astore.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/auth" />
    <data android:query="region=na" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:query="mobileoptout=true" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:fragmentPrefix="faq" />
  </uri-relative-filter-group>
</intent-filter>

المساحة الخاصة

يمكن فتح قفل المساحة الخاصة وقفلها لإظهار التطبيقات الحساسة أو إخفائها على الجهاز.

تتيح المساحة الخاصة للمستخدمين إنشاء مساحة منفصلة على أجهزتهم حيث يمكنهم إبعاد التطبيقات الحساسة عن المتطفلين، وذلك ضمن طبقة إضافية من المصادقة. تستخدم المساحة الخاصة ملفًا شخصيًا منفصلاً للمستخدم. وعندما يقفل المستخدم المساحة الخاصة، يتم إيقاف الملف الشخصي مؤقتًا وتتوقف أي تطبيقات في المساحة الخاصة. يمكن للمستخدم اختيار استخدام قفل الجهاز أو عامل قفل منفصل للمساحة الخاصة.

تظهر التطبيقات في المساحة الخاصة في حاوية منفصلة في مشغّل التطبيقات، ويتم إخفاؤها من عرض "أحدث التطبيقات" والإشعارات والإعدادات والتطبيقات الأخرى عندما تكون المساحة الخاصة مقفلة. يتم فصل المحتوى الذي ينشئه المستخدم والذي نزّله (مثل الوسائط أو الملفات) والحسابات بين المساحة الخاصة والمساحة الرئيسية. يمكن استخدام ورقة مشاركة النظام وأداة اختيار الصور لمنح التطبيقات إذن الوصول إلى المحتوى في المساحات المختلفة عند فتح قفل المساحة الخاصة.

ننصحك باختبار تطبيقك ومنحه مساحة خاصة للتأكّد من أنّه يعمل على النحو المتوقَّع، لا سيّما إذا كان تطبيقك يندرج ضمن إحدى الفئات التالية:

طلب البحث عن أحدث اختيار للمستخدم للوصول إلى الصور المحدّدة

بإمكان التطبيقات الآن إبراز أحدث الصور والفيديوهات التي تم اختيارها فقط عند منح إذن الوصول الجزئي إلى أذونات الوسائط. يمكن لهذه الميزة تحسين تجربة المستخدم للتطبيقات التي تطلب بشكل متكرر الوصول إلى الصور والفيديوهات. لاستخدام هذه الميزة في تطبيقك، فعِّل الوسيطة QUERY_ARG_LATEST_SELECTION_ONLY عند إجراء طلب بحث في MediaStore من خلال ContentResolver.

Kotlin

val externalContentUri = MediaStore.Files.getContentUri("external")

val mediaColumns = arrayOf(
   FileColumns._ID,
   FileColumns.DISPLAY_NAME,
   FileColumns.MIME_TYPE,
)

val queryArgs = bundleOf(
   // Return only items from the last selection (selected photos access)
   QUERY_ARG_LATEST_SELECTION_ONLY to true,
   // Sort returned items chronologically based on when they were added to the device's storage
   QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
   QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
   QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
       FileColumns.MEDIA_TYPE_IMAGE.toString(),
       FileColumns.MEDIA_TYPE_VIDEO.toString()
   )
)

Java

Uri externalContentUri = MediaStore.Files.getContentUri("external");

String[] mediaColumns = {
    FileColumns._ID,
    FileColumns.DISPLAY_NAME,
    FileColumns.MIME_TYPE
};

Bundle queryArgs = new Bundle();
queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true);
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC");
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?");
queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] {
    String.valueOf(FileColumns.MEDIA_TYPE_IMAGE),
    String.valueOf(FileColumns.MEDIA_TYPE_VIDEO)
});

"مبادرة حماية الخصوصية" على Android

يتضمّن الإصدار Android 15 أحدث إضافات "خدمات إعلانات Android"، وتتضمّن أحدث إصدار من "مبادرة حماية الخصوصية" على Android. وتُعدّ هذه الإضافة جزءًا من عملنا على تطوير تقنيات جديدة تعمل على تحسين خصوصية المستخدِمِين وإتاحة تجارب إعلانية مخصَّصة وفعّالة لتطبيقات الأجهزة الجوّالة. تحتوي صفحة "مبادرة حماية الخصوصية" على مزيد من المعلومات حول "مبادرة حماية الخصوصية" على معاينة مطوّري برامج Android والبرامج التجريبية لمساعدتك في البدء.

Health Connect

يدمج Android 15 أحدث الإضافات حول Health Connect by Android، وهي منصة آمنة ومركزة لإدارة ومشاركة بيانات الصحة واللياقة البدنية التي يجمعها التطبيق. ويتيح هذا التعديل إتاحة أنواع جديدة من البيانات على مستوى اللياقة البدنية والتغذية ودرجة حرارة الجلد وخطط التدريب وغير ذلك.

تتيح ميزة "تتبُّع درجة حرارة الجلد" للمستخدمين تخزين بيانات أكثر دقة عن درجات الحرارة من جهاز قابل للارتداء أو جهاز تتبُّع آخر، ومشاركتها

خطط التدريب عبارة عن خطط تدريب مُنظَّمة لمساعدة المستخدم في تحقيق أهداف اللياقة البدنية. ويتضمن دعم خطط التدريب مجموعة متنوعة من أهداف الإكمال والأداء:

يمكنك الاطّلاع على المزيد من المعلومات حول آخر التحديثات التي أجريناها على Health Connect في نظام Android من خلال المحاضرة من مؤتمر Google I/O بعنوان إنشاء تجارب قابلة للتكيّف مع Android Health.

مشاركة جزء من الشاشة

يتيح نظام التشغيل Android 15 ميزة مشاركة جزء من الشاشة، ما يتيح للمستخدمين مشاركة نافذة التطبيق أو تسجيلها بدلاً من شاشة الجهاز بأكملها. تمّ تفعيل هذه الميزة لأول مرّة في Android 14 QPR2، وتشمل MediaProjection عملية معاودة الاتصال التي تسمح لتطبيقك بتخصيص تجربة مشاركة الشاشة بشكل جزئي. يُرجى العلم بأنّه بالنسبة إلى التطبيقات التي تستهدف Android 14 (المستوى 34 لواجهة برمجة التطبيقات) أو الإصدارات الأحدث، يجب الحصول على موافقة المستخدم الآن لكل جلسة تسجيل على MediaProjection.

تجربة المستخدم وواجهة مستخدم النظام

يمنح نظام التشغيل Android 15 مطوّري التطبيقات والمستخدمين المزيد من التحكّم والمرونة لضبط أجهزتهم لتناسب احتياجاتهم.

للاطّلاع على مزيد من المعلومات حول كيفية استخدام آخر التحسينات في نظام التشغيل Android 15 لتحسين تجربة المستخدم على تطبيقك، يمكنك الاطّلاع على المقالة تحسين تجربة المستخدم على تطبيق Android من مؤتمر Google I/O.

معاينات أفضل للأدوات باستخدام واجهة برمجة التطبيقات الخاصة بميزة "المعاينات التي تم إنشاؤها"

قبل نظام التشغيل Android 15، كانت الطريقة الوحيدة لتوفير معاينات أداة اختيار الأدوات هي تحديد مورد ثابت للصورة أو التنسيق. غالبًا ما تختلف هذه المعاينات اختلافًا كبيرًا عن مظهر التطبيق المصغّر عند وضعه على الشاشة الرئيسية. لا يمكن أيضًا إنشاء الموارد الثابتة باستخدام Jetpack Glance، لذا كان على مطوّر البرامج في Glance لقطة شاشة للتطبيق المصغّر أو إنشاء تنسيق XML لإتاحة معاينة التطبيق.

يتيح نظام Android 15 استخدام المعاينات التي يتم إنشاؤها. وهذا يعني أنّه يمكن لموفّري تطبيقات الأدوات المصغّرة إنشاء RemoteViews لاستخدامها كمعاينة لأداة الاختيار، بدلاً من مورد ثابت.

يمكن للتطبيقات توفير ميزة "طرق العرض عن بُعد" لـ "أداة اختيار التطبيقات المصغّرة" بحيث يمكنها تعديل المحتوى في أداة الاختيار ليكون أكثر تمثيلاً لما يراه المستخدم.

واجهة برمجة التطبيقات Push

يمكن أن توفّر التطبيقات معاينات تم إنشاؤها من خلال واجهة برمجة تطبيقات Push. يمكن أن توفّر التطبيقات معاينات في أي مرحلة من مراحل نشاطها، ولا تتلقّى طلبًا صريحًا من المضيف لتوفير معاينات. يستمر الاحتفاظ بالمعاينات في AppWidgetService، ويمكن للمضيفين طلبها عند الطلب. يؤدي المثال التالي إلى تحميل مورد تنسيق أداة XML وتعيينه كمعاينة:

AppWidgetManager.getInstance(appContext).setWidgetPreview(
   ComponentName(
       appContext,
       SociaLiteAppWidgetReceiver::class.java
   ),
   AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
   RemoteViews("com.example", R.layout.widget_preview)
)

التدفق المتوقع هو:

  1. يطلب موفِّر التطبيقات المصغّرة في أي وقت الرمز setWidgetPreview. أمّا المعاينات المقدَّمة، فتستمر في AppWidgetService مع معلومات مقدّم الخدمة الأخرى.
  2. تُبلِغ setWidgetPreview مضيفي النسخة المعدّلة من خلال معاودة الاتصال في AppWidgetHost.onProvidersChanged. استجابةً لذلك، يعيد مضيف الأداة المصغّرة تحميل جميع معلومات المزود.
  3. عند عرض معاينة للأداة، يتحقّق المضيف من AppWidgetProviderInfo.generatedPreviewCategories، وفي حال كانت الفئة التي تم اختيارها متاحة، يطلب AppWidgetManager.getWidgetPreview عرض المعاينة المحفوظة لهذا مقدّم الخدمة.

وقت الاتصال بخدمة setWidgetPreview

بسبب عدم توفّر معاودة اتصال لتوفير المعاينات، يمكن للتطبيقات اختيار إرسال معاينات في أي وقت أثناء تشغيلها. يعتمد عدد مرات تحديث المعاينة على حالة استخدام الأداة.

توضِّح القائمة التالية الفئتَين الرئيسيتَين لحالات استخدام المعاينة:

  • مقدّمو الخدمات الذين يعرضون بيانات فعلية في معاينات التطبيقات المصغّرة، مثل المعلومات المخصّصة أو الحديثة. ويمكن لمقدّمي الخدمات هؤلاء ضبط المعاينة بعد تسجيل دخول المستخدم أو إكمال عملية الإعداد الأولية في تطبيقه. وبعد ذلك، يمكنهم إعداد مهمة دورية لتحديث المعاينات حسب الوتيرة التي يختارونها. ومن الأمثلة على هذا النوع من التطبيقات المصغّرة: أدوات الصور أو التقويم أو الطقس أو الأخبار.
  • مقدّمو الخدمات الذين يعرضون معلومات ثابتة في المعاينات أو أدوات الإجراءات السريعة التي لا تعرض أي بيانات ويمكن لهؤلاء المزودين تعيين المعاينات مرة واحدة، عند تشغيل التطبيق لأول مرة. ومن الأمثلة على هذا النوع من الأدوات: أداة الإجراءات السريعة على Drive أو أداة اختصارات Chrome.

قد يعرض بعض مقدمي البيانات معاينات ثابتة في منتقي وضع الإرساء، في حين يعرض معلومات حقيقية في أداة اختيار الشاشة الرئيسية. ويجب على هؤلاء المزوّدين اتّباع الإرشادات لكلتا حالتَي الاستخدام هاتين من أجل إعداد المعاينات.

نافذة ضمن النافذة

يقدّم Android 15 تغييرات جديدة في ميزة "نافذة ضمن النافذة" (PiP) لضمان الانتقال الأكثر سلاسة عند الدخول إلى وضع "نافذة ضمن النافذة". وسيكون ذلك مفيدًا للتطبيقات التي تحتوي على عناصر واجهة المستخدم متراكبة على واجهة المستخدم الرئيسية، والتي تدخل في "نافذة ضمن النافذة".

يستخدم مطوّرو البرامج معاودة الاتصال في onPictureInPictureModeChanged لتحديد منطق يوقِف إمكانية عرض عناصر واجهة المستخدم المركّبة. يتم تشغيل معاودة الاتصال هذه عند اكتمال حركة الدخول أو الخروج في وضع "نافذة ضمن النافذة" (PIP). بدءًا من نظام التشغيل Android 15، تتضمّن الفئة PictureInPictureUiState حالة جديدة.

من خلال حالة واجهة المستخدم الجديدة هذه، سترصد التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android معاودة الاتصال بـ Activity#onPictureInPictureUiStateChanged عند استدعاء isTransitioningToPip() فور بدء الصورة المتحركة في وضع "نافذة ضمن النافذة". هناك العديد من عناصر واجهة المستخدم التي لا صلة لها بالتطبيق عندما يكون في وضع "نافذة ضمن النافذة"، مثلاً طرق العرض أو التنسيق الذي يتضمّن معلومات مثل الاقتراحات والفيديوهات القادمة والتقييمات والعناوين. عندما ينتقل التطبيق إلى وضع "نافذة ضمن النافذة"، عليك استخدام وظيفة معاودة الاتصال onPictureInPictureUiStateChanged لإخفاء عناصر واجهة المستخدم هذه. عند انتقال التطبيق إلى وضع ملء الشاشة من نافذة "نافذة ضمن النافذة"، استخدِم ميزة معاودة الاتصال بنسبة onPictureInPictureModeChanged لإظهار هذه العناصر على النحو الموضّح في الأمثلة التالية:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements
        }
    }
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements
        }
    }

يساعد هذا التبديل السريع لعرض العناصر في واجهة المستخدم غير المرتبطة بالموضوع (بالنسبة إلى نافذة "نافذة ضمن النافذة") على ضمان إدخال صورة متحركة أكثر سلاسة وخالية من الوميض.

قواعد "عدم الإزعاج" المحسّنة

يسمح الإعداد AutomaticZenRule للتطبيقات بتخصيص قواعد "إدارة الانتباه (عدم الإزعاج)" وتحديد وقت تفعيلها أو إيقافها. يعزّز نظام Android 15 هذه القواعد بشكل كبير بهدف تحسين تجربة المستخدم. يتم تضمين التحسينات التالية:

  • إضافة أنواع إلى AutomaticZenRule، ما يسمح للنظام بتطبيق معاملة خاصة على بعض القواعد
  • جارٍ إضافة رمز إلى AutomaticZenRule لتسهيل التعرّف على الأوضاع.
  • إضافة سلسلة triggerDescription إلى AutomaticZenRule توضّح الشروط التي يجب أن تصبح القاعدة نشطة وفقًا لها للمستخدم
  • تمت إضافة ZenDeviceEffects إلى AutomaticZenRule، ما يتيح للقواعد تفعيل عناصر مثل عرض تدرّج الرمادي أو الوضع الليلي أو تعتيم الخلفية.

ضبط VibrationEffect لقنوات الإشعارات

يتيح Android 15 ضبط اهتزازات قوية للإشعارات الواردة على القناة باستخدام NotificationChannel.setVibrationEffect، ليتمكّن المستخدمون من التفريق بين الأنواع المختلفة من الإشعارات بدون الحاجة إلى النظر إلى أجهزتهم.

الشاشات الكبيرة وأشكال الأجهزة

يوفّر Android 15 لتطبيقاتك الدعم للاستفادة إلى أقصى حدّ من أشكال الأجهزة التي يوفِّرها Android، بما في ذلك الشاشات الكبيرة والأجهزة القابلة للطي والأجهزة القابلة للطي.

تحسين تعدُّد المهام على الشاشات الكبيرة

يوفّر Android 15 للمستخدمين طرقًا أفضل لتنفيذ مهام متعددة على الأجهزة ذات الشاشات الكبيرة. على سبيل المثال، يمكن للمستخدمين حفظ مجموعات التطبيقات المفضلة لديهم في وضع تقسيم الشاشة للوصول إليها بسرعة، وتثبيت شريط التطبيقات على الشاشة للتبديل بسرعة بين التطبيقات. وهذا يعني أن التأكّد من أنّ تطبيقك تكيُّفي أصبح أكثر أهمية من أي وقت مضى.

يشمل مؤتمر Google I/O جلسات حول إنشاء تطبيقات Android التكيُّفية وإنشاء واجهة المستخدم باستخدام مكتبة Material 3 التكيُّفية التي يمكن أن تساعد في ذلك، وتحتوي مستنداتنا على المزيد من المعلومات لمساعدتك في التصميم للشاشات الكبيرة.

دعم شاشة الغلاف

يمكن لتطبيقك توضيح موقع يستخدمه Android 15 للسماح بعرض Application أو Activity على شاشات الغلاف الصغيرة للأجهزة القابلة للطي المتوافقة. هذه الشاشات صغيرة جدًا بحيث لا يمكن اعتبارها استهدافات متوافقة مع تطبيقات Android لتشغيلها، ولكن يمكن لتطبيقك الموافقة على دعمها، مما يجعل تطبيقك متاحًا في المزيد من الأماكن.

إمكانية الاتصال

يحدِّث Android 15 النظام الأساسي لمنح تطبيقك إمكانية الوصول إلى أحدث التطورات في تقنيات الاتصالات واللاسلكية اللاسلكية.

دعم القمر الصناعي

يواصل Android 15 توسيع نطاق دعم النظام الأساسي لاتصال الأقمار الصناعية ويتضمن بعض عناصر واجهة المستخدم لضمان تجربة مستخدم متسقة عبر نظام اتصال الأقمار الصناعية.

يمكن للتطبيقات استخدام ServiceState.isUsingNonTerrestrialNetwork() لرصد اتصال أحد الأجهزة بقمر صناعي، ما يزيد من الوعي بسبب عدم توفُّر خدمات الشبكة الكاملة. بالإضافة إلى ذلك، يوفّر نظام التشغيل Android 15 دعمًا لتطبيقات الرسائل القصيرة ورسائل الوسائط المتعددة، بالإضافة إلى تطبيقات خدمات الاتصالات التفاعلية (RCS) المُحمَّلة مسبقًا لاستخدام اتصال القمر الصناعي لإرسال الرسائل واستلامها.

يظهر إشعار عندما يتصل الجهاز بقمر صناعي.

تجارب تقنية NFC أكثر سلاسة

يسعى Android 15 إلى جعل تجربة الدفع بدون تلامس الأجهزة أكثر سلاسة وموثوقية مع مواصلة التوافق مع المنظومة المتكاملة والفعّالة لتطبيق NFC في Android. على الأجهزة المتوافقة، يمكن للتطبيقات أن تطلب من NfcAdapter الدخول إلى وضع المراقبة، حيث يستجيب الجهاز لأجهزة قراءة NFC بدون استجابته، مرسلة خدمة NFC الخاصة بالتطبيق PollingFrame عناصر لتتم معالجتها. يمكن استخدام كائنات PollingFrame لمصادقة عملية التواصل الأولى مع قارئ NFC، ما يسمح بإجراء معاملة بنقرة واحدة في كثير من الحالات.

بالإضافة إلى ذلك، يمكن للتطبيقات الآن تسجيل بصمة إصبع على الأجهزة المتوافقة حتى يتم إرسال إشعارات إليها بنشاط حلقة الاستطلاع، ما يتيح التشغيل بسلاسة مع التطبيقات المتعددة المستندة إلى تقنية NFC.

دور المحفظة

يقدّم Android 15 دورًا جديدًا في "محفظة Google" يتيح دمجًا أكثر دقة مع تطبيق المحفظة المفضّل لدى المستخدم. ويحلّ هذا الدور محلّ إعدادات الدفع بدون تلامس الأجهزة التلقائية لتقنية NFC. يمكن للمستخدمين إدارة صاحب دور المحفظة من خلال الانتقال إلى الإعدادات > التطبيقات > التطبيقات التلقائية.

يُستخدَم دور "المحفظة" عند توجيه نقرات NFC لمعرّفات AID المسجّلة في فئة الدفع. تصل النقرات دائمًا إلى صاحب دور "محفظة Google" ما لم يكن هناك تطبيق آخر مُسجَّل في معرّف AID نفسه قيد التشغيل في المقدّمة.

يُستخدَم هذا الدور أيضًا لتحديد المكان الذي يجب أن ينتقل إليه مربّع الوصول السريع في "محفظة Google" عند تفعيله. عند ضبط الدور على "None" ("بدون")، لا يكون مربّع QuickAccess متاحًا، ولا يتم عرض نقرات NFC في فئة الدفع إلا على التطبيق المُقدَّم في المقدّمة.

الأمان

يساعدك Android 15 على تحسين مستوى أمان تطبيقك وحماية بياناته ومنح المستخدمين مزيدًا من الشفافية والتحكّم في بياناتهم. راجِع المقالة حماية أمان المستخدم على Android من مؤتمر Google I/O لمعرفة الإجراءات التي نتّخذها لتحسين إجراءات وقاية المستخدمين وحماية تطبيقك من التهديدات الجديدة.

إدارة المفاتيح للتشفير التام بين الأطراف

نحن بصدد طرح E2eeContactKeysManager في نظام Android 15 الذي يسهّل التشفير التام بين الأطراف (E2EE) في تطبيقات Android الخاصة بك من خلال توفير واجهة برمجة تطبيقات على مستوى نظام التشغيل لتخزين المفاتيح العامة المشفّرة.

تم تصميم E2eeContactKeysManager للتكامل مع تطبيق "جهات الاتصال" على النظام الأساسي لمنح المستخدمين طريقة مركزية لإدارة المفاتيح العامة لجهات الاتصال والتحقق منها.

عمليات التحقّق من أذونات معرّفات الموارد المنتظمة (URI) للمحتوى

يقدّم Android 15 مجموعة جديدة من واجهات برمجة التطبيقات التي تُجري عمليات تحقّق من أذونات الوصول إلى معرّفات الموارد المنتظمة (URI) للمحتوى:

  • Context.checkContentUriPermissionFull: يؤدي هذا الخيار إلى إجراء التحقق من الأذونات الكاملة لمعرّفات الموارد المنتظمة (URI) للمحتوى.
  • سمة البيان Activity requireContentUriPermissionFromCaller: يؤدي ذلك إلى فرض أذونات محدّدة على معرّفات الموارد المنتظمة (URI) للمحتوى التي تم توفيرها عند بدء النشاط.
  • فئة ComponentCaller للمتصلين Activity: يمثل هذا التطبيق الذي أطلق النشاط.

تسهيل الاستخدام

يضيف نظام التشغيل Android 15 ميزات تحسِّن تسهيل الاستخدام للمستخدمين.

لغة برايل أفضل

في نظام التشغيل Android 15، أتحنا إمكانية توافق TalkBack مع شاشات برايل التي تستخدم معيار HID عبر كل من USB والبلوتوث الآمن.

ويشبه هذا المعيار إلى حد كبير المعيار الذي تستخدمه أجهزة الماوس ولوحات المفاتيح، وسيساعد نظام التشغيل Android على دعم مجموعة أكبر من شاشات برايل بمرور الوقت.

التوافق مع أسواق عالمية

يضيف نظام التشغيل Android 15 ميزات وإمكانات تكمّل تجربة المستخدم عند استخدام الجهاز بلغات مختلفة.

خط متغيِّر CJK

بدءًا من نظام التشغيل Android 15، أصبح ملف الخط للّغات الصينية واليابانية والكورية (CJK)، وهو NotoSansCJK، الآن خطًا متغيّرًا. تفتح الخطوط المتغيرة إمكانيات جديدة لأسلوب الخط الإبداعي في لغات CJK. يمكن للمصممين استكشاف مجموعة أوسع من الأنماط وإنشاء تخطيطات مذهلة بصريًا كان من الصعب أو المستحيل تحقيقها في السابق.

كيف يظهر الخط المتغيّر للغات الصينية واليابانية والكورية (CJK) بعرض خط مختلف.

تبرير بين الأحرف

بدءًا من نظام التشغيل Android 15، يمكن ضبط تباعد الأحرف باستخدام JUSTIFICATION_MODE_INTER_CHARACTER. تم طرح ميزة التبرير البيني للمرة الأولى في نظام التشغيل Android 8.0 (المستوى 26 من واجهة برمجة التطبيقات)، ويوفّر التبرير بين الأحرف إمكانات مماثلة للغات التي تستخدم حرف المسافة البيضاء للتقسيم إلى شرائح، مثل الصينية واليابانية وغيرها.

تنسيق للنص الياباني باستخدام JUSTIFICATION_MODE_NONE.
تنسيق للنص الإنجليزي باستخدام JUSTIFICATION_MODE_NONE


تنسيق للنص الياباني باستخدام JUSTIFICATION_MODE_INTER_WORD.
تنسيق للنص الإنجليزي باستخدام JUSTIFICATION_MODE_INTER_WORD


تنسيق للنص الياباني باستخدام JUSTIFICATION_MODE_INTER_CHARACTER الجديدة.
تنسيق للنص الإنجليزي باستخدام JUSTIFICATION_MODE_INTER_CHARACTER الجديدة.

الإعداد التلقائي لفاصل الأسطر

بدأ Android في إتاحة فواصل الأسطر المستندة إلى العبارات للّغات اليابانية والكورية في Android 13 (المستوى 33 من واجهة برمجة التطبيقات). ومع ذلك، في حين تعمل فواصل الأسطر القائمة على العبارات على تحسين سهولة قراءة سطور النص القصيرة، إلا أنها لا تعمل بشكل جيد مع سطور النص الطويلة. في نظام التشغيل Android 15، يمكن للتطبيقات الآن تطبيق فواصل الأسطر المستندة إلى العبارة على الأسطر القصيرة من النص فقط باستخدام الخيار LINE_BREAK_WORD_STYLE_AUTO. يحدد هذا الخيار أفضل نمط نمط للكلمة للنص.

بالنسبة إلى الأسطر القصيرة من النص، يتم استخدام فواصل الأسطر المستندة إلى العبارات، وستعمل تمامًا مثل LINE_BREAK_WORD_STYLE_PHRASE، كما هو موضّح في الصورة التالية:

بالنسبة إلى الأسطر القصيرة من النص، يطبّق LINE_BREAK_WORD_STYLE_AUTO فواصل أسطر مستندة إلى العبارات لتحسين إمكانية قراءة النص. وينطبق ذلك على عملية تطبيق LINE_BREAK_WORD_STYLE_PHRASE.

بالنسبة إلى أسطر النص الأطول، يستخدم LINE_BREAK_WORD_STYLE_AUTO نمط كلمات بدون فاصل أسطر، ويعمل مثل LINE_BREAK_WORD_STYLE_NONE، كما هو موضح في الصورة التالية:

بالنسبة إلى أسطر النص الطويلة، لا يطبِّق LINE_BREAK_WORD_STYLE_AUTO نمط كلمات فواصل أسطر لتحسين إمكانية قراءة النص. وينطبق ذلك على عملية تطبيق LINE_BREAK_WORD_STYLE_NONE.

خط Hentaigana الياباني الجديد

في نظام التشغيل Android 15، يتم تلقائيًا تجميع ملف خط جديد للهيراغانا اليابانية القديم (المعروف باسم Hentaigana). يمكن للأشكال الفريدة لشخصيات هنتايغانا أن تضفي طابعًا مميزًا على الأعمال الفنية أو التصميم، كما تساعد في الحفاظ على دقة انتقال وفهم المستندات اليابانية القديمة.

نمط الحرف والنص لخط "هنتايغانا" الياباني:

حقوق الطبع والنشر لـ VideoLAN المخروطية (c) 1996-2010 VideoLAN. يمكن لأي شخص استخدام هذا الشعار أو نسخة معدلة أو تعديلها للإشارة إلى مشروع VideoLAN أو أي منتج طوّره فريق VideoLAN، ولكنها لا تشير إلى توصية من المشروع.

Vulkan وشعار Vulkan هما علامتان تجاريتان مسجَّلتان لشركة الخronos Group Inc.

OpenGL هي علامة تجارية مسجّلة، وشعار OpenGL ES هو علامة تجارية لشركة Hewlett Packard Enterprise وتستخدمها بموجب إذن من شركةKronos.