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

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

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

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

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

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

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

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

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

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

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

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

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

Android 15 adds a new extension for more control over the camera hardware and its algorithms on supported devices:

  • Advanced flash strength adjustments enabling precise control of flash intensity in both SINGLE and TORCH modes while capturing images.

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

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

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

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

Android 15 introduces support for the CTA-2075 loudness standard to help you avoid audio loudness inconsistencies and ensure users don't have to constantly adjust volume when switching between content. The system leverages known characteristics of the output devices (headphones and speaker) along with loudness metadata available in AAC audio content to intelligently adjust the audio loudness and dynamic range compression levels.

To enable this feature, you need to ensure loudness metadata is available in your AAC content and enable the platform feature in your app. For this, you instantiate a LoudnessCodecController object by calling its create factory method with the audio session ID from the associated AudioTrack; this automatically starts applying audio updates. You can pass an OnLoudnessCodecUpdateListener to modify or filter loudness parameters before they are applied on the 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 will also be updated to use the LoudnessCodecController APIs for a seamless app integration.

أجهزة MIDI الافتراضية التي تعمل بالإصدار 2.0

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

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

dav1d logo

dav1d, the popular AV1 software decoder from VideoLAN is now available for Android devices that don't support AV1 decode in hardware. dav1d is up to 3x more performant than the legacy AV1 software decoder, enabling HD AV1 playback for more users, including some low and mid tier devices.

For now, your app needs to opt-in to using dav1d by invoking it by name "c2.android.av1-dav1d.decoder". dav1d will be made the default AV1 software decoder in a subsequent update. This support is standardized and backported to Android 11 devices that receive Google Play system updates.

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

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

تحديثات OpenJDK 17

Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.

The following key features and improvements are included:

These APIs are updated on over a billion devices running Android 12 (API level 31) and higher through Google Play System updates, so you can target the latest programming features.

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

Android 15 includes substantial improvements to the PdfRenderer APIs. Apps can incorporate advanced features such as rendering password-protected files, annotations, form editing, searching, and selection with copy. Linearized PDF optimizations are supported to speed local PDF viewing and reduce resource use.

The latest updates to PDF rendering include features such as searching an embedded PDF file.

The PdfRenderer has been moved to a module that can be updated using Google Play system updates independent of the platform release, and we're supporting these changes back to Android 11 (API level 30) by creating a compatible pre-Android 15 version of the API surface, called PdfRendererPreV.

We value your feedback on the enhancements we've made to the PdfRenderer API surface, and we plan to make it even easier to incorporate these APIs into your app with an upcoming Android Jetpack library.

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

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

واجهة برمجة تطبيقات محسّنة لـ OpenType Variable Font

Android 15 improves the usability of the OpenType variable font. You can now create a FontFamily instance from a variable font without specifying weight axes with the buildVariableFamily API. The text renderer overrides the value of wght axis to match the displaying text.

Using the new API, this simplifies the code for creating a Typeface considerably:

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();

Previously, to create the same Typeface, you would need much more code:

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();

Here's an example of how a Typeface created with both the old and new APIs renders:

An example of how Typeface rendering differs using new and old
APIs

In this example, the Typeface created with the old API doesn't have the capability to create accurate font weights for the 350, 450, 550 and 650 Font instances, so the renderer falls back to the closest weight. So in this case, 300 is rendered instead of 350, 400 is rendered instead of 450, and so on. By contrast, the Typeface created with the new APIs dynamically creates a Font instance for a given weight, so accurate weights are rendered for 350, 450, 550, and 650 as well.

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

Starting in Android 15, a TextView and the underlying line breaker can preserve the given portion of text in the same line to improve readability. You can take advantage of this line break customization by using the <nobreak> tag in string resources or createNoBreakSpan. Similarly, you can preserve words from hyphenation by using the <nohyphen> tag or createNoHyphenationSpan.

For example, the following string resource doesn't include a line break, and renders with the text "Pixel 8 Pro." breaking in an undesirable place:

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

In contrast, this string resource includes the <nobreak> tag, which wraps the phrase "Pixel 8 Pro." and prevents line breaks:

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

The difference in how these strings are rendered is shown in the following images:

Layout for a line of text where the phrase "Pixel 8 Pro." isn't wrapped using a <nobreak> tag.
Layout for the same line of text where the phrase "Pixel 8 Pro." is wrapped using a <nobreak> tag.

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

أعلن فريقا 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 continues our modernization of Android's Canvas graphics system with new capabilities:

  • Matrix44 provides a 4x4 matrix for transforming coordinates that should be used when you want to manipulate the canvas in 3D.
  • clipShader intersects the current clip with the specified shader, while clipOutShader sets the clip to the difference of the current clip and the shader, each treating the shader as an alpha mask. This supports the drawing of complex shapes efficiently.

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

يواصل 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 continues our investment in the Android Dynamic Performance Framework (ADPF), a set of APIs that allow games and performance intensive apps to interact more directly with power and thermal systems of Android devices. On supported devices, Android 15 will add new ADPF capabilities:

  • A power-efficiency mode for hint sessions to indicate that their associated threads should prefer power saving over performance, great for long-running background workloads.
  • GPU and CPU work durations can both be reported in hint sessions, allowing the system to adjust CPU and GPU frequencies together to best meet workload demands.
  • Thermal headroom thresholds to interpret possible thermal throttling status based on headroom prediction.

To learn more about how to use ADPF in your apps and games, head over to the documentation.

الخصوصية

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

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

Android 15 adds support for apps to detect that they are being recorded. A callback is invoked whenever the app transitions between being visible or invisible within a screen recording. An app is considered visible if activities owned by the registering process's UID are being recorded. This way, if your app is performing a sensitive operation, you can inform the user that they're being recorded.

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 builds in support for more precise Intent resolution through UriRelativeFilterGroup, which contains a set of UriRelativeFilter objects that form a set of Intent matching rules that must each be satisfied, including URL query parameters, URL fragments, and blocking or exclusion rules.

These rules can be defined in the AndroidManifest XML file with the new <uri-relative-filter-group> tag, which can optionally include an android:allow tag. These tags can contain <data> tags that use existing data tag attributes as well as the new android:query and android:fragment attributes.

Here's an example of the AndroidManifest syntax:

<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>

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

The private space can be unlocked and locked to show or hide sensitive apps on a device.

Private space lets users create a separate space on their device where they can keep sensitive apps away from prying eyes, under an additional layer of authentication. The private space uses a separate user profile. The user can choose to use the device lock or a separate lock factor for the private space.

Apps in the private space show up in a separate container in the launcher, and are hidden from the recents view, notifications, settings, and from other apps when the private space is locked. User-generated and downloaded content (such as media or files) and accounts are separated between the private space and the main space. The system sharesheet and the photo picker can be used to give apps access to content across spaces when the private space is unlocked.

Users can't move existing apps and their data into the private space. Instead, users select an install option in the private space to install an app using whichever app store they prefer. Apps in the private space are installed as separate copies from any apps in the main space (new copies of the same app).

When a user locks the private space, the profile is stopped. While the profile is stopped, apps in the private space are no longer active and can't perform foreground or background activities, including showing notifications.

We recommend that you test your app with private space to make sure your app works as expected, especially if your app falls into one of the following categories:

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

It is now possible for apps to highlight only the most recently selected photos and videos when partial access to media permissions is granted. This feature can improve the user experience for apps that frequently request access to photos and videos. To use this feature in your app, enable the QUERY_ARG_LATEST_SELECTION_ONLY argument when querying MediaStore through 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 supports partial screen sharing so users can share or record just an app window rather than the entire device screen. This feature, first enabled in Android 14 QPR2, includes MediaProjection callbacks that allow your app to customize the partial screen sharing experience. Note that for apps targeting Android 14 (API level 34) or higher, user consent is now required for each MediaProjection capture session.

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

يمنح 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 introduces new changes in Picture-in-Picture (PiP) ensuring an even smoother transition when entering into PiP mode. This will be beneficial for apps having UI elements overlaid on top of their main UI, which goes into PiP.

Developers use the onPictureInPictureModeChanged callback to define logic that toggles the visibility of the overlaid UI elements. This callback is triggered when the PiP enter or exit animation is completed. Beginning in Android 15, the PictureInPictureUiState class includes a new state.

With this new UI state, apps targeting Android 15 will observe the Activity#onPictureInPictureUiStateChanged callback being invoked with isTransitioningToPip() as soon as the PiP animation starts. There are many UI elements that are not relevant for the app when it is in PiP mode, for example views or layout that include information such as suggestions, upcoming video, ratings, and titles. When the app goes to PiP mode, use the onPictureInPictureUiStateChanged callback to hide these UI elements. When the app goes to full screen mode from the PiP window, use onPictureInPictureModeChanged callback to unhide these elements, as shown in the following examples:

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

This quick visibility toggle of irrelevant UI elements (for a PiP window) helps ensure a smoother and flicker-free PiP enter animation.

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

AutomaticZenRule lets apps customize Attention Management (Do Not Disturb) rules and decide when to activate or deactivate them. Android 15 greatly enhances these rules with the goal of improving the user experience. The following enhancements are included:

  • Adding types to AutomaticZenRule, allowing the system to apply special treatment to some rules.
  • Adding an icon to AutomaticZenRule, helping to make the modes be more recognizable.
  • Adding a triggerDescription string to AutomaticZenRule that describes the conditions on which the rule should become active for the user.
  • Added ZenDeviceEffects to AutomaticZenRule, allowing rules to trigger things like grayscale display, night mode, or dimming the wallpaper.

تعيين VibrationEffect لقنوات الإشعارات

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

الشاشات الكبيرة وعوامل الشكل

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

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

Android 15 gives users better ways to multitask on large screen devices. For example, users can save their favorite split-screen app combinations for quick access and pin the taskbar on screen to quickly switch between apps. This means that making sure your app is adaptive is more important than ever.

Google I/O has sessions on Building adaptive Android apps and Building UI with the Material 3 adaptive library that can help, and our documentation has more to help you Design for large screens.

دعم شاشة الغطاء

Your app can declare a property that Android 15 uses to allow your Application or Activity to be presented on the small cover screens of supported flippable devices. These screens are too small to be considered as compatible targets for Android apps to run on, but your app can opt in to supporting them, making your app available in more places.

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

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

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

Android 15 continues to extend platform support for satellite connectivity and includes some UI elements to ensure a consistent user experience across the satellite connectivity landscape.

Apps can use ServiceState.isUsingNonTerrestrialNetwork() to detect when a device is connected to a satellite, giving them more awareness of why full network services might be unavailable. Additionally, Android 15 provides support for SMS and MMS apps as well as preloaded RCS apps to use satellite connectivity for sending and receiving messages.

A notification appears when the device connects to a satellite.

تجارب أكثر سلاسة عبر NFC

Android 15 is working to make the tap to pay experience more seamless and reliable while continuing to support Android's robust NFC app ecosystem. On supported devices, apps can request the NfcAdapter to enter observe mode, where the device listens but doesn't respond to NFC readers, sending the app's NFC service PollingFrame objects to process. The PollingFrame objects can be used to auth ahead of the first communication to the NFC reader, allowing for a one tap transaction in many cases.

In addition, apps can now register a filter on supported devices so they can be notified of polling loop activity, which allows for smooth operation with multiple NFC-aware applications.

دور "محفظة Google"

Android 15 introduces a new Wallet role that allows tighter integration with the user's preferred wallet app. This role replaces the NFC default contactless payment setting. Users can manage the Wallet role holder by navigating to Settings > Apps > Default Apps.

The Wallet role is used when routing NFC taps for AIDs registered in the payment category. Taps always go to the Wallet role holder unless another app that is registered for the same AID is running in the foreground.

This role is also used to determine where the Wallet QuickAccess tile should go when activated. When the role is set to "None", the QuickAccess tile isn't available and payment category NFC taps are only delivered to the foreground app.

الأمان

يساعدك نظام التشغيل 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.

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

We are introducing the E2eeContactKeysManager in Android 15, which facilitates end-to-end encryption (E2EE) in your Android apps by providing an OS-level API for the storage of cryptographic public keys.

The E2eeContactKeysManager is designed to integrate with the platform contacts app to give users a centralized way to manage and verify their contacts' public keys.

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

Android 15 introduces a new set of APIs that perform permission checks on content URIs:

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

يضيف 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 الياباني الجديد

In Android 15, a new font file for old Japanese Hiragana (known as Hentaigana) is bundled by default. The unique shapes of Hentaigana characters can add a distinctive flair to artwork or design while also helping to preserve accurate transmission and understanding of ancient Japanese documents.

Character and text style for the Japanese Hentaigana font.

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. This logo or a modified version may be used or modified by anyone to refer to the VideoLAN project or any product developed by the VideoLAN team, but does not indicate endorsement by the project.

Vulkan and the Vulkan logo are registered trademarks of the Khronos Group Inc.

OpenGL is a registered trademark and the OpenGL ES logo is a trademark of Hewlett Packard Enterprise used by permission by Khronos.