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

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

ดูรายการ API ที่เพิ่ม แก้ไข และนําออกอย่างละเอียดได้ในรายงานความแตกต่างของ API ดูรายละเอียดเกี่ยวกับ API ที่เพิ่มได้ที่ข้อมูลอ้างอิง Android API สำหรับ Android 15 ให้มองหา API ที่เพิ่มใน API ระดับ 35 หากต้องการดูข้อมูลเกี่ยวกับด้านต่างๆ ที่การเปลี่ยนแปลงแพลตฟอร์มอาจส่งผลต่อแอปของคุณ โปรดดูการเปลี่ยนแปลงลักษณะการทํางานของ Android 15 สําหรับแอปที่กำหนดเป้าหมายเป็น Android 15 และสําหรับแอปทั้งหมด

กล้องและสื่อ

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ล่าสุดและโซลูชันสำหรับนักพัฒนาแอปสำหรับสื่อและกล้องของ Android ได้ที่การบรรยายเรื่องการสร้างประสบการณ์การใช้งานสื่อและกล้อง Android ที่ทันสมัยจาก Google I/O

การเพิ่มแสงในสภาวะแสงน้อย

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

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

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

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

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

การควบคุมกล้องในแอป

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

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

การควบคุม Headroom ของ 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 เพิ่มการรองรับ มาตรฐานความดัง CTA-2075 เพื่อช่วยคุณ หลีกเลี่ยงความดังของเสียงที่ไม่สอดคล้องกัน และทำให้ผู้ใช้ไม่ต้องคอยฟัง ปรับระดับเสียงเมื่อสลับระหว่างเนื้อหา ระบบใช้ประโยชน์จากลักษณะที่ทราบของอุปกรณ์เอาต์พุต (หูฟังและลำโพง) พร้อมกับข้อมูลเมตาระดับเสียงที่มีอยู่ในเนื้อหาเสียง AAC เพื่อปรับระดับความดังของเสียงและการบีบอัดช่วงไดนามิกอย่างชาญฉลาด

หากต้องการเปิดใช้ฟีเจอร์นี้ คุณต้องตรวจสอบว่าข้อมูลเมตาระดับเสียงพร้อมใช้งานในเนื้อหา AAC และเปิดใช้ฟีเจอร์แพลตฟอร์มในแอป โดยคุณจะต้องสร้างอินสแตนซ์ออบเจ็กต์ LoudnessCodecController ด้วยการเรียกใช้เมธอด create ของฟีเจอร์ดังกล่าวพร้อมด้วยรหัสเซสชันเสียงจาก 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 จะได้รับการอัปเดตให้ใช้ LoudnessCodecControllerAPI เพื่อการผสานรวมแอปอย่างราบรื่น

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

OpenType Variable Font API ที่ปรับปรุงแล้ว

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

以下示例展示了如何同时使用新旧 API 创建 Typeface 呈现:

示例:使用新旧版本时字体渲染有何不同
API

在此示例中,使用旧 API 创建的 Typeface 不包含 为 350、450、550 和 650 创建准确的字体粗细 Font 实例,因此渲染程序会回退到最接近的权重。在 在此示例中,系统会渲染 300 而不是 350,渲染 400 而不是 450, 依此类推。相比之下,使用新 API 创建的 Typeface 会动态创建 给定权重的 Font 实例,因此系统会渲染 350 的准确权重, 450、550 和 650。

การควบคุมตัวแบ่งบรรทัดแบบละเอียด

ตั้งแต่ Android 15 เป็นต้นไป TextView และตัวแบ่งบรรทัดที่สำคัญจะเก็บรักษาข้อความที่ระบุในบรรทัดเดียวกันไว้เพื่อให้อ่านง่ายขึ้น คุณใช้ประโยชน์จากการปรับเปลี่ยนการขึ้นบรรทัดใหม่นี้ได้โดยการใช้แท็ก <nobreak> ในทรัพยากรสตริงหรือ createNoBreakSpan ในทำนองเดียวกัน คุณสามารถคงคำไม่ให้มีการแบ่งวรรคโดยใช้แท็ก <nohyphen> หรือ createNoHyphenationSpan

ตัวอย่างเช่น ทรัพยากรสตริงต่อไปนี้ไม่มีการขึ้นบรรทัดใหม่ และแสดงผลโดยตัดข้อความ "Pixel 8 Pro" ตรงที่ไม่ต้องการ

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

ในทางตรงกันข้าม ทรัพยากรสตริงนี้จะมีแท็ก <nobreak> ซึ่งตัดวลี "Pixel 8 Pro" และป้องกันการขึ้นบรรทัดใหม่:

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

ความแตกต่างของวิธีแสดงผลสตริงเหล่านี้จะแสดงอยู่ในรูปภาพต่อไปนี้

เลย์เอาต์สำหรับบรรทัดข้อความที่ไม่ได้ตัดวลี "Pixel 8 Pro" โดยใช้แท็ก <nobreak>
เลย์เอาต์สำหรับบรรทัดข้อความเดียวกันที่ตัดวลี "Pixel 8 Pro" โดยใช้แท็ก <nobreak>

การเก็บแอป

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

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

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

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

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

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

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

    คำเตือน: เนื่องจากปัญหาที่ทราบเกี่ยวกับ Android 15 QPR2 เบต้า 3 หน้าจอสัมผัสจึงใช้งานไม่ได้ในอุปกรณ์ Pixel 8 หลังจากติดตั้ง Android 15 QPR2 เบต้า 3 และบูตอุปกรณ์ในโหมด 16 KB ปัญหานี้ไม่ส่งผลต่ออุปกรณ์ Pixel 8 Pro

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

    คำเตือน: เนื่องจากปัญหาที่ทราบเกี่ยวกับ Android 15 QPR2 เบต้า 3 หน้าจอสัมผัสจึงใช้งานไม่ได้ในอุปกรณ์ Pixel 8a หลังจากติดตั้ง Android 15 QPR2 เบต้า 3 และบูตอุปกรณ์ในโหมด 16 KB

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

กราฟิก

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

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

Vulkan 徽标

与早期相比,Android 硬件已经有了很大的进步。早期,核心操作系统在单个 CPU 上运行,并且使用基于固定功能流水线的 API 访问 GPU。从 Android 7.0(API 级别 24)开始,NDK 中就提供了 Vulkan® 图形 API,其较低级别的抽象更好地反映了现代 GPU 硬件,可更好地扩缩以支持多个 CPU 核心,并可降低 CPU 驱动程序开销,从而提升应用性能。所有现代游戏引擎都支持 Vulkan。

Vulkan 是 Android 与 GPU 的首选接口。因此,Android 15 包含 ANGLE 作为可选层,用于在 Vulkan 基础上运行 OpenGL® ES。改用 ANGLE 将标准化 Android OpenGL 实现,提高兼容性,在某些情况下还有助于提升性能。在 Android 15 中,您可以依次前往设置 -> 系统 -> 开发者选项 -> 实验性功能:启用 ANGLE,启用开发者选项,以便通过 ANGLE 测试 OpenGL ES 应用的稳定性和性能。

Android ANGLE on Vulkan 路线图

Android GPU API 即将发生变更的路线图。

为了简化 GPU 堆栈,我们今后将在更多新设备上将 ANGLE 作为 GL 系统驱动程序提供,未来 OpenGL/ES 将只能通过 ANGLE 获得支持。尽管如此,我们计划继续在所有设备上支持 OpenGL ES

建议的后续措施

使用开发者选项为 OpenGL ES 选择 ANGLE 驱动程序,然后测试您的应用。对于新项目,我们强烈建议您为 C/C++ 使用 Vulkan。

การปรับปรุงสำหรับ Canvas

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

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

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

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

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

เราขอแนะนําให้ใช้ Profiling AndroidX API ที่เกี่ยวข้องเพื่อลดความซับซ้อนในการสร้างคําขอโปรไฟล์ในแอป ซึ่งพร้อมใช้งานใน Core 1.15.0-rc01 ขึ้นไป

การปรับปรุงฐานข้อมูล 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 动态性能框架 (ADPF),这是一组 API,可让游戏和性能密集型应用更为直接地与 Android 设备的电源和散热系统进行互动。在受支持的设备上,Android 15 添加了 ADPF 功能:

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

如需详细了解如何在应用和游戏中使用 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>
  <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: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>

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

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

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

แอปในพื้นที่ส่วนตัวจะปรากฏในคอนเทนเนอร์แยกต่างหากใน 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 集成了与 Health Connect by Android 相关的最新扩展程序。Health Connect by Android 是一个安全的集中式平台,可用于管理和共享应用收集的健康与健身数据。此次更新 增加了对健身营养、体表温度、训练计划等。

体表温度追踪功能让用户可以更精确地存储和分享体表温度 来自穿戴式设备或其他跟踪设备的体温数据。

训练计划是一种结构化的锻炼计划,可帮助用户实现健身目标。训练计划支持各种完成和表现目标:

如需详细了解 Android 中 Health Connect 的最新更新,请参阅 利用 Android 打造自适应体验 健康演讲。

การแชร์หน้าจอแอป

Android 15 รองรับการแชร์หน้าจอแอปเพื่อให้ผู้ใช้แชร์หรือบันทึกเฉพาะหน้าต่างแอปแทนทั้งหน้าจอของอุปกรณ์ได้ ฟีเจอร์นี้เปิดใช้ใน Android 14 QPR2 เป็นครั้งแรก โดยมีMediaProjectionการเรียกกลับที่ช่วยให้แอปของคุณปรับแต่งประสบการณ์การแชร์หน้าจอของแอปได้ โปรดทราบว่าแอปที่กําหนดเป้าหมายเป็น Android 14 (API ระดับ 34) ขึ้นไปต้องได้รับความยินยอมจากผู้ใช้สําหรับเซสชันการจับภาพ MediaProjection แต่ละเซสชัน

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

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 ซึ่งจะเป็นประโยชน์ต่อแอปที่มีองค์ประกอบ UI ซ้อนทับบน UI หลัก ซึ่งจะอยู่ในรูปแบบ PIP

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

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

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 เพื่อให้ผู้ใช้แยกแยะการแจ้งเตือนประเภทต่างๆ ได้โดยไม่ต้องมองที่อุปกรณ์

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

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

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

หน้าจอขนาดใหญ่และรูปแบบของอุปกรณ์

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

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

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

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

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

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

การเชื่อมต่อ

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

การสนับสนุนผ่านดาวเทียม

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

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

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

ประสบการณ์การใช้งาน NFC ที่ราบรื่นยิ่งขึ้น

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

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

บทบาทใน Wallet

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

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

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

ความปลอดภัย

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

ผสานรวมเครื่องมือจัดการข้อมูลเข้าสู่ระบบกับการป้อนข้อความอัตโนมัติ

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

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

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

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

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

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

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

Android 15 เปิดตัวชุด API ที่ดำเนินการตรวจสอบสิทธิ์ใน URI ของเนื้อหา ดังนี้

  • Context.checkContentUriPermissionFull: การดำเนินการนี้จะตรวจสอบสิทธิ์อย่างเต็มรูปแบบใน URI เนื้อหา
  • Activity แอตทริบิวต์ไฟล์ Manifest requireContentUriPermissionFromCaller: บังคับใช้สิทธิ์ที่ระบุใน URI ของเนื้อหาที่ระบุเมื่อเปิดใช้งานกิจกรรม
  • คลาส ComponentCaller สําหรับผู้เรียก Activity: แสดงแอปที่เปิดใช้งานกิจกรรม

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

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

Better Braille

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

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

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

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

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

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

อักขระและรูปแบบข้อความสำหรับเฮนไตงานาภาษาญี่ปุ่น แบบอักษร

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

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

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