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

يقدّم 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 类时,您无法得知应用是从广播、content provider、作业、备份、启动完成、闹钟还是 Activity 启动的。

Android 15 上的 ApplicationStartInfo API 可提供所有这些功能以及更多其他功能。您甚至可以选择将自己的时间戳添加到流程中,以便在一个位置收集时间数据。除了收集指标之外,您还可以使用 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 增加了对应用检测功能的支持,以检测其是否被录制。每当应用在屏幕录制中处于可见或不可见状态之间转换时,系统都会调用回调。如果系统正在记录注册进程的 UID 拥有的 activity,则应用会被视为可见。这样,如果您的应用正在执行敏感操作,您就可以告知用户系统正在记录这些操作。

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 广告服务扩展程序,以及最新版 Privacy Sandbox on Android。我们致力于开发新的技术,以便更好地保护用户隐私,并为移动应用打造有效的个性化广告体验。这项新功能是我们的工作的一部分。我们的隐私沙盒页面详细介绍了 Privacy Sandbox on Android 开发者预览版和 Beta 版计划,以帮助您开始使用。

Health Connect

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

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

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

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

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

Android 15 支持局部屏幕共享,因此用户可以仅分享或录制应用窗口,而不是整个设备屏幕。此功能在 Android 14 QPR2 中首次启用,包含 MediaProjection 回调,可让您的应用自定义局部屏幕共享体验。请注意,对于以 Android 14(API 级别 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 正努力让感应式付款体验更加顺畅和可靠,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter 进入观察模式,在该模式下,设备会监听 NFC 读取器,但不响应 NFC 读取器,同时发送应用的 NFC 服务 PollingFrame 对象进行处理。PollingFrame 对象可用于在首次与 NFC 读取器通信之前进行身份验证,在许多情况下可实现一键交易。

此外,应用现在可以在受支持的设备上注册指纹,以便接收轮询循环活动的相关通知,从而实现通过多个可感知 NFC 的应用顺畅执行的操作。

دور المحفظة

Android 15 引入了一个新的钱包角色,可让您与用户首选的钱包应用更紧密地集成。此角色取代了 NFC 默认的感应式付款设置。用户可以通过导航到设置 > 应用 > 默认应用来管理 Google 钱包角色持有者。

在为付款类别中注册的 AID 路由 NFC 触碰时,可使用“钱包”角色。除非已在前台运行为同一 AID 注册的另一个应用,否则点按操作会始终转到钱包角色持有者。

此角色还可用于确定钱包“快速访问”功能块在启用后应转到的位置。当角色设置为“无”时,“快速访问”功能块不可用,并且付款类别 NFC 触碰仅会传送到前台应用。

الأمان

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

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

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

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

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

Android 15 引入了一组可对内容 URI 执行权限检查的新 API:

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

يضيف نظام التشغيل 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)的新字体文件。形态独特的 Hentaigana 角色可为艺术作品或设计增添独特的风格,同时有助于准确传达和理解古代日本文献。

日语 Hentaigana 字体的字符和文字样式。

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

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

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