סקירה כללית על תכונות וממשקי API

‫Android 15 כולל תכונות וממשקי API מעולים למפתחים. בקטעים הבאים מופיע סיכום של התכונות האלה שיעזור לכם להתחיל להשתמש בממשקי ה-API שקשורים אליהן.

רשימה מפורטת של ממשקי API שנוספו, שונו או הוסרו מופיעה בדוח ההבדלים בין ממשקי ה-API. לפרטים על ממשקי API שנוספו, אפשר לעיין בהפניית Android API. ב-Android 15, מחפשים ממשקי API שנוספו ברמת API 35. כדי לקבל מידע על תחומים שבהם שינויים בפלטפורמה עשויים להשפיע על האפליקציות שלכם, כדאי לעיין בשינויים בהתנהגות של Android 15 באפליקציות שמטרגטות ל-Android 15 ובכל האפליקציות.

מצלמה ומדיה

‫Android 15 כולל מגוון תכונות שמשפרות את חוויית השימוש במצלמה ובמדיה, ומעניקות לכם גישה לכלים ולחומרה שתומכים ביוצרים בהגשמת החזון שלהם ב-Android.

מידע נוסף על התכונות והפתרונות העדכניים למפתחים בנושא מדיה ומצלמה ב-Android זמין בשיחה Building modern Android media and camera experiences מ-Google I/O.

הגברת התאורה החלשה

ב-Android 15 נוספה התכונה שיפור התמונה בתאורה חלשה, מצב חשיפה אוטומטי שזמין גם ב-Camera 2 וגם בתוסף המצלמה של מצב לילה. התכונה 'הגברת התאורה החלשה' מכווננת את החשיפת הסטרימינג של התצוגה המקדימה בתנאים של תאורה חלשה. זה שונה מהאופן שבו התוסף של מצב הלילה במצלמה יוצר תמונות סטילס, כי במצב הלילה נעשה שימוש ברצף של תמונות כדי ליצור תמונה אחת משופרת. מצב לילה מתאים מאוד ליצירת תמונה סטילס, אבל אי אפשר ליצור בו שידור רציף של פריימים. לעומת זאת, התכונה 'שיפור תמונה בתאורה חלשה' מאפשרת לעשות זאת. לכן, התכונה 'שיפור איכות בתנאי תאורה חלשה' מאפשרת למצלמה לבצע פעולות כמו:

  • הצגת תצוגה מקדימה משופרת של התמונות, כדי שהמשתמשים יוכלו לבחור מסגרת טובה יותר לתמונות שצולמו בתאורה חלשה
  • סריקת קודי QR בתאורה חלשה

אם מפעילים את התכונה'הגברת התאורה החלשה', היא מופעלת באופן אוטומטי כשרמת התאורה נמוכה, ומושבתת כשיש יותר אור.

אפליקציות יכולות לצלם את מקור הווידאו של התצוגה המקדימה בתנאים של תאורה חלשה כדי לשמור סרטון בהיר יותר.

מידע נוסף זמין במאמר שיפור התמונה בתאורה נמוכה.

אמצעי בקרה למצלמה באפליקציה

ב-Android 15 נוספה תוספת שמאפשרת יותר שליטה בחומרה של המצלמה ובאלגוריתמים שלה במכשירים נתמכים:

  • כוונונים מתקדמים של עוצמת הפלאש שמאפשרים לשלוט בצורה מדויקת בעוצמת הפלאש במצבים SINGLE ו-TORCH בזמן הצילום.

שליטה במרווח הדינמי של HDR

מערכת Android 15 בוחרת את מרווח ה-HDR שמתאים ליכולות המכשיר ולעומק הביטים של המסך. בדפים שיש בהם הרבה תוכן SDR, כמו אפליקציית הודעות שמציגה תמונה ממוזערת אחת ב-HDR, ההתנהגות הזו עלולה להשפיע לרעה על הבהירות של תוכן ה-SDR. ב-Android 15 אפשר לשלוט במרווח העליון של HDR באמצעות setDesiredHdrHeadroom כדי לשמור על איזון בין תוכן SDR לתוכן HDR.

הבהירות של רכיבי ממשק המשתמש של SDR במסך הימני נראית אחידה יותר מהבהירות במסך הימני, והיא מדמה בעיות אפשריות במרווח נוסף לנתונים כשמשתמשים בתוכן HDR ו-SDR מעורב. שינוי של מרווח ה-HDR מאפשר לכם להשיג איזון טוב יותר בין התוכן ב-SDR לבין התוכן ב-HDR.

בקרת עוצמת הקול

ב-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 יתעדכן כך שישתמש בממשקי ה-API של 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 באיכות HD למשתמשים רבים יותר, כולל במכשירים מסוימים ברמה נמוכה ובינונית.

כדי להשתמש ב-dav1d, האפליקציה צריכה להביע הסכמה להפעלה שלו בשם "c2.android.av1-dav1d.decoder". בעדכון עתידי, dav1d יהפוך למפענח התוכנה המוגדר כברירת מחדל של AV1. התמיכה הזו סטנדרטית ומועברת לאחור למכשירי Android 11 שמקבלים עדכוני מערכת של Google Play.

פרודוקטיביות וכלים למפתחים

רוב העבודה שלנו לשיפור הפרודוקטיביות מתמקדת בכלים כמו 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 Jetpack PDF library uses these APIs to simplify adding PDF viewing capabilities to your app.

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.

שיפורים בהחלפת שפה אוטומטית

Android 14 在音频中添加了设备端多语言识别功能,并支持在语言之间自动切换,但这可能会导致丢失字词,尤其是当两次语音之间语言切换的间隔时间较短时。Android 15 添加了其他控件,以帮助应用根据其用例调整此切换。EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS 会将自动切换限制在音频会话开始时,而 EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES 会在发生指定次数的切换后停用语言切换。如果您预计会话期间只会使用一种语言,并且该语言应被自动检测到,这些选项会特别有用。

Improved OpenType Variable Font API

ב-Android 15 שיפרנו את נוחות השימוש בגופן המשתנה OpenType. אפשר ליצור מופע FontFamily מגופן משתנה בלי לציין צירי משקל באמצעות ממשק ה-API של buildVariableFamily. הכלי לרינדור הטקסט מבטל את הערך של ציר wght כדי להתאים לטקסט המוצג.

השימוש ב-API מפשט באופן משמעותי את הקוד ליצירת 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 שנוצר באמצעות ה-API הישן והחדש מומר:

דוגמה להבדלים ברינדור גופנים בגרסה החדשה והישן
ממשקי API

בדוגמה הזו, ה-Typeface שנוצר באמצעות ה-API הישן לא כולל את יכולת ליצור משקלים מדויקים של גופנים עבור 350, 450, 550 ו-650 מופעים של Font, כך שהכלי לרינדור חוזר למשקל הקרוב ביותר. לכן במקרה הזה, 300 יומר במקום 350, 400 יומר במקום 450 וכן הלאה. לעומת זאת, ה-Typeface שנוצר באמצעות ממשקי ה-API החדשים יוצר באופן דינמי. את המכונה Font למשקל נתון, כך שהתוצאה המדויקת של משקולות היא 350, 450, 550 ו-650.

אמצעי בקרה מפורטים למעברי שורה

从 Android 15 开始,TextView 和底层行断开符可以将给定部分文本保留在同一行中,以提高可读性。您可以通过在字符串资源或 createNoBreakSpan 中使用 <nobreak> 标记来充分利用此换行符自定义功能。同样,您可以使用 <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> 标记换行。
使用 <nobreak> 标记封装“Pixel 8 Pro.”短语的同一行文本的布局。

העברת אפליקציות לארכיון

Android and Google Play announced support for app archiving last year, allowing users to free up space by partially removing infrequently used apps from the device that were published using Android App Bundle on Google Play. Android 15 includes OS level support for app archiving and unarchiving, making it easier for all app stores to implement it.

Apps with the REQUEST_DELETE_PACKAGES permission can call the PackageInstaller requestArchive method to request archiving an installed app package, which removes the APK and any cached files, but persists user data. Archived apps are returned as displayable apps through the LauncherApps APIs; users will see a UI treatment to highlight that those apps are archived. If a user taps on an archived app, the responsible installer will get a request to unarchive it, and the restoration process can be monitored by the ACTION_PACKAGE_ADDED broadcast.

הפעלת מצב 16 KB במכשיר באמצעות אפשרויות למפתחים

כדי להפעיל מכשיר במצב 16KB, מחליפים את המצב של אפשרות המפתח הפעלה בגודל דף של 16KB.

החל מ-Android 15 QPR1, אפשר להשתמש באפשרות למפתחים שזמינה במכשירים מסוימים כדי להפעיל את המכשיר במצב 16KB ולבצע בדיקות במכשיר. לפני שמשתמשים באפשרות למפתחים, עוברים אל הגדרות > מערכת > עדכוני תוכנה ומחילים את כל העדכונים שזמינים.

אפשרות המפתחים הזו זמינה במכשירים הבאים:

  • ‫Pixel 8 ו-Pixel 8 Pro (עם Android 15 QPR1 ומעלה)

  • ‫Pixel 8a (עם Android 15 QPR1 ואילך)

  • ‫Pixel 9,‏ Pixel 9 Pro ו-Pixel 9 Pro XL (עם Android 15 QPR2 Beta 2 ומעלה)

גרפיקה

‫Android 15 כולל את השיפורים הגרפיים האחרונים, כולל ANGLE ותוספות למערכת הגרפית Canvas.

מודרניזציה של הגישה ל-GPU ב-Android

הלוגו של Vulkan

חומרת Android התפתחה משמעותית מאז הימים הראשונים שבהם הליבה של מערכת ההפעלה רצה על מעבד יחיד, והגישה ל-GPU התבצעה באמצעות ממשקי API שמבוססים על צינורות עיבוד נתונים עם פונקציות קבועות. Vulkan® graphics API זמין ב-NDK מאז Android 7.0 (רמת API 24) עם הפשטה ברמה נמוכה יותר שמשקפת טוב יותר את החומרה המודרנית של המעבד הגרפי, מתאימה טוב יותר לתמיכה בכמה ליבות של מעבדים ומציעה עלות ריבית נמוכה יותר של מנהל ה-CPU – וכך משפרת את ביצועי האפליקציה. כל מנועי המשחקים המודרניים תומכים ב-Vulkan.

Vulkan הוא הממשק המועדף של Android ל-GPU. לכן, Android 15 כולל את ANGLE כשכבה אופציונלית להרצת OpenGL® ES מעל Vulkan. המעבר ל-ANGLE יעזור לסטנדרטיזציה של הטמעת OpenGL ב-Android, כדי לשפר את התאימות ובמקרים מסוימים גם את הביצועים. כדי לבדוק את היציבות והביצועים של אפליקציות OpenGL ES באמצעות ANGLE, מפעילים את האפשרות למפתחים ב-Android 15: הגדרות -> מערכת -> אפשרויות למפתחים -> ניסיוני: הפעלת ANGLE.

מפת הדרכים של Android ANGLE ב-Vulkan

מפת דרכים של שינויים שיחולו בקרוב בממשקי ה-API של GPU ב-Android.

כחלק מהיעילות של סטאק ה-GPU שלנו, מעכשיו נתחיל לשלוח את ANGLE בתור מנהל המערכת GL במכשירים חדשים נוספים, ומצפים שבעתיד OpenGL/ES תהיה זמינה רק דרך ANGLE. עם זאת, אנחנו מתכננים להמשיך את התמיכה ב-OpenGL ES בכל המכשירים.

השלבים המומלצים הבאים

אפשר להשתמש באפשרויות למפתחים כדי לבחור את הנהג ANGLE ל-OpenGL ES ולבדוק את האפליקציה. בפרויקטים חדשים, מומלץ מאוד להשתמש ב-Vulkan ל-C/C++.

שיפורים ב-Canvas

ב-Android 15 אנחנו ממשיכים בתהליך המודרניזציה של מערכת הגרפיקה של Android ב-Canvas, עם יכולות נוספות:

  • Matrix44 מספק מטריקס 4x4 לטרנספורמציה של קואורדינטות, שצריך להשתמש בו כשרוצים לבצע פעולות על הלוח ב-3D.
  • הפונקציה clipShader יוצרת חפיפה בין הקליפ הנוכחי לבין ה-shader שצוין, ואילו הפונקציה clipOutShader מגדירה את הקליפ כהפרש בין הקליפ הנוכחי לבין ה-shader, כאשר כל אחת מהן מתייחסת ל-shader כלמסיכת אלפא. כך אפשר לצייר בצורה יעילה צורות מורכבות.

ביצועים וסוללה

אנחנו ממשיכים להתמקד בשיפור הביצועים והאיכות של האפליקציות שלכם ב-Android. ב-Android 15 מוצגים ממשקי API שעוזרים לבצע משימות באפליקציה בצורה יעילה יותר, לבצע אופטימיזציה של ביצועי האפליקציה ולאסוף תובנות לגבי האפליקציות.

כדי לקבל מידע על שיטות מומלצות לשימוש יעיל בסוללה, על ניפוי באגים בשימוש ברשת ובצריכת החשמל ועל שיפור היעילות של הסוללה בעבודה ברקע ב-Android 15 ובגרסאות האחרונות של Android, אפשר לצפות בהרצאה Improving battery efficiency of background work on Android מ-Google I/O.

ApplicationStartInfo API

在以前的 Android 版本中,应用启动一直是个谜。在应用中确定应用是从冷启动、温启动还是热启动状态启动很困难。您还很难了解应用在各种启动阶段(分叉进程、调用 onCreate、绘制第一个帧等)所花的时间。在 Application 类被实例化时,您无法知道应用是通过广播、content provider、作业、备份、启动完成、闹钟还是 Activity 启动的。

Android 15 上的 ApplicationStartInfo API 提供了所有这些功能,以及更多功能。您甚至可以选择在流程中添加自己的时间戳,以便在一个位置收集时间数据。除了收集指标之外,您还可以使用 ApplicationStartInfo 直接优化应用启动;例如,您可以消除在应用因广播而启动时在 Application 类中实例化与界面相关的库所带来的高昂开销。

מידע מפורט על גודל האפליקציה

החל מגרסה 8.0 של Android (רמת API‏ 26), מערכת Android כוללת את ה-API StorageStats.getAppBytes שמסכם את הגודל ההתקנה של אפליקציה כמספר יחיד של בייטים, שהוא סכום של גודל ה-APK, גודל הקבצים שחולצו מה-APK וקבצים שנוצרו במכשיר, כמו קוד שעבר הידור מראש (AOT). המספר הזה לא מספק הרבה תובנות לגבי האופן שבו האפליקציה משתמשת באחסון.

ב-Android 15 נוספה ה-API StorageStats.getAppBytesByDataType([type]), שמאפשרת לקבל תובנות לגבי האופן שבו האפליקציה משתמשת בכל האחסון הזה, כולל חלוקות של קובצי APK, קוד שקשור ל-AOT ולשיפור המהירות, מטא-נתונים של dex, ספריות ופרופילים מודרכים.

יצירת פרופילים שמנוהלת על ידי האפליקציה

מערכת Android 15 כוללת את הכיתה ProfilingManager, שמאפשרת לאסוף מידע על פרופיל האפליקציה, כמו דיווחים על אשכול, פרופילים של אשכול, דגימות מ-stack ועוד. הוא מספק קריאה חוזרת לאפליקציה עם תג שסופק כדי לזהות את קובץ הפלט, שמועבר לספריית הקבצים של האפליקציה. ממשק ה-API מגביל את קצב הבקשות כדי למזער את ההשפעה על הביצועים.

כדי לפשט את תהליך היצירה של בקשות ליצירת פרופילים באפליקציה, מומלץ להשתמש ב-Profiling AndroidX API המתאים, שזמין ב-Core 1.15.0-rc01 ואילך.

שיפורים במסד נתונים של SQLite

ב-Android 15 נוספו ממשקי API של SQLite שמציגים תכונות מתקדמות מהמנוע הבסיסי של SQLite, שמטרגטות בעיות ספציפיות בביצועים שעשויות להתרחש באפליקציות. ממשקי ה-API האלה כלולים בעדכון של SQLite לגרסה 3.44.3.

מומלץ למפתחים לעיין בשיטות מומלצות לביצועי SQLite להפיק את המרב ממסד הנתונים של SQLite, במיוחד כשעובדים עם מסדי נתונים או כשמריצים שאילתות רגישות לזמן אחזור.

  • עסקאות מושהות לקריאה בלבד: כשאתם מנפיקים עסקאות לקריאה בלבד (לא כוללות הצהרות כתיבה), השתמשו ב-beginTransactionReadOnly() וב-beginTransactionWithListenerReadOnly(SQLiteTransactionListener) כדי להנפיק עסקאות DEFERRED לקריאה בלבד. עסקאות כאלה יכולות לפעול בו-זמנית זו עם זו, ואם מסד הנתונים נמצא במצב WAL, הן יכולות לפעול בו-זמנית עם עסקאות IMMEDIATE או EXCLUSIVE.
  • מספרים ומזהים של שורות: נוספו ממשקי API לאחזור מספר השורות שהשתנו או מזהה השורה האחרונה שהוכנסה, בלי להפעיל שאילתה נוספת. הפונקציה getLastChangedRowCount() מחזירה את מספר השורות שנוספו, עודכנו או נמחקו באמצעות הצהרת ה-SQL האחרונה בעסקה הנוכחית, בזמן ש-getTotalChangedRowCount() מחזירה את הספירה בחיבור הנוכחי. הפונקציה getLastInsertRowId() מחזירה את הערך rowid של השורה האחרונה. יוכנס לחיבור הנוכחי.
  • הצהרות גולמיות: הוצאת הצהרת SQlite גולמית, תוך עקיפת מעטפות נוחות וכל עלות עיבוד נוספת שעשויה להיגרם כתוצאה מהן.

עדכונים ב-Android Dynamic Performance Framework

Android 15 继续投资于 Android 动态性能框架 (ADPF),这是一组 API,可让游戏和性能密集型应用更为直接地与 Android 设备的电源和散热系统进行互动。在受支持的设备上,Android 15 添加了 ADPF 功能:

  • 针对提示会话的节能模式,用于指明其关联的线程应优先节能而非性能,非常适合长时间运行的后台工作负载。
  • 系统可以在提示会话中报告 GPU 和 CPU 工作时长,以便同时调整 CPU 和 GPU 频率,以最佳方式满足工作负载需求。
  • 热余量阈值,用于根据余量预测来解读可能的热节流状态。

如需详细了解如何在应用和游戏中使用 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 通过 UriRelativeFilterGroup 支持更精确的 Intent 解析,UriRelativeFilterGroup 包含一组 UriRelativeFilter 对象,这些对象构成一组必须满足的 Intent 匹配规则,包括网址查询参数、网址片段以及屏蔽或排除规则。

您可以在 AndroidManifest XML 文件中使用 <uri-relative-filter-group> 标记来定义这些规则,该标记可以包含 android:allow 标记。这些代码可以包含使用现有数据代码属性以及 android:queryandroid:fragment 属性的 <data> 代码。

下面是一个 AndroidManifest 语法示例:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:host="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:

שאילתה לגבי הבחירה האחרונה של המשתמשים בנושא גישה לתמונות שנבחרו

אפליקציות יכולות להדגיש עכשיו רק את התמונות והסרטונים שנבחרו לאחרונה ניתנה גישה חלקית להרשאות המדיה. התכונה הזו יכולה לשפר את חוויית המשתמש של אפליקציות שמבקשות לעיתים קרובות גישה לתמונות סרטונים. כדי להשתמש בתכונה הזו באפליקציה, מפעילים את הארגומנט 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 Ad Services, שמשלבים את הגרסה העדכנית ביותר של ארגז החול לפרטיות ב-Android. ההוספה הזו היא חלק מהמאמצים שלנו לפתח טכנולוגיות שישפרו את פרטיות המשתמשים ויאפשרו חוויית פרסום יעילה ומותאמת אישית באפליקציות לנייד. בדף של ארגז החול לפרטיות מפורט מידע נוסף על ארגז החול לפרטיות בתוכניות הבטא ובגרסת ה-Preview למפתחים של Android, שיעזרו לכם להתחיל.

Health Connect

Android 15 integrates the latest extensions around Health Connect by Android, a secure and centralized platform to manage and share app-collected health and fitness data. This update adds support for additional data types across fitness, nutrition, skin temperature, training plans, and more.

Skin temperature tracking allows users to store and share more accurate temperature data from a wearable or other tracking device.

Training plans are structured workout plans to help a user achieve their fitness goals. Training plans support includes a variety of completion and performance goals:

Learn more about the latest updates to Health Connect in Android in the Building adaptable experiences with Android Health talk from Google I/O.

שיתוף מסך של אפליקציה

Android 15 תומך בשיתוף מסך של אפליקציה, כך שמשתמשים יכולים לשתף או להקליט רק חלון של אפליקציה במקום את כל מסך המכשיר. התכונה הזו, שהופעל לראשונה ב-Android 14 QPR2, כוללת קריאות חזרה מסוג MediaProjection שמאפשרות לאפליקציה להתאים אישית את חוויית שיתוף המסך שלה. חשוב לזכור שבאפליקציות שמטרגטות ל-Android 14 (רמת API ‏34) ואילך, נדרשת הסכמה מהמשתמשים לכל סשן צילום של MediaProjection.

חוויית משתמש וממשק משתמש של המערכת

ב-Android 15, מפתחי אפליקציות והמשתמשים מקבלים יותר שליטה וגמישות בהגדרת המכשיר כך שיתאים לצרכים שלהם.

כדי ללמוד איך להשתמש בשיפורים האחרונים ב-Android 15 כדי לשפר את חוויית המשתמש באפליקציה, אפשר לצפות בהרצאה שיפור חוויית המשתמש באפליקציית Android מ-Google I/O.

תצוגות מקדימות עשירות יותר של ווידג'טים באמצעות Generated Previews API

在 Android 15 之前,提供微件选择器预览的唯一方法是指定静态图片或布局资源。这些预览通常与放置在主屏幕上的实际 widget 的外观大不相同。此外,由于无法使用 Jetpack Glance 创建静态资源,因此“资讯一览” 开发者必须为其微件截屏或创建 XML 布局, 微件预览。

Android 15 添加了对生成的预览的支持。这意味着,应用微件提供程序可以生成 RemoteViews 以用作选择器预览,而不是静态资源。

应用可以向微件选择器提供远程视图, 更新选择器中的内容,使其更能代表用户的内容 看到的内容。

推送 API

应用可以通过推送 API 提供生成的预览。应用可以提供 预览,并且不会收到明确的请求, 以提供预览。预览会保留在 AppWidgetService 中,并且主持人可以按需请求预览。以下示例加载了一个 XML 微件 并将其设置为预览:

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

预期的流程如下:

  1. 任何时候,widget 提供程序都会调用 setWidgetPreview。提供的预览会与其他提供方信息一起保留在 AppWidgetService 中。
  2. setWidgetPreview 会通过 AppWidgetHost.onProvidersChanged 回调。作为回应,微件宿主会重新加载其所有提供方信息。
  3. 显示微件预览时,主机会检查 AppWidgetProviderInfo.generatedPreviewCategories,如果所选类别可用,则调用 AppWidgetManager.getWidgetPreview 以返回此提供程序的已保存预览。

何时调用 setWidgetPreview

由于没有用于提供预览的回调,因此应用可以选择在运行期间的任何时间发送预览。预览的更新频率取决于微件的用例。

以下列表介绍了两大类预览用例:

  • 在 widget 预览中显示真实数据(例如个性化数据)的提供程序 或最新信息。这些提供商可以设置预览 已登录 Google 账号或已在其应用中完成初始配置。之后 可以设置一项定期任务,按照所选的节奏更新预览。 此类 widget 的示例包括照片、日历、天气或新闻 widget。
  • 在预览中显示静态信息或不显示任何数据的快捷操作 widget 的提供程序。这些提供程序可以在应用首次启动时设置预览一次。例如,快速开车便是此类微件的示例 操作 widget 或 Chrome 快捷方式 widget。

某些提供商可能会在基座接入模式选择器上显示静态预览,但真实的 信息。这些提供商应遵循指南 设置预览

תמונה בתוך תמונה

Android 15 引入了画中画 (PiP) 方面的变更,确保实现 更流畅的过渡效果。对于在主界面上叠加界面元素的应用,这将非常有用,因为这些界面元素会进入 PiP。

开发者使用 onPictureInPictureModeChanged 回调来定义逻辑 用于切换叠加界面元素的可见性。此回调是 在画中画进入或退出动画播放完毕时触发。距离开始还有 Android 15 中,PictureInPictureUiState 类包含另一种状态。

在此界面状态下,以 Android 15(API 级别 35)为目标平台的应用将遵守 使用以下参数调用 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 supports setting rich vibrations for incoming notifications by channel using NotificationChannel.setVibrationEffect, so your users can distinguish between different types of notifications without having to look at their device.

צ'יפ בשורת הסטטוס של הקרנת מדיה ועצירה אוטומטית

הקרנת מדיה עלולה לחשוף מידע פרטי של משתמשים. צ'יפ חדש ובולט בסרגל הסטטוס מאפשר למשתמשים לדעת אם המסך שלהם מוקרן. המשתמשים יכולים להקיש על הצ'יפ כדי להפסיק את ההעברה (cast), השיתוף או ההקלטה של המסך. בנוסף, כדי לשפר את חוויית המשתמש, הקרנת המסך תיפסק באופן אוטומטי כשמסך המכשיר יינעל.

用于屏幕共享、投屏和录制的状态栏条状标签。

מסכים גדולים וגורמי צורה

‫Android 15 מספק לאפליקציות שלכם תמיכה כדי להפיק את המרב מגורמי הצורה של Android, כולל מסכים גדולים, מכשירים מתהפכים ומתקפלים.

שיפור בריבוי משימות במסך גדול

Android 15 为用户提供了在大屏设备上更好地进行多任务处理的方式。对于 例如,用户可以保存自己喜爱的分屏应用组合, 访问并固定屏幕上的任务栏,以便在应用之间快速切换。这意味着 让应用具备自适应能力比以往任何时候都更加重要。

Google I/O 大会上有一些关于构建自适应 Android 的会议 应用使用 Material 3 构建界面 自适应库 我们的文档中提供了更多帮助信息,帮助您针对大型语言 。

תמיכה במסך החיצוני

您的应用可以声明一个属性,Android 15 会使用该属性来允许您的 ApplicationActivity 显示在受支持的可翻转设备的小封面屏幕上。这些屏幕太小,无法被视为适合运行 Android 应用的兼容目标平台,但您的应用可以选择支持它们,从而让您的应用在更多平台上可用。

קישוריות

ב-Android 15, הפלטפורמה מתעדכנת כדי לתת לאפליקציה שלכם גישה לחידושים האחרונים בטכנולוגיות תקשורת וטכנולוגיות אלחוטיות.

תמיכה בלוויין

ב-Android 15 אנחנו ממשיכים להרחיב את תמיכת הפלטפורמה בקישוריות לווינית, ומוסיפים כמה רכיבי ממשק משתמש כדי להבטיח חוויית משתמש עקבית בכל סביבות הקישוריות הלווינית.

אפליקציות יכולות להשתמש ב-ServiceState.isUsingNonTerrestrialNetwork() כדי לזהות מכשירים שמחוברים ללוויין, וכך להגביר את המוּדעוּת מדוע שירותי רשת מלאים אינם זמינים. בנוסף, ב-Android 15 יש תמיכה באפליקציות SMS ו-MMS, וגם באפליקציות RCS שהוגדרו מראש, כדי להשתמש בחיבור לווין לשליחה ולקבלה של הודעות.

התראה מופיעה כשהמכשיר מתחבר ללוויין.

חוויות NFC חלקות יותר

Android 15 正在努力打造更顺畅、更可靠的感应式付款体验,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter 进入观察模式,在该模式下,设备会监听但不会响应 NFC 读卡器,并将应用的 NFC 服务 PollingFrame 对象发送以进行处理。PollingFrame 对象可用于在与 NFC 读卡器进行首次通信之前进行身份验证,在许多情况下,这支持一触式交易。

此外,应用可以在受支持的设备上注册过滤器,以便在有轮询循环活动时收到通知,从而能够与多个感知 NFC 的应用顺畅运行。

תפקיד בארנק

ב-Android 15 נוסף תפקיד Wallet שמאפשר שילוב הדוק יותר עם אפליקציית הארנק המועדפת של המשתמש. התפקיד הזה מחליף את הגדרת ברירת המחדל של תשלומים ללא מגע ב-NFC. משתמשים יכולים לנהל את הבעלים של התפקיד Wallet דרך הגדרות > אפליקציות > אפליקציות ברירת מחדל.

התפקיד Wallet משמש לניתוב של נגיעה ב-NFC עבור מזהי AID שרשומים בקטגוריית התשלומים. הקשות תמיד מועברות לבעלים של התפקיד ב-Wallet, אלא אם אפליקציה אחרת שרשומה לאותו מזהה AID פועלת בחזית.

התפקיד הזה משמש גם לקביעת המיקום שבו יופיע הכרטיס לגישה מהירה ל-Wallet כשהוא יופעל. כשהתפקיד מוגדר כ'ללא', המשבצת של הגישה המהירה לא זמינה והקשות על תגי NFC בקטגוריית התשלומים מועברות רק לאפליקציה שבחזית.

אבטחה

‫Android 15 עוזר לכם לשפר את האבטחה של האפליקציה, להגן על הנתונים של האפליקציה ולספק למשתמשים שקיפות ושליטה רבה יותר על הנתונים שלהם. בשיחה Safeguarding user security on Android (שמירה על אבטחת המשתמשים ב-Android) מ-Google I/O מוסבר מה אנחנו עושים כדי לשפר את אמצעי ההגנה על המשתמשים ולהגן על האפליקציה שלכם מפני איומים חדשים.

שילוב של מנהל פרטי הכניסה עם מילוי אוטומטי

החל מגרסה 15 של Android, מפתחים יכולים לקשר תצוגות ספציפיות, כמו שדות של שם משתמש או סיסמה, לבקשות של מנהל פרטי הכניסה. כך קל יותר לספק חוויית משתמש מותאמת אישית במהלך תהליך הכניסה. כשהמשתמש מתמקד באחת מהתצוגות האלה, נשלחת בקשה תואמת ל-Credential Manager. פרטי הכניסה שמתקבלים נצברים אצל כל הספקים ומוצגים בממשקי המשתמש החלופיים של המילוי האוטומטי, כמו הצעות בשורה או הצעות בתפריט הנפתח. ספריית Jetpack androidx.credentials היא נקודת הקצה המועדפת למפתחים, ותהיה זמינה בקרוב כדי לשפר את התכונה הזו ב-Android מגרסה 15 ואילך.

שילוב של הרשמה וכניסה בלחיצה אחת עם הנחיות ביומטריות

מנהל פרטי הכניסה משלב הנחיות ביומטריות בתהליכי היצירה והכניסה של פרטי הכניסה, כך שהספקים לא צריכים לנהל את ההנחיות הביומטריות. כתוצאה מכך, ספקי פרטי הכניסה צריכים להתמקד רק בתוצאות של תהליכי היצירה והאחזור, עם תוספת של תוצאת התהליך הביומטרי. התהליך הפשוט הזה יוצר פרטי כניסה יעילים וקלים יותר תהליך היצירה והאחזור.

ניהול מפתחות להצפנה מקצה לקצה

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 נוספה קבוצה של ממשקי API שמבצעים בדיקות הרשאות על מזהי URI של תוכן:

נגישות

ב-Android 15 נוספו תכונות שמשפרות את הנגישות למשתמשים.

שיפורים בברייל

ב-Android 15, הוספנו ל-TalkBack תמיכה בצגי ברייל שמשתמשים בתקן HID גם דרך USB וגם דרך Bluetooth מאובטח.

התקן הזה, בדומה לזה שמשמש עכברים ומקלדות, יעזור ל-Android לתמוך במגוון רחב יותר של צגי בריל לאורך זמן.

אינטרנציונליזציה

ב-Android 15 נוספו תכונות ויכולות שמשלימות את חוויית המשתמש כשמשתמשים במכשיר בשפות שונות.

גופן משתנה של CJK

החל מגרסה 15 של Android, קובץ הגופן של השפות הסינית, היפנית והקוריאנית (CJK), NotoSansCJK, הוא עכשיו גופן משתנה. גופנים משתנים פותחים אפשרויות לטיפוגרפיה קריאייטיב בשפות CJK. מעצבים יכולים לבחור מתוך מגוון רחב יותר של סגנונות וליצור פריסות חזותיות מרהיבות שקשה או בלתי אפשרי ליצור אותן בדרכים אחרות.

איך הגופן המשתנה בשפות סינית, יפנית וקוריאנית (CJK) מופיע ברוחב גופן שונה.

הצדקה בין תווים

החל מ-Android 15, אפשר להצדיק את הטקסט עם ריווח של אותיות באמצעות JUSTIFICATION_MODE_INTER_CHARACTER. ההצדקה בין המילים הייתה הושקה לראשונה ב-Android 8.0 (רמת API 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 (רמת API 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.

גופן נוסף של הינטאיגנה יפנית

在 Android 15 中,旧版日语平假名(也称为 Hentaigana)字体文件 捆绑在一起半形人物的独特形状可以增加 风格或设计独特的风格 传播和理解古代日本文件的能力。

日文半角字符和文本样式 字体。

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. כל אחד יכול להשתמש בלוגו הזה או בגרסה שונה שלו כדי להפנות לפרויקט VideoLAN או לכל מוצר שפותח על ידי צוות VideoLAN, אבל השימוש בלוגו לא מעיד על תמיכה בפרויקט.

Vulkan והלוגו של Vulkan הם סימנים מסחריים רשומים של Khronos Group Inc.

OpenGL הוא סימן מסחרי רשום והלוגו של OpenGL ES הוא סימן מסחרי של Hewlett Packard Enterprise, ש-Khronos משתמשת בו ברשות.