ภาพรวมฟีเจอร์และ API

Android 15 ขอแนะนำฟีเจอร์และ API ที่ยอดเยี่ยมสำหรับนักพัฒนาแอป ส่วนต่อไปนี้จะสรุปฟีเจอร์เหล่านี้เพื่อช่วยให้คุณเริ่มต้นใช้งาน API ที่เกี่ยวข้องได้

หากต้องการดูรายการ API ที่เพิ่ม แก้ไข และถูกนำออกโดยละเอียด โปรดอ่านรายงาน API ดิฟ หากต้องการดูรายละเอียดเกี่ยวกับ API ที่เพิ่ม โปรดไปที่เอกสารอ้างอิง API ของ Android สำหรับ 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 และส่วนขยายกล้องโหมดกลางคืน การเพิ่มแสงในสภาวะแสงน้อยจะปรับการเปิดรับแสงของสตรีมตัวอย่างในสภาวะที่มีแสงน้อย ซึ่งแตกต่างจากวิธีที่ส่วนขยายกล้องโหมดกลางคืนสร้างภาพนิ่ง เนื่องจากโหมดกลางคืนจะรวมภาพถ่ายหลายรูปเข้าด้วยกันเพื่อสร้างรูปภาพเดียวที่ปรับปรุงแล้ว แม้ว่าโหมดกลางคืนจะทำงานได้ดีกับการสร้างภาพนิ่ง แต่ก็ไม่สามารถสร้างเฟรมอย่างต่อเนื่อง แต่โหมดเพิ่มคุณภาพในที่แสงน้อยทำได้ การเพิ่มคุณภาพในที่แสงน้อยจึงเปิดใช้ความสามารถของกล้อง เช่น

  • แสดงตัวอย่างรูปภาพที่ปรับปรุงแล้วเพื่อให้ผู้ใช้จัดเฟรมรูปภาพที่มีแสงน้อยได้ดียิ่งขึ้น
  • การสแกนคิวอาร์โค้ดในที่แสงน้อย

หากเปิดใช้การเพิ่มแสงในสภาวะแสงน้อย ฟีเจอร์นี้จะเปิดโดยอัตโนมัติเมื่อมีระดับแสงต่ำ และปิดเมื่อมีแสงมากขึ้น

แอปสามารถบันทึกจากสตรีมตัวอย่างในสภาพแสงน้อยเพื่อบันทึกวิดีโอที่สว่างขึ้น

ดูข้อมูลเพิ่มเติมได้ที่การเพิ่มคุณภาพในโหมดแสงน้อย

ตัวควบคุมกล้องในแอป

Android 15 เพิ่มส่วนขยายเพื่อให้ควบคุมฮาร์ดแวร์กล้องและอัลกอริทึมของกล้องได้มากขึ้นในอุปกรณ์ที่รองรับ ดังนี้

  • การปรับความแรงของแฟลชขั้นสูงที่ช่วยควบคุมความเข้มของแฟลชได้อย่างแม่นยำทั้งในโหมด SINGLE และ TORCH ขณะถ่ายภาพ

การควบคุมพื้นที่ว่างของ HDR

Android 15 จะเลือก Headroom ของ HDR ที่เหมาะสมกับความสามารถของอุปกรณ์และความละเอียดของบิตของแผง สำหรับหน้าเว็บที่มีเนื้อหา SDR จำนวนมาก เช่น แอปรับส่งข้อความที่แสดงภาพขนาดย่อ HDR รายการเดียว ลักษณะการทำงานนี้อาจส่งผลเสียต่อความสว่างที่รับรู้ของเนื้อหา SDR Android 15 ให้คุณควบคุม Headroom ของ HDR ด้วย setDesiredHdrHeadroom เพื่อรักษาสมดุลระหว่างเนื้อหา SDR กับ HDR

ความสว่างขององค์ประกอบ UI SDR ในหน้าจอด้านซ้ายดูเหมือนจะสม่ำเสมอกว่าความสว่างในหน้าจอด้านขวา ซึ่งจำลองปัญหาเกี่ยวกับ Headroom ที่อาจเกิดขึ้นเมื่อเนื้อหา HDR และ SDR ผสมกัน การปรับ Headroom ของ HDR จะช่วยให้คุณสร้างสมดุลที่ดียิ่งขึ้นระหว่างเนื้อหา SDR กับ HDR

การควบคุมความดัง

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 added support for connecting to MIDI 2.0 devices using USB, which communicate using Universal MIDI Packets (UMP). Android 15 extends UMP support to virtual MIDI apps, enabling composition apps to control synthesizer apps as a virtual MIDI 2.0 device just like they would with an USB MIDI 2.0 device.

การถอดรหัสซอฟต์แวร์ AV1 ที่มีประสิทธิภาพมากขึ้น

โลโก้ dav1d

dav1d ซึ่งเป็นโปรแกรมถอดรหัส AV1 ยอดนิยมจาก VideoLAN พร้อมให้ใช้งานในอุปกรณ์ Android ที่ไม่รองรับการถอดรหัส AV1 ในฮาร์ดแวร์แล้ว โดยมีประสิทธิภาพมากกว่าโปรแกรมถอดรหัสซอฟต์แวร์ AV1 รุ่นเดิมถึง 3 เท่า ซึ่งช่วยให้ผู้ใช้จำนวนมากขึ้นสามารถเล่น AV1 แบบ HD ได้ รวมถึงอุปกรณ์ระดับกลางและระดับล่างบางรุ่น

แอปของคุณต้องเลือกใช้ dav1d โดยเรียกใช้ตามชื่อ "c2.android.av1-dav1d.decoder" เราจะกำหนดให้ dav1d เป็นโปรแกรมถอดรหัสซอฟต์แวร์ AV1 เริ่มต้นในการอัปเดตครั้งถัดไป การรองรับนี้ได้รับการกำหนดมาตรฐานและพอร์ตไปยังเวอร์ชันเก่าสำหรับอุปกรณ์ Android 11 ที่ได้รับการอัปเดตระบบ Google Play

ประสิทธิภาพการทำงานและเครื่องมือสำหรับนักพัฒนาแอป

แม้ว่างานส่วนใหญ่ของเราในการปรับปรุงประสิทธิภาพการทำงานของคุณจะมุ่งเน้นไปที่เครื่องมือต่างๆ เช่น Android Studio, Jetpack Compose และไลบรารี Android Jetpack แต่เราก็มองหาวิธีต่างๆ ในแพลตฟอร์มที่จะช่วยให้คุณ ตระหนักถึงวิสัยทัศน์ของคุณได้ง่ายขึ้นเสมอ

การอัปเดต OpenJDK 17

Android 15 ยังคงดำเนินการรีเฟรชไลบรารีหลักของ Android เพื่อปรับให้สอดคล้องกับฟีเจอร์ใน OpenJDK LTS เวอร์ชันล่าสุด

ฟีเจอร์หลักและการปรับปรุงที่สำคัญมีดังนี้

API เหล่านี้ได้รับการอัปเดตในอุปกรณ์กว่า 1 พันล้านเครื่องที่ใช้ Android 12 (API ระดับ 31) ขึ้นไปผ่านการอัปเดตระบบ Google Play เพื่อให้คุณกำหนดเป้าหมายฟีเจอร์การเขียนโปรแกรมล่าสุดได้

การปรับปรุง PDF

Android 15 มีการปรับปรุงที่สำคัญสำหรับ PdfRenderer API แอปสามารถรวมฟีเจอร์ขั้นสูง เช่น การแสดงผลไฟล์ที่มีการป้องกันด้วยรหัสผ่าน คําอธิบายประกอบ การแก้ไขแบบฟอร์ม การค้นหา และการเลือกพร้อมการคัดลอก PDF เชิงเส้น รองรับการเพิ่มประสิทธิภาพเพื่อให้ดู PDF ในเครื่องได้เร็วขึ้นและลดการใช้ทรัพยากร ไลบรารี PDF ของ Jetpack ใช้ API เหล่านี้เพื่อให้การเพิ่ม PDF เป็นเรื่องง่าย ความสามารถในการดูแอปของคุณ

การอัปเดตล่าสุดเกี่ยวกับการแสดงผล PDF มีฟีเจอร์ต่างๆ เช่น การค้นหาไฟล์ PDF ที่ฝัง

ย้าย PdfRenderer ไปยังโมดูลที่อัปเดตได้โดยใช้ Google แล้ว การอัปเดตระบบ Play โดยไม่ขึ้นอยู่กับการเปิดตัวแพลตฟอร์ม และเราให้การสนับสนุน การเปลี่ยนแปลงเหล่านี้กลับไปใช้ Android 11 (API ระดับ 30) โดยการสร้าง แพลตฟอร์ม API ก่อน Android 15 ที่เรียกว่า PdfRendererPreV

การปรับแต่งการสลับภาษาอัตโนมัติ

Android 14 เพิ่มการจดจำเสียงหลายภาษาในอุปกรณ์ด้วยการสลับระหว่างภาษาโดยอัตโนมัติ แต่วิธีนี้อาจทำให้คำพูดถูกละทิ้ง โดยเฉพาะเมื่อสลับภาษาโดยเว้นช่วงระหว่างคำพูดน้อยลง Android 15 เพิ่มการควบคุมเพิ่มเติมเพื่อช่วยแอปปรับการเปลี่ยนนี้ให้เหมาะกับกรณีการใช้งาน EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS จำกัดการเปลี่ยนภาษาอัตโนมัติไว้ที่ช่วงต้นของเซสชันเสียง ส่วน EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES จะปิดใช้งานการเปลี่ยนภาษาหลังจากเปลี่ยนจำนวนครั้งที่กำหนด ตัวเลือกเหล่านี้มีประโยชน์อย่างยิ่งในกรณีที่คุณคาดว่าจะมีการใช้ภาษาเดียวในเซสชันที่ควรตรวจจับโดยอัตโนมัติ

API แบบอักษรที่ปรับแต่งได้ OpenType ที่ปรับปรุงใหม่

Android 15 ปรับปรุงความสามารถในการใช้งานแบบอักษร OpenType แบบแปรผัน คุณสามารถสร้างอินสแตนซ์ FontFamily จากแบบอักษรแบบผันแปรได้โดยไม่ต้องระบุแกนน้ำหนักด้วย buildVariableFamily API ตัวแสดงผลข้อความจะลบล้างค่า ของแกน 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 ด้วย

การควบคุมการขึ้นบรรทัดใหม่แบบละเอียด

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 App Bundle ใน Google Play Android 15 มีการรองรับการเก็บถาวรแอปในระดับระบบปฏิบัติการ และยกเลิกการเก็บ ซึ่งจะทำให้ App Store ทั้งหมดติดตั้งใช้งานได้ง่ายขึ้น

แอปที่มีสิทธิ์ REQUEST_DELETE_PACKAGES สามารถเรียกใช้เมธอด requestArchive ของ PackageInstaller เพื่อขอเก็บถาวรแพ็กเกจแอปที่ติดตั้ง ซึ่งจะนำ APK และไฟล์แคชทั้งหมดออก แต่จะเก็บข้อมูลผู้ใช้ไว้ แอปที่เก็บถาวรจะแสดงผลเป็นแอปที่แสดงได้ผ่าน LauncherApps API ผู้ใช้จะเห็นตัวเลือก UI เพื่อไฮไลต์ เก็บแอปพลิเคชันแล้ว หากผู้ใช้แตะแอปที่เก็บไว้ ผู้ติดตั้งที่รับผิดชอบจะได้รับคําขอให้ยกเลิกการเก็บ และสามารถตรวจสอบกระบวนการกู้คืนได้โดยการออกอากาศ ACTION_PACKAGE_ADDED

เปิดใช้โหมด 16 KB ในอุปกรณ์โดยใช้ตัวเลือกสำหรับนักพัฒนาแอป

สลับตัวเลือกสำหรับนักพัฒนาแอปบูตโดยใช้หน้าหน่วยความจำขนาด 16 KB เพื่อบูตอุปกรณ์ในโหมด 16 KB

ใน Android 15 เวอร์ชัน QPR คุณสามารถใช้ตัวเลือกสำหรับนักพัฒนาแอปที่มีในอุปกรณ์บางรุ่นเพื่อบูตอุปกรณ์ในโหมด 16 KB และทำการทดสอบในอุปกรณ์ได้ ก่อนใช้ตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ ให้ไปที่การตั้งค่า > ระบบ > การอัปเดตซอฟต์แวร์ แล้วใช้การอัปเดตที่มี

ตัวเลือกสำหรับนักพัฒนาแอปนี้พร้อมใช้งานในอุปกรณ์ต่อไปนี้

  • Pixel 8 และ 8 Pro (ที่ใช้ Android 15 QPR1 ขึ้นไป)

  • Pixel 8a (ใช้ Android 15 QPR1 ขึ้นไป)

  • Pixel 9, 9 Pro และ 9 Pro XL (ใช้ Android 15 QPR2 ขึ้นไป)

  • Pixel 9a (ใช้ Android 16 ขึ้นไป)

กราฟิก

Android 15 มาพร้อมกับการปรับปรุงกราฟิกล่าสุด ซึ่งรวมถึง ANGLE และการเพิ่มระบบกราฟิก Canvas

การปรับปรุงการเข้าถึง GPU ของ Android ให้ทันสมัย

โลโก้ Vulkan

ฮาร์ดแวร์ Android พัฒนาไปมากจากยุคแรกๆ ที่ระบบปฏิบัติการหลักจะทำงานบน CPU เพียงตัวเดียวและเข้าถึง GPU โดยใช้ API ตามไปป์ไลน์ฟังก์ชันคงที่ Vulkan® graphics API พร้อมใช้งานใน NDK ตั้งแต่ Android 7.0 (API ระดับ 24) โดยใช้การแยกระดับที่ต่ำลงซึ่งแสดงถึงฮาร์ดแวร์ GPU สมัยใหม่ได้ดียิ่งขึ้น ปรับขนาดได้ดียิ่งขึ้นเพื่อรองรับแกน CPU หลายแกน และลดค่าใช้จ่ายเพิ่มเติมของไดรเวอร์ CPU ซึ่งส่งผลให้แอปมีประสิทธิภาพดีขึ้น เครื่องมือเกมสมัยใหม่ทั้งหมดรองรับ Vulkan

Vulkan เป็นอินเทอร์เฟซที่ Android แนะนำสำหรับ GPU ดังนั้น Android 15 จึงรวม ANGLE ไว้เป็นเลเยอร์ที่ไม่บังคับสําหรับการเรียกใช้ OpenGL® ES บน Vulkan การเปลี่ยนไปใช้ ANGLE จะทำให้การใช้งาน OpenGL ของ Android เป็นมาตรฐานเดียวกันเพื่อการทำงานร่วมกันได้ดียิ่งขึ้น และปรับปรุงประสิทธิภาพในบางกรณี คุณสามารถทดสอบความเสถียรและประสิทธิภาพของแอป OpenGL ES โดยใช้ ANGLE ได้โดยเปิดใช้ตัวเลือกสำหรับนักพัฒนาแอปในการตั้งค่า -> ระบบ -> ตัวเลือกสำหรับนักพัฒนาแอป -> ทดลอง: เปิดใช้ ANGLE ใน Android 15

แผนพัฒนา ANGLE บน Vulkan ของ Android

แผนงานการเปลี่ยนแปลงที่กําลังจะเกิดขึ้นกับ Android GPU API

ในอนาคตเราจะจัดส่ง ANGLE เป็นไดรเวอร์ระบบ GL ในอุปกรณ์ใหม่จำนวนมากขึ้นเพื่อปรับปรุงประสิทธิภาพของ GPU โดยคาดว่า OpenGL/ES จะใช้งานได้ผ่าน ANGLE เท่านั้น อย่างไรก็ตาม เราวางแผนที่จะรองรับ OpenGL ES บนอุปกรณ์ทุกเครื่องต่อไป

ขั้นตอนถัดไปที่แนะนำ

ใช้ตัวเลือกสำหรับนักพัฒนาแอปเพื่อเลือกไดรเวอร์ ANGLE สำหรับ OpenGL ES และทดสอบแอป สำหรับโปรเจ็กต์ใหม่ เราขอแนะนำให้ใช้ Vulkan สำหรับ C/C++

การปรับปรุง Canvas

Android 15 สานต่อการพัฒนาระบบกราฟิก Canvas ของ Android ให้ทันสมัยยิ่งขึ้นด้วยความสามารถเพิ่มเติมต่อไปนี้

  • Matrix44 มีเมทริกซ์ 4x4 สำหรับการเปลี่ยนรูปแบบพิกัดที่ควรใช้เมื่อคุณต้องการจัดการผืนผ้าใบใน 3 มิติ
  • clipShader จะตัดกันระหว่างคลิปปัจจุบันกับชิเดอร์ที่ระบุ ขณะที่ clipOutShader จะตั้งค่าคลิปเป็นความแตกต่างระหว่างคลิปปัจจุบันกับชิเดอร์ โดยแต่ละรายการจะถือว่าชิเดอร์เป็นมาสก์อัลฟ่า ซึ่งรองรับการวาดรูปทรงที่ซับซ้อนได้อย่างมีประสิทธิภาพ

ประสิทธิภาพและแบตเตอรี่

Android ยังคงมุ่งเน้นที่การช่วยคุณปรับปรุงประสิทธิภาพและคุณภาพของแอป Android 15 ขอแนะนำ API ที่ช่วยให้การทำงานในแอปมีประสิทธิภาพมากขึ้นในการดำเนินการ เพิ่มประสิทธิภาพของแอป และรวบรวมข้อมูลเชิงลึกเกี่ยวกับแอป

ดูแนวทางปฏิบัติแนะนำเพื่อประสิทธิภาพของแบตเตอรี่ การแก้ไขข้อบกพร่องของการใช้เครือข่ายและพลังงาน และ รายละเอียดเกี่ยวกับวิธีที่เราปรับปรุงประสิทธิภาพของแบตเตอรี่ในการทำงานเบื้องหลังใน Android 15 และ Android เวอร์ชันล่าสุดได้ที่ Improving battery efficiency of background work on Android การบรรยายจาก Google I/O

ApplicationStartInfo API

ใน Android เวอร์ชันก่อนหน้า การเริ่มต้นแอปเป็นเรื่องที่เข้าใจยากอยู่บ้าง เราพบว่าการระบุภายในแอปว่าแอปเริ่มต้นจากสถานะเย็น อุ่น หรือร้อนนั้นเป็นเรื่องยาก นอกจากนี้ คุณยังทราบระยะเวลาที่แอปใช้ในการดำเนินการต่างๆ ในระยะเริ่มต้น เช่น การแยกกระบวนการ การเรียก onCreate การวาดเฟรมแรก และอื่นๆ ได้ไม่ชัดเจน เมื่อสร้างอินสแตนซ์คลาส Application แล้ว คุณจะไม่มีทางรู้ว่าแอปเริ่มต้นจากบรีดแคสต์ ผู้ให้บริการเนื้อหา งาน การสำรองข้อมูล การบูตเสร็จสมบูรณ์ การปลุก หรือ Activity

ApplicationStartInfo API ใน Android 15 มีฟีเจอร์ทั้งหมดนี้และอีกมากมาย คุณยังเลือกเพิ่มการประทับเวลาของคุณเองลงในขั้นตอนเพื่อรวบรวมข้อมูลการกําหนดเวลาในที่เดียวได้ด้วย นอกจากการเก็บรวบรวมเมตริกแล้ว คุณยังใช้ ApplicationStartInfo เพื่อช่วยเพิ่มประสิทธิภาพการเริ่มต้นของแอปได้โดยตรง เช่น คุณอาจลดการสร้างอินสแตนซ์ของไลบรารีที่เกี่ยวข้องกับ UI ในคลาส Application ที่ไม่จำเป็นได้เมื่อแอปเริ่มต้นขึ้นเนื่องจากการออกอากาศ

ข้อมูลขนาดแอปโดยละเอียด

ตั้งแต่ Android 8.0 (API ระดับ 26) เป็นต้นไป Android ได้รวม StorageStats.getAppBytes API ที่สรุปขนาดของแอปที่ติดตั้งเป็นจำนวนไบต์เดียว ซึ่งเป็นผลรวมของขนาด APK, ขนาดของไฟล์ที่ดึงมาจาก APK และไฟล์ที่สร้างในอุปกรณ์ เช่น โค้ดที่คอมไพล์ล่วงหน้า (AOT) ตัวเลขนี้ไม่ได้ให้ข้อมูลเชิงลึกมากนักเกี่ยวกับวิธีที่แอปใช้พื้นที่เก็บข้อมูล

Android 15 เพิ่ม StorageStats.getAppBytesByDataType([type]) API ซึ่งจะช่วยให้คุณได้รับข้อมูลเชิงลึกเกี่ยวกับวิธีที่แอปใช้พื้นที่ทั้งหมดนั้น รวมถึงการแยกไฟล์ APK, AOT และโค้ดที่เกี่ยวข้องกับการเร่งความเร็ว, ข้อมูลเมตา dex, ไลบรารี และโปรไฟล์ที่แนะนำ

การสร้างโปรไฟล์ที่แอปจัดการ

Android 15 includes the ProfilingManager class, which lets you collect profiling information from within your app such as heap dumps, heap profiles, stack sampling, and more. It provides a callback to your app with a supplied tag to identify the output file, which is delivered to your app's files directory. The API does rate limiting to minimize the performance impact.

To simplify constructing profiling requests in your app, we recommend using the corresponding Profiling AndroidX API, available in Core 1.15.0-rc01 or higher.

การปรับปรุงฐานข้อมูล SQLite

Android 15 เปิดตัว SQLite API ที่แสดงฟีเจอร์ขั้นสูงจากเครื่องมือ SQLite ที่อยู่เบื้องหลังซึ่งมุ่งเน้นปัญหาด้านประสิทธิภาพที่เฉพาะเจาะจงซึ่งอาจแสดงในแอป API เหล่านี้มาพร้อมกับการอัปเดต SQLite เป็นเวอร์ชัน 3.44.3

นักพัฒนาแอปควรอ่านแนวทางปฏิบัติแนะนำสำหรับประสิทธิภาพของ SQLite เพื่อใช้ประโยชน์จากฐานข้อมูล SQLite ให้ได้สูงสุด โดยเฉพาะเมื่อทำงานกับ หรือเมื่อเรียกใช้การค้นหาที่คำนึงถึงเวลาในการตอบสนอง

  • ธุรกรรมที่รอดำเนินการแบบอ่านอย่างเดียว: เมื่อออกธุรกรรมแบบอ่านอย่างเดียว (ไม่มีคำสั่งเขียน) ให้ใช้ beginTransactionReadOnly() และ beginTransactionWithListenerReadOnly(SQLiteTransactionListener) เพื่อออกธุรกรรม DEFERRED แบบอ่านอย่างเดียว ธุรกรรมดังกล่าวทำงานได้ พร้อมๆ กัน และถ้าฐานข้อมูลอยู่ในโหมด WAL จะสามารถส่ง ทำงานพร้อมกันกับธุรกรรม IMMEDIATE หรือ EXCLUSIVE
  • จำนวนแถวและรหัส: มีการเพิ่ม API เพื่อเรียกข้อมูลจำนวนที่มีการเปลี่ยนแปลง หรือรหัสแถวที่แทรกล่าสุดโดยไม่ต้องส่งคำขอเพิ่มเติม getLastChangedRowCount() จะแสดงจํานวนแถวที่แทรก อัปเดต หรือลบโดยคำสั่ง SQL ล่าสุดภายในธุรกรรมปัจจุบัน ส่วน getTotalChangedRowCount() จะแสดงจํานวนการเชื่อมต่อปัจจุบัน getLastInsertRowId() แสดงผล rowid ของแถวสุดท้าย ที่จะแทรกลงในการเชื่อมต่อปัจจุบัน
  • ข้อความดิบ: ออกคำสั่ง SQlite ดิบโดยหลีกเลี่ยงความสะดวก Wrapper และค่าใช้จ่ายในการประมวลผลเพิ่มเติมอื่นๆ ที่อาจเกิดขึ้น

การอัปเดตเฟรมเวิร์กประสิทธิภาพไดนามิก Android

Android 15 ยังคงลงทุนใน Android Dynamic Performance Framework (ADPF) ซึ่งเป็นชุด API ที่ช่วยให้เกมและแอปที่เน้นประสิทธิภาพสามารถโต้ตอบกับระบบพลังงานและความร้อนของอุปกรณ์ Android ได้โดยตรงยิ่งขึ้น Android 15 เพิ่มความสามารถต่อไปนี้ของ ADPF ในอุปกรณ์ที่รองรับ

  • โหมดประหยัดพลังงานสำหรับเซสชันคำแนะนำเพื่อบ่งบอกว่าชุดข้อความที่เกี่ยวข้องควรให้ความสำคัญกับการประหยัดพลังงานมากกว่าประสิทธิภาพ ซึ่งเหมาะสำหรับเวิร์กโหลดที่ทำงานอยู่เบื้องหลังเป็นเวลานาน
  • คุณรายงานระยะเวลาการทำงานของ GPU และ CPU ได้ในเซสชันคำแนะนำ ซึ่งช่วยให้ระบบปรับความถี่ของ CPU และ GPU ร่วมกันเพื่อตอบสนองดีมานด์ของปริมาณงานได้ดีที่สุด
  • เกณฑ์ Headroom ความร้อนเพื่อตีความสถานะการจำกัดความร้อนที่เป็นไปได้ตามการคาดการณ์ Headroom

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้ ADPF ในแอปและเกม โปรดไปที่เอกสารประกอบ

ความเป็นส่วนตัว

Android 15 มีฟีเจอร์มากมายที่ช่วยนักพัฒนาแอปปกป้องความเป็นส่วนตัวของผู้ใช้

การตรวจจับการบันทึกหน้าจอ

Android 15 เพิ่มการรองรับแอปเพื่อตรวจจับว่ามีการบันทึกเสียง ระบบจะเรียกใช้การเรียกกลับทุกครั้งที่แอปเปลี่ยนสถานะระหว่างมองเห็นหรือไม่มองเห็นภายในการบันทึกหน้าจอ แอปคือ ถือว่ามองเห็นได้หากกิจกรรมที่เป็นของ UID ของกระบวนการลงทะเบียนนั้น มีการบันทึก วิธีนี้ช่วยให้คุณแจ้งให้ผู้ใช้ทราบว่ามีการบันทึกเสียงอยู่ได้ หากแอปของคุณดําเนินการที่มีความละเอียดอ่อน

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

พื้นที่ส่วนตัว

คุณปลดล็อกและล็อกพื้นที่ส่วนตัวเพื่อแสดงหรือซ่อนแอปที่มีความละเอียดอ่อนในอุปกรณ์ได้

พื้นที่ส่วนตัวช่วยให้ผู้ใช้สร้างพื้นที่แยกต่างหากในอุปกรณ์ ซึ่งสามารถซ่อนแอปที่มีความละเอียดอ่อนเพื่อป้องกันไม่ให้ผู้อื่นแอบดูได้ภายใต้การตรวจสอบสิทธิ์อีกชั้น พื้นที่ส่วนตัวจะใช้โปรไฟล์ผู้ใช้แยกต่างหาก ผู้ใช้สามารถเลือกใช้การล็อกอุปกรณ์หรือปัจจัยการล็อกแยกต่างหากสำหรับพื้นที่ส่วนตัว

แอปในพื้นที่ส่วนตัวจะปรากฏในคอนเทนเนอร์แยกต่างหากใน Launcher และถูกซ่อนจากมุมมองรายการล่าสุด การแจ้งเตือน การตั้งค่า และแอปอื่นๆ เมื่อล็อกพื้นที่ส่วนตัวไว้ เนื้อหาที่ผู้ใช้สร้างขึ้นและดาวน์โหลด (เช่น สื่อหรือไฟล์) และบัญชีจะแยกกันระหว่างพื้นที่ส่วนตัวและพื้นที่หลัก คุณสามารถใช้ระบบ Sharesheet และเครื่องมือเลือกรูปภาพเพื่อให้แอปเข้าถึงเนื้อหาในพื้นที่ต่างๆ ได้เมื่อปลดล็อกพื้นที่ส่วนตัว

ผู้ใช้จะย้ายแอปที่มีอยู่และข้อมูลของแอปไปยังพื้นที่ส่วนตัวไม่ได้ แต่ผู้ใช้จะเลือกตัวเลือกการติดตั้งในพื้นที่ส่วนตัวเพื่อติดตั้งแอปโดยใช้ App Store ที่ต้องการแทน แอปในพื้นที่ส่วนตัวจะติดตั้งเป็นสำเนาแยกต่างหากจากแอปในพื้นที่หลัก (สำเนาใหม่ของแอปเดียวกัน)

เมื่อผู้ใช้ล็อกพื้นที่ส่วนตัว โปรไฟล์จะหยุดทำงาน เมื่อโปรไฟล์หยุดทำงาน แอปในพื้นที่ส่วนตัวจะไม่ทำงานอีกต่อไปและไม่สามารถดําเนินกิจกรรมในเบื้องหน้าหรือเบื้องหลัง รวมถึงแสดงการแจ้งเตือน

เราขอแนะนำให้คุณทดสอบแอปด้วยพื้นที่ส่วนตัวเพื่อให้แน่ใจว่าแอปทำงานได้ตามที่คาดไว้ โดยเฉพาะอย่างยิ่งหากแอปของคุณจัดอยู่ในหมวดหมู่ใดหมวดหมู่หนึ่งต่อไปนี้

ค้นหาการเลือกของผู้ใช้ล่าสุดสำหรับการเข้าถึงรูปภาพที่เลือก

ตอนนี้แอปจะไฮไลต์ได้เฉพาะรูปภาพและวิดีโอที่เลือกล่าสุดเมื่อได้รับสิทธิ์การเข้าถึงบางส่วนในสื่อ ฟีเจอร์นี้ช่วยปรับปรุง ประสบการณ์ของผู้ใช้สำหรับแอปที่มักขอเข้าถึงรูปภาพและ วิดีโอ หากต้องการใช้ฟีเจอร์นี้ในแอป ให้เปิดใช้อาร์กิวเมนต์ 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)
});

Privacy Sandbox ใน Android

Android 15 มีชิ้นงานบริการโฆษณา Android เวอร์ชันล่าสุด ซึ่งรวม Privacy Sandbox ใน Android เวอร์ชันล่าสุด การเปิดตัวครั้งนี้เป็นส่วนหนึ่งของความพยายามของเราในการพัฒนาเทคโนโลยีที่ช่วยเพิ่มความเป็นส่วนตัวของผู้ใช้ และสร้างประสบการณ์ใช้งานโฆษณาที่ปรับตามโปรไฟล์ของผู้ใช้ให้มีประสิทธิภาพยิ่งขึ้นสำหรับแอปบนอุปกรณ์เคลื่อนที่ หน้า Privacy Sandbox มีข้อมูลเพิ่มเติมเกี่ยวกับ Privacy Sandbox ในโปรแกรมทดลองใช้ก่อนเปิดตัวและโปรแกรมเบต้าสำหรับนักพัฒนาแอป 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 แต่ละเซสชัน

ประสบการณ์ของผู้ใช้และ UI ของระบบ

Android 15 ช่วยให้นักพัฒนาแอปและผู้ใช้ควบคุมและปรับเปลี่ยนการกำหนดค่าอุปกรณ์ให้เหมาะกับความต้องการของตนเองได้มากขึ้น

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้การปรับปรุงล่าสุดใน Android 15 เพื่อปรับปรุง ประสบการณ์ของผู้ใช้แอปได้ที่การบรรยายเรื่อง Improve the user experience of your Android app จาก Google I/O

ตัวอย่างวิดเจ็ตที่สมบูรณ์ยิ่งขึ้นด้วย Generated Previews API

ก่อน Android 15 วิธีเดียวในการแสดงตัวอย่างเครื่องมือเลือกวิดเจ็ตคือต้องระบุทรัพยากรรูปภาพหรือเลย์เอาต์แบบคงที่ ตัวอย่างเหล่านี้มักจะแตกต่างจากลักษณะของวิดเจ็ตจริงเมื่อวางไว้ในหน้าจอหลักอย่างมาก นอกจากนี้ ทรัพยากรแบบคงที่ไม่อาจสร้างได้ด้วย Jetpack Glance ดังนั้นข้อมูลโดยย่อ นักพัฒนาซอฟต์แวร์ต้องจับภาพหน้าจอวิดเจ็ตของตน หรือสร้างเค้าโครง XML เพื่อให้ ตัวอย่างวิดเจ็ต

Android 15 เพิ่มการรองรับตัวอย่างที่สร้างขึ้น ซึ่งหมายความว่าผู้ให้บริการวิดเจ็ตแอปสามารถสร้าง RemoteViews เพื่อใช้เป็นตัวอย่างเครื่องมือเลือกแทนทรัพยากรแบบคงที่

แอปสามารถแสดงมุมมองจากระยะไกลต่อเครื่องมือเลือกวิดเจ็ต เพื่อให้เครื่องมือเลือกอัปเดตเนื้อหาในเครื่องมือเลือกให้แสดงสิ่งที่ผู้ใช้จะเห็นได้มากขึ้น

Push API

แอปสามารถแสดงตัวอย่างที่สร้างขึ้นผ่าน Push 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. ผู้ให้บริการวิดเจ็ตเรียก setWidgetPreview ได้ทุกเมื่อ ระบบจะเก็บตัวอย่างเพลงที่ระบุไว้ใน AppWidgetService ไว้พร้อมกับข้อมูลอื่นๆ ของผู้ให้บริการ
  2. setWidgetPreview จะแจ้งโฮสต์เกี่ยวกับตัวอย่างที่อัปเดตแล้วผ่าน การติดต่อกลับของ AppWidgetHost.onProvidersChanged ในการตอบสนอง วิดเจ็ต โฮสต์จะโหลดข้อมูลผู้ให้บริการทั้งหมดซ้ำ
  3. เมื่อแสดงตัวอย่างวิดเจ็ต โฮสต์จะตรวจสอบ AppWidgetProviderInfo.generatedPreviewCategories และหากเลือก มีหมวดหมู่ ติดต่อ AppWidgetManager.getWidgetPreview ไปยัง ให้แสดงตัวอย่างที่บันทึกไว้สำหรับผู้ให้บริการรายนี้

กรณีที่ควรโทรหา setWidgetPreview

เนื่องจากไม่มีคอลแบ็กให้แสดงตัวอย่าง แอปจึงเลือกส่งตัวอย่างได้ทุกเมื่อขณะที่ทำงานอยู่ ความถี่ในการอัปเดตตัวอย่างจะขึ้นอยู่กับกรณีการใช้งานวิดเจ็ต

รายการต่อไปนี้อธิบายกรณีการใช้งานตัวอย่างเพลงหลัก 2 หมวดหมู่

  • ผู้ให้บริการที่แสดงข้อมูลจริงในตัวอย่างวิดเจ็ต เช่น หรือข้อมูลล่าสุด ผู้ให้บริการเหล่านี้สามารถตั้งค่าตัวอย่างเพลงได้เมื่อผู้ใช้ลงชื่อเข้าใช้หรือทำการกําหนดค่าเริ่มต้นในแอปแล้ว หลังจากนั้น ผู้ให้บริการจะตั้งค่างานเป็นระยะเพื่ออัปเดตตัวอย่างเพลงตามช่วงเวลาที่เลือกได้ ตัวอย่างของวิดเจ็ตประเภทนี้อาจเป็นรูปภาพ ปฏิทิน สภาพอากาศ หรือข่าว วิดเจ็ต
  • ผู้ให้บริการที่แสดงข้อมูลแบบคงที่ในตัวอย่างหรือวิดเจ็ตการดำเนินการด่วนซึ่งไม่แสดงข้อมูลใดๆ ผู้ให้บริการเหล่านี้สามารถ ตั้งค่าการแสดงตัวอย่างได้ 1 ครั้งเมื่อ เปิดแอปครั้งแรก ตัวอย่างของวิดเจ็ตประเภทนี้ ได้แก่ ไดรฟ์ไวท์ วิดเจ็ตการดำเนินการ หรือวิดเจ็ตทางลัดของ Chrome

ผู้ให้บริการบางรายอาจแสดงตัวอย่างแบบคงที่ในเครื่องมือเลือกโหมดฮับ แต่แสดงจริง ในเครื่องมือเลือกหน้าจอหลัก ผู้ให้บริการเหล่านี้ควรปฏิบัติตามคำแนะนำ สำหรับกรณีการใช้งานทั้ง 2 อย่างนี้ในการตั้งค่าตัวอย่าง

การแสดงภาพซ้อนภาพ

Android 15 เปิดตัวการเปลี่ยนแปลงในการแสดงภาพซ้อนภาพ (PIP) เพื่อให้ การเปลี่ยนผ่านที่ราบรื่นขึ้นเมื่อเข้าสู่โหมด PIP ซึ่งจะเป็นประโยชน์สำหรับแอปที่มีองค์ประกอบ UI วางซ้อนอยู่ด้านบนของ UI หลักซึ่งจะเข้าสู่โหมด PIP

นักพัฒนาแอปใช้ Callback onPictureInPictureModeChanged เพื่อกำหนดตรรกะ ที่เปิด/ปิดการมองเห็นองค์ประกอบ UI ที่ซ้อนอยู่ การเรียกกลับนี้ ทริกเกอร์เมื่อภาพเคลื่อนไหวการป้อนหรือออกจาก PIP เสร็จสมบูรณ์ จะเริ่มต้นใน Android 15 คลาส PictureInPictureUiState จะมีสถานะอื่นรวมอยู่ด้วย

ด้วยสถานะ UI นี้ แอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) จะสังเกตเห็น มีการเรียกใช้ Callback Activity#onPictureInPictureUiStateChanged ด้วย isTransitioningToPip() ทันทีที่ภาพเคลื่อนไหว PIP เริ่มขึ้น องค์ประกอบ UI จำนวนมากไม่เกี่ยวข้องกับแอปเมื่ออยู่ในโหมด PiP เช่น มุมมองหรือเลย์เอาต์ที่มีข้อมูล เช่น วิดีโอแนะนำ วิดีโอที่กำลังจะเผยแพร่ การจัดประเภท และชื่อ เมื่อแอปเข้าสู่โหมด PIP ให้ใช้ onPictureInPictureUiStateChanged Callback เพื่อซ่อนองค์ประกอบ UI เหล่านี้ เมื่อ แอปเข้าสู่โหมดเต็มหน้าจอจากหน้าต่าง PIP ให้ใช้ onPictureInPictureModeChanged Callback เพื่อเลิกซ่อนองค์ประกอบเหล่านี้ ดังที่แสดงใน ตัวอย่างต่อไปนี้

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

การเปิด/ปิดการแสดงผลองค์ประกอบ UI ที่ไม่เกี่ยวข้องอย่างรวดเร็ว (สำหรับหน้าต่าง PiP) นี้จะช่วยให้ภาพเคลื่อนไหวของ PiP ปรากฏขึ้นอย่างราบรื่นและไม่มีภาพกะพริบ

กฎห้ามรบกวนที่ปรับปรุงใหม่

AutomaticZenRule อนุญาตให้แอปปรับแต่งความสนใจได้ การจัดการกฎ (ห้ามรบกวน) และเลือกว่าจะเปิดหรือปิดใช้งานเมื่อใด ให้พวกเขา Android 15 ช่วยเพิ่มประสิทธิภาพให้กฎเหล่านี้อย่างมาก โดยมีเป้าหมายเพื่อปรับปรุง ประสบการณ์ของผู้ใช้ การปรับปรุงเหล่านี้มีดังนี้

  • กำลังเพิ่มประเภทลงใน AutomaticZenRule เพื่อให้ระบบใช้แบบพิเศษได้ กับกฎบางอย่าง
  • การเพิ่มไอคอนลงใน AutomaticZenRule ช่วยให้โหมดต่างๆ เป็นที่รู้จักมากขึ้น
  • การเพิ่มสตริง triggerDescription ใน AutomaticZenRule ที่อธิบาย เงื่อนไขที่กฎควรทำงานสำหรับผู้ใช้
  • เพิ่มเมื่อ ZenDeviceEffects เป็น AutomaticZenRule เพื่อให้กฎเรียกใช้สิ่งต่างๆ เช่น โทนสีเทา จอแสดงผล โหมดกลางคืน หรือการหรี่แสงวอลเปเปอร์

ตั้งค่า VibrationEffect สำหรับช่องทางการแจ้งเตือน

Android 15 รองรับการตั้งค่าการสั่นแบบริชมีเดียสำหรับการแจ้งเตือนขาเข้าตามแชแนลโดยใช้ NotificationChannel.setVibrationEffect เพื่อให้ผู้ใช้แยกแยะการแจ้งเตือนประเภทต่างๆ ได้โดยไม่ต้องมองที่อุปกรณ์

ชิปแถบสถานะการฉายภาพสื่อและการหยุดอัตโนมัติ

Media projection can expose private user information. A new, prominent status bar chip makes users aware of any ongoing screen projection. Users can tap the chip to stop screen casting, sharing, or recording. Also, for a more intuitive user experience, any in‑progress screen projection now automatically stops when the device screen is locked.

ชิปแถบสถานะสำหรับการแชร์หน้าจอ แคสต์ และบันทึก

หน้าจอขนาดใหญ่และรูปแบบต่างๆ

Android 15 ช่วยให้แอปของคุณรองรับรูปแบบต่างๆ ของ Android ได้อย่างเต็มที่ ซึ่งรวมถึงหน้าจอขนาดใหญ่ อุปกรณ์แบบพับได้ และอุปกรณ์แบบฝาพับ

การทำงานหลายอย่างพร้อมกันบนหน้าจอขนาดใหญ่ที่ปรับปรุงใหม่

Android 15 ช่วยให้ผู้ใช้ทำงานหลายอย่างพร้อมกันในอุปกรณ์หน้าจอขนาดใหญ่ได้ดียิ่งขึ้น สำหรับ เช่น ผู้ใช้สามารถบันทึกชุดแอปที่ใช้ร่วมกันที่ชอบเพื่อใช้โหมดแยกหน้าจอได้อย่างรวดเร็ว เข้าถึงและปักหมุดแถบงานบนหน้าจอเพื่อสลับไปมาระหว่างแอปต่างๆ ได้อย่างรวดเร็ว ซึ่งหมายความว่า การทำให้แอปของคุณปรับเปลี่ยนได้นั้นสำคัญกว่าที่เคย

Google I/O มีเซสชันเกี่ยวกับการสร้าง Android แบบปรับอัตโนมัติ แอปและการสร้าง UI ด้วย Material 3 ไลบรารีแบบปรับอัตโนมัติ ที่ช่วยได้ และเอกสารของเรายังมีสิ่งอื่นๆ ที่ช่วยคุณออกแบบ

การรองรับหน้าจอด้านนอก

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 ยังคงขยายการรองรับแพลตฟอร์มสำหรับการเชื่อมต่อผ่านดาวเทียมต่อไป และ มีองค์ประกอบ UI บางอย่างเพื่อให้มั่นใจว่าผู้ใช้จะได้รับประสบการณ์ที่สอดคล้องกันทั่วทั้ง การเชื่อมต่อผ่านดาวเทียม

แอปสามารถใช้ ServiceState.isUsingNonTerrestrialNetwork() เพื่อ ตรวจจับเมื่ออุปกรณ์เชื่อมต่อกับดาวเทียม ทำให้อุปกรณ์รับรู้ถึง สาเหตุที่บริการเครือข่ายเต็มรูปแบบอาจใช้ไม่ได้ นอกจากนี้ Android 15 ยังรองรับแอป SMS และ MMS รวมถึงแอป RCS ที่โหลดไว้ล่วงหน้าเพื่อใช้การเชื่อมต่อผ่านดาวเทียมสำหรับส่งและรับข้อความ

การแจ้งเตือนจะปรากฏขึ้นเมื่ออุปกรณ์เชื่อมต่อกับดาวเทียม

ประสบการณ์การใช้งาน 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 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.

บทบาทกระเป๋าสตางค์

Android 15 เปิดตัวบทบาท Wallet ที่ช่วยให้ผสานรวมกับแอป Wallet ที่ต้องการของผู้ใช้ได้ดียิ่งขึ้น บทบาทนี้จะแทนที่การตั้งค่าการชำระเงินแบบไม่ต้องสัมผัสเริ่มต้นของ NFC ผู้ใช้สามารถจัดการผู้ถือบทบาท Wallet ได้โดยไปที่การตั้งค่า > แอป > แอปเริ่มต้น

ระบบจะใช้บทบาท Wallet เมื่อกำหนดเส้นทางการแตะ NFC สำหรับ AID ที่ลงทะเบียนไว้ในหมวดหมู่การชำระเงิน การแตะจะไปยังผู้ถือบทบาท Wallet เสมอ เว้นแต่ว่าแอปอื่นที่ลงทะเบียนสำหรับ AID เดียวกันจะทำงานอยู่เบื้องหน้า

บทบาทนี้ยังใช้เพื่อกำหนดตําแหน่งการ์ดการเข้าถึงด่วนของ Wallet เมื่อเปิดใช้งาน เมื่อตั้งค่าบทบาทเป็น "ไม่มี" การ์ดการเข้าถึงด่วนจะใช้งานไม่ได้และการแตะ NFC หมวดหมู่การชำระเงินจะแสดงในแอปที่ทำงานอยู่เบื้องหน้าเท่านั้น

ความปลอดภัย

Android 15 ช่วยให้คุณเพิ่มความปลอดภัยของแอป ปกป้องข้อมูลของแอป และให้ความโปร่งใสและการควบคุมข้อมูลแก่ผู้ใช้มากขึ้น ดูข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เรากำลังทำเพื่อปรับปรุงการป้องกันผู้ใช้และ ปกป้องแอปของคุณจากภัยคุกคามใหม่ๆ ได้ที่การบรรยายเรื่อง Safeguarding user security on Android จาก Google I/O

ผสานรวม Credential Manager กับฟีเจอร์การป้อนข้อความอัตโนมัติ

ตั้งแต่ Android 15 เป็นต้นไป นักพัฒนาแอปสามารถลิงก์มุมมองที่เฉพาะเจาะจง เช่น ช่องชื่อผู้ใช้หรือรหัสผ่านกับคำขอของเครื่องมือจัดการข้อมูลเข้าสู่ระบบได้ ซึ่งทำให้มอบประสบการณ์การใช้งานที่ปรับให้เหมาะกับผู้ใช้ได้ง่ายขึ้นในระหว่างกระบวนการลงชื่อเข้าใช้ เมื่อผู้ใช้โฟกัสที่มุมมองใดมุมมองหนึ่ง ระบบจะส่งคําขอที่เกี่ยวข้องไปยังเครื่องมือจัดการข้อมูลเข้าสู่ระบบ ระบบจะรวบรวมข้อมูลเข้าสู่ระบบที่ได้จากผู้ให้บริการต่างๆ และแสดงใน UI สำรองสำหรับการป้อนข้อความอัตโนมัติ เช่น คำแนะนำในบรรทัดหรือคำแนะนำแบบเมนูแบบเลื่อนลง ไลบรารี androidx.credentials ของ Jetpack เป็นปลายทางที่นักพัฒนาแอปควรใช้ และจะพร้อมใช้งานเพื่อปรับปรุงฟีเจอร์นี้ใน Android 15 ขึ้นไปในเร็วๆ นี้

ผสานรวมการลงชื่อสมัครใช้และการลงชื่อเข้าใช้ด้วยการแตะครั้งเดียวเข้ากับข้อความแจ้งไบโอเมตริก

เครื่องมือจัดการข้อมูลเข้าสู่ระบบผสานรวมพรอมต์ข้อมูลไบโอเมตริกเข้ากับการสร้างข้อมูลเข้าสู่ระบบ และลงชื่อเข้าใช้ ทำให้ผู้ให้บริการไม่ต้องจัดการ พรอมต์ข้อมูลไบโอเมตริก ด้วยเหตุนี้ ผู้ให้บริการข้อมูลเข้าสู่ระบบจึงต้องมุ่งเน้นที่ ผลลัพธ์ของการสร้างและรับโฟลว์ ซึ่งเสริมด้วยผลลัพธ์โฟลว์ข้อมูลไบโอเมตริก กระบวนการที่ง่ายขึ้นนี้จะช่วยให้การสร้างและการเรียกข้อมูลเข้าสู่ระบบมีประสิทธิภาพและสะดวกยิ่งขึ้น

การจัดการคีย์สำหรับการเข้ารหัสจากต้นทางถึงปลายทาง

เราขอแนะนำ E2eeContactKeysManager ใน Android 15 ซึ่งจะช่วยอำนวยความสะดวกในการเข้ารหัสจากต้นทางถึงปลายทาง (E2EE) ในแอป Android ของคุณด้วย API ระดับระบบปฏิบัติการสำหรับจัดเก็บคีย์สาธารณะการเข้ารหัส

E2eeContactKeysManager ได้รับการออกแบบมาให้ผสานรวมกับแอปรายชื่อติดต่อของแพลตฟอร์มเพื่อให้ผู้ใช้มีวิธีแบบรวมศูนย์ในการจัดการและยืนยันคีย์สาธารณะของรายชื่อติดต่อ

การตรวจสอบสิทธิ์ใน URI ของเนื้อหา

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

การช่วยเหลือพิเศษ

Android 15 เพิ่มฟีเจอร์ที่ปรับปรุงการช่วยเหลือพิเศษสำหรับผู้ใช้

อักษรเบรลล์ที่ดีขึ้น

ใน Android 15 เราได้ทำให้ TalkBack รองรับจอแสดงผลอักษรเบรลล์ที่ใช้มาตรฐาน HID ผ่านทั้ง USB และบลูทูธที่ปลอดภัย

มาตรฐานนี้ซึ่งคล้ายกับมาตรฐานที่ใช้กับเมาส์และแป้นพิมพ์จะช่วยให้ Android รองรับจอแสดงผลอักษรเบรลล์ได้หลากหลายมากขึ้นในอนาคต

การทำให้เป็นสากล

Android 15 เพิ่มฟีเจอร์และความสามารถที่ช่วยเสริมประสบการณ์ของผู้ใช้เมื่อใช้อุปกรณ์ในภาษาต่างๆ

แบบอักษรที่ปรับแต่งได้ CJK

Starting with Android 15, the font file for Chinese, Japanese, and Korean (CJK) languages, NotoSansCJK, is now a variable font. Variable fonts open up possibilities for creative typography in CJK languages. Designers can explore a broader range of styles and create visually striking layouts that were previously difficult or impossible to achieve.

How the variable font for Chinese, Japanese, and Korean (CJK) languages appears with different font widths.

การจัดชิดตัวอักษร

ใน 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 started supporting phrase-based line breaks for Japanese and Korean in Android 13 (API level 33). However, while phrase-based line breaks improve the readability of short lines of text, they don't work well for long lines of text. In Android 15, apps can apply phrase-based line breaks only for short lines of text, using the LINE_BREAK_WORD_STYLE_AUTO option. This option selects the best word style option for the text.

For short lines of text, phrase-based line breaks are used, functioning the same as LINE_BREAK_WORD_STYLE_PHRASE, as shown in the following image:

For short lines of text, LINE_BREAK_WORD_STYLE_AUTO applies phrase-based line breaks to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_PHRASE.

For longer lines of text, LINE_BREAK_WORD_STYLE_AUTO uses a no line-break word style, functioning the same as LINE_BREAK_WORD_STYLE_NONE, as shown in the following image:

For long lines of text, LINE_BREAK_WORD_STYLE_AUTO applies no line-break word style to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_NONE.

แบบอักษร Hentaigana ของญี่ปุ่นเพิ่มเติม

In Android 15, a 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 แสดงลิขสิทธิ์ (c) 1996-2010 VideoLAN ทุกคนสามารถใช้หรือแก้ไขโลโก้นี้หรือเวอร์ชันที่แก้ไขแล้วเพื่ออ้างอิงถึงโปรเจ็กต์ VideoLAN หรือผลิตภัณฑ์ใดๆ ที่พัฒนาโดยทีม VideoLAN แต่ไม่ได้บ่งบอกถึงการรับรองจากโปรเจ็กต์

Vulkan และโลโก้ Vulkan เป็นเครื่องหมายการค้าจดทะเบียนของ Khronos Group Inc.

OpenGL เป็นเครื่องหมายการค้าจดทะเบียนและโลโก้ OpenGL ES เป็นเครื่องหมายการค้าของ Hewlett Packard Enterprise ซึ่ง Khronos ใช้โดยได้รับอนุญาต