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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

التحكّم في هامش النمو ضمن النطاق العالي الديناميكية

يختار نظام التشغيل 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 Studio و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 Font

يحسّن 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 الذي تم إنشاؤه باستخدام واجهة برمجة التطبيقات القديمة على القدرة على إنشاء سُمك خط دقيقة للأحجام 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، وبالتالي يمكن استخدام ميزة "نظرة سريعة". اضطر المطوّر إلى أخذ لقطة شاشة للتطبيق المصغَّر أو إنشاء تنسيق 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"

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

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

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

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

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

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

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

في حالة واجهة المستخدم الجديدة هذه، ستتتبّع التطبيقات التي تستهدف الإصدار 15 من نظام التشغيل Android تم استدعاء استدعاء Activity#onPictureInPictureUiStateChanged باستخدام isTransitioningToPip() عند بدء الصورة المتحركة في "نافذة ضمن النافذة" (PIP). تتوفر العديد من عناصر واجهة المستخدم التي لا صلة لها بالتطبيق عندما يكون في وضع "نافذة ضمن النافذة"، أمثلة على طرق العرض أو التخطيط الذي يتضمن معلومات مثل الاقتراحات والفيديوهات والتقييمات والعناوين. عند انتقال التطبيق إلى وضع "نافذة ضمن النافذة"، استخدِم 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، بما في ذلك الشاشات الكبيرة والأجهزة القابلة للطيّ والأجهزة القابلة للطي.

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

يوفّر 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 على توفير تجربة أكثر سلاسة وموثوقية من خلال ميزة "الدفع بدون تلامس الأجهزة" مع منظومة Android المتكاملة الفعّالة الخاصة بتطبيقات NFC. على الأجهزة المتوافقة، يمكن للتطبيقات طلب تفعيل NfcAdapter وضع المراقبة، حيث يستمع الجهاز إلى قارئات NFC بدون استجابة له، ما يؤدي إلى إرسال خدمة NFC الخاصة PollingFrame الكائنات إلى المعالجة. يمكن استخدام كائنات PollingFrame للمصادقة قبل الاتصال الأول بقارئ NFC، ما يتيح إجراء معاملة بنقرة واحدة في كثير من الحالات.

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

دور "محفظة Google"

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

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

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

الأمان

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

دمج "مدير بيانات الاعتماد" مع ميزة "الملء التلقائي"

Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.

الاشتراك بنقرة واحدة وتسجيل الدخول مع إشعارات المقاييس الحيوية

Credential Manager integrates biometric prompts into the credential creation and sign-in processes, eliminating the need for providers to manage biometric prompts. As a result, credential providers only need to focus on the results of the create and get flows, augmented with the biometric flow result. This simplified process creates a more efficient and streamlined credential creation and retrieval process.

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

نحن بصدد طرح 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.