Android 15에는 개발자를 위한 훌륭한 기능과 API가 도입되었습니다. 다음 섹션에서는 관련 API를 시작하는 데 도움이 되도록 이러한 기능을 요약합니다.
추가된 API, 수정된 API, 삭제된 API에 관한 자세한 목록은 API 차이점 보고서를 참고하세요. 추가된 API에 관한 자세한 내용은 Android API 참조를 참고하세요. Android 15의 경우 API 수준 35에 추가된 API를 찾아보세요. 플랫폼 변경이 앱에 영향을 줄 수 있는 분야에 관해 알아보려면 Android 15를 타겟팅하는 앱 및 모든 앱의 Android 15 동작 변경사항을 확인하세요.
카메라 및 미디어
Android 15에는 카메라 및 미디어 환경을 개선하고 크리에이터가 Android에서 자신의 비전을 실현할 수 있도록 지원하는 도구와 하드웨어에 액세스할 수 있는 다양한 기능이 포함되어 있습니다.
Android 미디어 및 카메라의 최신 기능과 개발자 솔루션에 관한 자세한 내용은 Google I/O의 현대적인 Android 미디어 및 카메라 환경 빌드 강연을 참고하세요.
저조도 화면 밝기
Android 15 引入了低光增强,这是一种新的自动曝光模式,可供 Camera 2 和夜间模式相机扩展使用。“低光增强”功能可调整预览视频流在弱光条件下的曝光量。这与夜间模式相机扩展程序创建静态图片的方式不同,因为夜间模式会组合多张照片来制作单张增强图片。虽然夜间模式非常适合创建静态图片,但无法创建连续的帧流,但“低光增强”可以。因此,“低光增强”可以实现新的相机功能,例如:
- 提供增强的图片预览,以便用户更好地为弱光环境取景
- 在光线昏暗的环境下扫描二维码
如果您启用“弱光增强”,它会在光线较暗时自动开启,在光线较暗时关闭。
应用可以在光线昏暗的环境下录制预览流,以保存明亮的视频。
有关详情,请参阅弱光增强。
인앱 카메라 컨트롤
Android 15에서는 지원되는 기기에서 카메라 하드웨어 및 알고리즘을 더 효과적으로 제어하기 위한 새 확장 프로그램을 추가합니다.
HDR 헤드룸 제어
Android 15 会选择适合底层设备功能和面板的位深的 HDR 余量。对于包含大量 SDR 内容的页面(例如显示单个 HDR 缩略图的即时通讯应用),此行为最终可能会对 SDR 内容的感知亮度产生不利影响。Android 15 允许您使用 setDesiredHdrHeadroom
控制 HDR 余量,以在 SDR 和 HDR 内容之间取得平衡。
라우드니스 제어
Android 15에서는 CTA-2075 음량 표준을 오디오 음량 불일치를 피하고 사용자가 콘텐츠 전환 시 볼륨 조정 이 시스템은 AAC 오디오 콘텐츠에서 사용할 수 있는 소리 크기 메타데이터와 함께 출력 장치(헤드폰 및 스피커)의 알려진 특성을 활용하여 오디오 소리 크기와 다이내믹 레인지 압축 수준을 지능적으로 조정합니다.
이 기능을 사용 설정하려면 AAC 콘텐츠에서 음량 메타데이터를 사용할 수 있는지 확인하고 앱에서 플랫폼 기능을 사용 설정해야 합니다. 이렇게 하려면 연결된 AudioTrack
의 오디오 세션 ID를 사용하여 create 팩토리 메서드를 호출하여 LoudnessCodecController
객체를 인스턴스화합니다. 그러면 오디오 업데이트가 자동으로 적용됩니다. OnLoudnessCodecUpdateListener
를 전달하여 볼륨 매개변수가 MediaCodec
에 적용되기 전에 수정하거나 필터링할 수 있습니다.
// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = …
val audioTrack = AudioTrack.Builder()
.setSessionId(sessionId)
.build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
val lcController = LoudnessCodecController.create(mSessionId)
// Starts applying audio updates for each added MediaCodec
}
AndroidX media3 ExoPlayer도
원활한 앱 통합을 위한 LoudnessCodecController
API
가상 MIDI 2.0 기기
Android 13에는 USB를 사용하는 MIDI 2.0 기기: USB를 사용하여 통신합니다. 범용 MIDI 패킷 (UMP): Android 15에서는 UMP 지원을 가상 MIDI 앱으로 확장하여 작곡 앱이 USB MIDI 2.0 기기에서와 마찬가지로 가상 MIDI 2.0 기기로 신디사이저 앱을 제어할 수 있도록 합니다.
더 효율적인 AV1 소프트웨어 디코딩
이제 VideoLAN의 인기 있는 AV1 소프트웨어 디코더인 dav1d를 하드웨어에서 AV1 디코딩을 지원하지 않는 Android 기기에서 사용할 수 있습니다. dav1d는 기존 AV1 소프트웨어 디코더보다 성능이 최대 3배 더 우수하므로 일부 저성능 및 중간 등급 기기를 포함한 더 많은 사용자가 HD AV1을 재생할 수 있습니다.
지금은 앱에서 "c2.android.av1-dav1d.decoder"
라는 이름으로 dav1d를 호출하여 dav1d를 사용하도록 선택해야 합니다. 이후 업데이트에서 dav1d가 기본 AV1 소프트웨어 디코더가 됩니다. 이 지원은 표준화되어 Google Play 시스템 업데이트를 수신하는 Android 11 기기로 백포팅됩니다.
개발자 생산성 및 도구
생산성 향상을 위한 Google의 노력은 대부분 Android 스튜디오, Jetpack Compose, Android Jetpack 라이브러리와 같은 도구에 집중되어 있지만, Google은 항상 개발자의 비전을 더 쉽게 실현할 수 있도록 플랫폼에서 방법을 모색하고 있습니다.
OpenJDK 17 업데이트
Android 15에서는 최신 OpenJDK LTS 출시의 기능에 맞게 Android의 핵심 라이브러리를 새로고침하는 작업을 계속합니다.
다음과 같은 주요 기능과 개선사항이 포함됩니다.
- NIO 버퍼 관련 수명 개선
- 스트림
- 추가
math
및strictmath
메서드 - 시퀀싱된
collection
,map
,set
를 포함한util
패키지 업데이트 Deflater
에서ByteBuffer
지원- 보안 업데이트(예:
X500PrivateCredential
및 보안 키 업데이트)
이러한 API는 Google Play 시스템 업데이트를 통해 Android 12 (API 수준 31) 이상을 실행하는 10억 대 이상의 기기에서 업데이트되므로 개발자는 최신 프로그래밍 기능을 타겟팅할 수 있습니다.
PDF 개선사항
Android 15에서는 PdfRenderer
API가 크게 개선되었습니다. 앱에는 렌더링과 같은 고급 기능을
비밀번호로 보호된 파일, 주석, 양식 수정,
검색, 선택(사본 포함) 선형화된 PDF
로컬 PDF 보기의 속도를 높이고 리소스 사용을 줄이기 위해 최적화가 지원됩니다.
Jetpack PDF 라이브러리는 이러한 API를 사용하여 PDF 추가를 간소화합니다.
앱에 추가할 수 있습니다.
PdfRenderer
를 Google을 사용하여 업데이트할 수 있는 모듈로 이동했습니다.
플랫폼 출시와는 별개인 Play 시스템 업데이트(Google에서는
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 创建的 Typeface
不包含
为 350、450、550 和 650 创建准确的字体粗细
Font
实例,因此渲染程序会回退到最接近的权重。在
在此示例中,系统会渲染 300 而不是 350,渲染 400 而不是 450,
依此类推。相比之下,使用新 API 创建的 Typeface
会动态创建
给定权重的 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>
반대로 이 문자열 리소스에는 'Pixel 8 Pro'라는 문구를 래핑하고 줄바꿈을 방지하는 <nobreak>
태그가 포함되어 있습니다.
<resources>
<string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>
이러한 문자열이 렌더링되는 방식의 차이는 다음 이미지에 나와 있습니다.
앱 보관처리
Android 및 Google Play는 작년에 앱 보관 지원을 발표하여 사용자가 Google Play에서 Android App Bundle을 사용하여 게시된 기기에서 자주 사용하지 않는 앱을 부분적으로 삭제하여 공간을 확보할 수 있도록 했습니다. Android 15에는 앱 보관처리를 위한 OS 수준 지원이 포함되어 있습니다. 모든 앱 스토어에서 이를 더 쉽게 구현할 수 있습니다.
REQUEST_DELETE_PACKAGES
권한이 있는 앱은 PackageInstaller
requestArchive
메서드를 호출하여 설치된 앱 패키지 보관처리를 요청할 수 있습니다. 이 경우 APK와 캐시된 파일이 삭제되지만 사용자 데이터는 유지됩니다. 보관처리된 앱은 LauncherApps
API를 통해 표시 가능한 앱으로 반환됩니다. 사용자에게는 이러한 앱이 보관처리되었음을 강조하는 UI 처리가 표시됩니다. 사용자가 보관처리된 앱을 탭하면 해당 설치 프로그램은
보관 취소 요청을 받게 되며, 복원 프로세스는
ACTION_PACKAGE_ADDED
브로드캐스트에서 모니터링됩니다.
그래픽
Android 15에서는 ANGLE 및 캔버스 그래픽 시스템에 추가된 기능을 비롯한 최신 그래픽 개선사항을 제공합니다.
Android의 GPU 액세스 현대화
从早期开始,核心操作系统在单个 CPU 上运行,GPU 通过基于固定函数流水线的 API 进行访问,Android 硬件已经发生了很大变化。从 Android 7.0(API 级别 24)开始,NDK 中就已提供 Vulkan® 图形 API。它采用较低级别的抽象,可以更好地反映现代 GPU 硬件,能够更好地进行扩展以支持多个 CPU 核心,并可减少 CPU 驱动程序开销,从而提升应用性能。所有现代游戏引擎都支持 Vulkan。
Vulkan 是 Android 的 GPU 首选接口。因此,Android 15 包含 ANGLE 作为可选层,用于在 Vulkan 上运行 OpenGL® ES。迁移到 ANGLE 会将 Android OpenGL 实现标准化,以提高兼容性,在某些情况下还可提升性能。您可以使用 ANGLE 测试 OpenGL ES 应用的稳定性和性能,方法是在 Android 15 上依次点击设置 -> 系统 -> 开发者选项 -> 实验性功能:启用 ANGLE,启用开发者选项。
Vulkan 上的 Android ANGLE 路线图
作为简化 GPU 堆栈的一部分,今后我们将在更多新设备上以 GL 系统驱动程序的形式提供 ANGLE,预计未来将只能通过 ANGLE 使用 OpenGL/ES。不过,我们计划在所有设备上继续支持 OpenGL ES。
建议的后续措施
使用开发者选项选择适用于 OpenGL ES 的 ANGLE 驱动程序并测试您的应用。对于新项目,我们强烈建议您使用适用于 C/C++ 的 Vulkan。
캔버스 개선사항
Android 15에서는 새로운 기능을 통해 Android 캔버스 그래픽 시스템을 현대화하고 있습니다.
Matrix44
는 3D에서 캔버스를 조작하려고 할 때 사용해야 하는 좌표 변환을 위한 4x4 행렬을 제공합니다.clipShader
는 현재 클립을 지정된 셰이더와 교차하는 반면clipOutShader
는 클립을 현재 클립과 셰이더의 차이로 설정하여 각각 셰이더를 알파 마스크로 처리합니다. 이를 통해 복잡한 도형을 효율적으로 그릴 수 있습니다.
성능 및 배터리
Android는 앱의 성능과 품질을 개선하는 데 계속 집중하고 있습니다. Android 15에서는 앱의 작업을 더 효율적으로 실행하고, 앱 성능을 최적화하고, 앱에 관한 통계를 수집하는 데 도움이 되는 API를 도입합니다.
배터리 효율 권장사항, 네트워크 및 전원 사용량 디버깅, Android 15 및 최신 버전의 Android에서 배경 작업의 배터리 효율을 개선하는 방법에 관한 자세한 내용은 Google I/O의 Android에서 배경 작업의 배터리 효율 개선 강연을 참고하세요.
ApplicationStartInfo API
이전 버전의 Android에서 앱 시작은 다소 미스터리였습니다. 앱이 콜드, 웜, 핫 상태에서 시작되었는지 확인하기가 어려웠습니다. 프로세스 포크, onCreate
호출, 첫 번째 프레임 그리기 등 다양한 실행 단계에서 앱이 소요된 시간을 파악하기도 어려웠습니다. Application
클래스가 인스턴스화될 때 앱이 브로드캐스트, 콘텐츠 제공업체, 작업, 백업, 부팅 완료, 알람 또는 Activity
에서 시작되었는지 알 방법이 없었습니다.
Android 15의 ApplicationStartInfo
API는 이 모든 작업과 그 이상을 제공합니다. 자체 타임스탬프를 흐름에 추가하여 타이밍 데이터를 한곳에서 수집할 수도 있습니다. 측정항목을 수집하는 것 외에도 ApplicationStartInfo
를 사용하여 앱 시작을 직접 최적화할 수 있습니다. 예를 들어 앱이 브로드캐스트로 인해 시작될 때 Application
클래스 내에서 UI 관련 라이브러리의 비용이 많이 드는 인스턴스화를 제거할 수 있습니다.
자세한 앱 크기 정보
Android 8.0(API 수준 26)부터 Android에는 APK 크기, APK에서 추출한 파일 크기, 기기에서 생성된 파일(예: AOT(Ahead-Of-Time) 컴파일 코드)의 합계인 단일 바이트 수로 앱 설치 크기를 요약하는 StorageStats.getAppBytes
API가 포함되었습니다. 이 수치는 앱이 저장용량을 사용하는 방식과 관련하여 중요한 역할을 하지 않습니다.
Android 15에는 APK 파일 분할, AOT 및 속도 향상 관련 코드, dex 메타데이터, 라이브러리, 가이드 프로필 등 앱이 공간을 어떻게 사용하고 있는지 파악할 수 있는 StorageStats.getAppBytesByDataType([type])
API가 추가되었습니다.
앱 관리 프로파일링
Android 15 包含 ProfilingManager
类,可让您从应用内部收集性能分析信息,例如堆转储、堆分析报告、堆栈采样等。它使用提供的标记为您的应用提供回调,以标识输出文件,该文件将传递给应用的文件目录。该 API 会进行速率限制,以尽可能降低对性能的影响。
为了简化在应用中构建性能分析请求的过程,我们建议您使用 Core 1.15.0-rc01 或更高版本中的相应 Profiling
AndroidX API。
SQLite 데이터베이스 개선
Android 15 引入了 SQLite API,这些 API 可公开底层 SQLite 引擎的高级功能,以解决可能在应用中出现的特定性能问题。将 SQLite 更新到版本 3.44.3。
开发者应参阅 SQLite 性能最佳实践 以便充分利用其 SQLite 数据库,尤其是在处理大型 或运行对延迟敏感的查询时
- 只读延迟事务:在发出
只读(不包括写入语句),请使用
beginTransactionReadOnly()
和beginTransactionWithListenerReadOnly(SQLiteTransactionListener)
发出只读的DEFERRED
事务。此类事务 如果数据库处于 WAL 模式 与IMMEDIATE
或EXCLUSIVE
事务并发运行。 - 行数和 ID:添加了 API 以检索已更改的行数和 ID
行或最后插入的行 ID 而不发出额外的查询。
getLastChangedRowCount()
会返回当前事务中最近的 SQL 语句插入、更新或删除的行数,而getTotalChangedRowCount()
会返回当前连接的计数。getLastInsertRowId()
返回最后一行的rowid
以便在当前连接中插入 - 原始语句:发出原始 SQlite 语句,从而绕过便利 及其可能产生的任何额外处理开销。
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 通过 UriRelativeFilterGroup
支持更精确的 Intent
解析,UriRelativeFilterGroup
包含一组 UriRelativeFilter
对象,这些对象构成一组必须满足的 Intent
匹配规则,包括网址查询参数、网址片段以及屏蔽或排除规则。
您可以在 AndroidManifest
XML 文件中使用 <uri-relative-filter-group>
标记来定义这些规则,该标记可以包含 android:allow
标记。这些代码可以包含使用现有数据代码属性以及 android:query
和 android:fragment
属性的 <data>
代码。
下面是一个 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>
비공개 스페이스
私密空间可让用户在设备上创建单独的空间 保护敏感应用免遭窥探, 身份验证。私密空间使用单独的用户个人资料。用户可以 选择为私密空间使用设备锁定或单独的锁定因素。
私密空间中的应用显示在启动器中的单独容器中,并且 不会显示在“最近用过”视图、通知、设置和其他应用中 在私密空间处于锁定状态时显示通知用户生成的内容(例如 媒体或文件),而账号会在私密空间和 主空间系统 Sharesheet 和 照片选择器:用于授权应用访问内容
用户无法将现有应用及其数据移至私密空间。相反, 用户在私密空间中选择安装选项,以便使用 无论他们喜欢哪家应用商店私密空间中的应用会以下列身份安装: 来自主空间中任何应用的单独副本(同一应用的新副本)。
当用户锁定私密空间后,系统会停用相应个人资料。而配置文件 已停止,私密空间中的应用不再有效,无法执行 前台或后台 activity,包括显示通知。
我们建议您使用私密空间测试您的应用,以确保您的应用 按预期运行,尤其是当应用属于以下某种情况时 类别:
- 具有工作资料逻辑的应用(假定任何 不在主资料中的已安装应用副本 工作资料。
- 医疗应用
- 启动器应用
- 应用商店中的应用
선택한 사진 액세스에 대한 최근 사용자 선택 쿼리
现在,如果应用获得了部分访问权限,则只能突出显示最近选择的照片和视频。此功能可以改善频繁请求访问照片和视频的应用的用户体验。如需在应用中使用此功能,请在通过 ContentResolver
查询 MediaStore
时启用 QUERY_ARG_LATEST_SELECTION_ONLY
参数。
Kotlin
val externalContentUri = MediaStore.Files.getContentUri("external") val mediaColumns = arrayOf( FileColumns._ID, FileColumns.DISPLAY_NAME, FileColumns.MIME_TYPE, ) val queryArgs = bundleOf( // Return only items from the last selection (selected photos access) QUERY_ARG_LATEST_SELECTION_ONLY to true, // Sort returned items chronologically based on when they were added to the device's storage QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC", QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?", QUERY_ARG_SQL_SELECTION_ARGS to arrayOf( FileColumns.MEDIA_TYPE_IMAGE.toString(), FileColumns.MEDIA_TYPE_VIDEO.toString() ) )
Java
Uri externalContentUri = MediaStore.Files.getContentUri("external"); String[] mediaColumns = { FileColumns._ID, FileColumns.DISPLAY_NAME, FileColumns.MIME_TYPE }; Bundle queryArgs = new Bundle(); queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true); queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC"); queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?"); queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] { String.valueOf(FileColumns.MEDIA_TYPE_IMAGE), String.valueOf(FileColumns.MEDIA_TYPE_VIDEO) });
Android의 개인 정보 보호 샌드박스
Android 15에는 최신 버전의 Android의 개인 정보 보호 샌드박스가 통합된 최신 Android 광고 서비스 확장 프로그램이 포함되어 있습니다. 이러한 추가 조치는 사용자 개인 정보 보호를 개선하고 모바일 앱에 효과적인 개인 맞춤 광고 경험을 지원하는 새로운 기술을 개발하려는 노력의 일환입니다. 개인 정보 보호 샌드박스 페이지에서 시작하는 데 도움이 되는 Android의 개인 정보 보호 샌드박스 개발자 프리뷰 및 베타 프로그램에 관한 자세한 정보를 확인할 수 있습니다.
헬스 커넥트
Android 15는 앱에서 수집한 건강/피트니스 데이터를 관리하고 공유하는 안전하고 중앙 집중식 플랫폼인 Android용 헬스 커넥트를 중심으로 최신 확장 프로그램을 통합합니다. 이번 업데이트에서는 피트니스, 영양, 피부 온도, 훈련 계획 등에서 추가 데이터 유형을 지원합니다.
피부 온도 측정으로 보다 정확하게 저장하고 공유할 수 있음 웨어러블 또는 기타 추적 장치의 온도 데이터.
트레이닝 계획은 사용자가 피트니스 목표를 달성할 수 있도록 도와주는 구조화된 운동 계획입니다. 트레이닝 계획 지원에는 다양한 완료 및 실적 목표가 포함됩니다.
- 칼로리 소모량과 같은 달성 목표 distance, duration 반복, 단계입니다.
- 다음과 같은 실적 목표 최대한 많이 반복하기 (AMRAP), 케이던스, 심박수, 파워, 운동 인지 속도 및 속도.
Android에서 헬스 커넥트의 최신 업데이트에 관해 자세히 알아보려면 Android로 적응형 환경 구축 Health 강연을 확인해 보세요.
앱 화면 공유
Android 15에서는 앱 화면 공유를 지원하므로 사용자가 전체 기기 화면이 아닌 앱 창만 공유하거나 녹화할 수 있습니다. Android 14 QPR2에서 처음 사용 설정된 이 기능에는 앱에서 앱 화면 공유 환경을 맞춤설정할 수 있는 MediaProjection
콜백이 포함되어 있습니다. Android 14 (API 수준 34) 이상을 타겟팅하는 앱의 경우 각 MediaProjection
캡처 세션에 사용자 동의가 필요합니다.
사용자 환경 및 시스템 UI
Android 15에서는 앱 개발자와 사용자가 필요에 맞게 기기를 구성할 수 있는 제어력과 유연성을 높일 수 있습니다.
Android 15의 최신 개선사항을 사용하여 앱의 사용자 환경을 개선하는 방법을 자세히 알아보려면 Google I/O의 Android 앱의 사용자 환경 개선 강연을 참고하세요.
Generated Previews API를 통한 더 풍부한 위젯 미리보기
Android 15 이전에는 위젯 선택 도구 미리보기를 제공하는 유일한 방법은 정적 이미지 또는 레이아웃 리소스. 이러한 미리보기는 홈 화면에 배치된 실제 위젯의 모양과 크게 다를 수 있습니다. 또한 Jetpack Glance로는 정적 리소스를 만들 수 없으므로 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)
)
예상되는 흐름은 다음과 같습니다.
- 위젯 제공업체는 언제든지
setWidgetPreview
를 호출합니다. 제공된 미리보기는 다른 제공업체 정보와 함께AppWidgetService
에 유지됩니다. setWidgetPreview
는AppWidgetHost.onProvidersChanged
콜백을 통해 호스트에게 업데이트된 미리보기를 알립니다. 이에 따라 위젯 호스트는 모든 제공업체 정보를 새로고침합니다.- 위젯 미리보기를 표시할 때 호스트는 다음을 확인합니다.
AppWidgetProviderInfo.generatedPreviewCategories
및 선택한 사용 가능한 경우,AppWidgetManager.getWidgetPreview
를 호출하여 다음을 수행합니다. 이 공급자에 대해 저장된 미리보기를 반환합니다.
setWidgetPreview
호출 시점
미리보기를 제공하는 콜백이 없으므로 앱은 실행 중인 시점 중 언제든지 미리보기를 전송하도록 선택할 수 있습니다. 미리보기를 업데이트하는 빈도는 위젯의 사용 사례에 따라 다릅니다.
다음 목록에서는 미리보기 사용 사례의 두 가지 주요 카테고리를 설명합니다.
- 위젯 미리보기에 실제 데이터(예: 맞춤설정된 데이터)를 표시하는 제공업체 최신 정보를 얻을 수 있습니다. 이러한 제공업체는 사용자가 로그인했거나 앱에서 초기 구성을 완료한 사용자 그런 다음 주기적인 작업을 설정하여 선택한 주기로 미리보기를 업데이트할 수 있습니다. 이러한 위젯 유형의 예로는 사진, 캘린더, 날씨, 뉴스 등이 있습니다. 위젯에 추가합니다.
- 미리보기 또는 빠른 작업 위젯에 정적 정보를 표시하는 제공자 데이터를 표시할 수 있습니다. 이러한 제공자는 있습니다. 이러한 위젯 유형의 예로는 작업 위젯이나 Chrome 바로가기 위젯을 사용할 수 있습니다.
일부 제공업체는 허브 모드 선택 도구에는 정적 미리보기를 표시하지만 홈 화면 선택 도구에는 실제 정보를 표시할 수 있습니다. 이러한 제공업체는 미리보기를 설정하기 위해 두 가지 사용 사례에 관한 안내를 모두 따라야 합니다.
PIP 모드
Android 15 对画中画 (PiP) 模式进行了更改,确保在进入画中画模式时实现更流畅的转换。对于在主界面上叠加界面元素的应用,这将非常有用,因为这些元素会进入 PiP。
开发者使用 onPictureInPictureModeChanged
回调来定义用于切换叠加界面元素可见性的逻辑。当 PiP 进入或退出动画完成时,系统会触发此回调。从 Android 15 开始,PictureInPictureUiState
类包含另一种状态。
在这种界面状态下,以 Android 15(API 级别 35)为目标平台的应用会在画中画动画开始后立即观察到使用 isTransitioningToPip()
调用的 Activity#onPictureInPictureUiStateChanged
回调。在 PiP 模式下,许多界面元素与应用无关,例如包含建议、即将播放的视频、评分和标题等信息的视图或布局。当应用进入画中画模式时,请使用 onPictureInPictureUiStateChanged
回调隐藏这些界面元素。当应用从画中画窗口进入全屏模式时,请使用 onPictureInPictureModeChanged
回调取消隐藏这些元素,如以下示例所示:
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// Hide UI elements
}
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
if (isInPictureInPictureMode) {
// Unhide UI elements
}
}
不相关界面元素(适用于画中画窗口)的这种快速可见性切换有助于确保画中画进入动画更流畅、不闪烁。
방해 금지 모드 규칙 개선
AutomaticZenRule
를 사용하면 앱에서 Attention(관심 유도)을 맞춤설정할 수 있습니다.
관리 (방해 금지 모드) 규칙 및 활성화 또는 비활성화 시점 결정
있습니다. Android 15에서는 사용자 환경을 개선하기 위해 이러한 규칙을 대폭 개선했습니다. 다음과 같은 개선사항이 포함됩니다.
AutomaticZenRule
에 유형 추가(시스템에서 특수 항목 적용 가능) 일부 규칙이 적용되지 않습니다AutomaticZenRule
에 아이콘을 추가하여 모드를 더 쉽게 인식할 수 있도록 했습니다.AutomaticZenRule
에 다음을 설명하는triggerDescription
문자열 추가 사용자에게 규칙이 활성화되기 위한 조건입니다.- 추가됨
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 的会议 应用和使用 Material 3 构建界面 自适应库 我们的文档中提供了更多帮助信息,帮助您针对大型语言 。
커버 화면 지원
앱은 Android 15에서 지원되는 플립형 기기의 작은 커버 화면에 Application
또는 Activity
가 표시되도록 하는 데 사용하는 속성을 선언할 수 있습니다. 이러한 화면은 Android 앱을 실행하기에 호환되는 타겟으로 간주하기에는 너무 작지만 앱이 이를 지원하도록 선택하여 더 많은 위치에서 앱을 사용할 수 있습니다.
연결
Android 15는 앱이 통신 및 무선 기술의 최신 발전사항에 액세스할 수 있도록 플랫폼을 업데이트합니다.
위성 지원
Android 15 继续扩大对卫星连接的平台支持,并包含一些界面元素,以确保在整个卫星连接环境中提供一致的用户体验。
应用可以使用 ServiceState.isUsingNonTerrestrialNetwork()
执行以下操作:
检测设备是否连接到卫星,让他们更清楚地了解
可能会导致完全网络服务不可用的原因此外,Android 15 支持短信和彩信应用以及预加载的 RCS 应用,以便使用卫星连接发送和接收消息。
더 원활한 NFC 환경
Android 15 致力于打造更顺畅、更可靠的感应式付款体验,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter
进入观察模式。在该模式下,设备会监听 NFC 读取器但不会响应 NFC 读取器,从而将应用的 NFC 服务 PollingFrame
对象发送给系统进行处理。PollingFrame
对象可用于在与 NFC 读取器首次通信之前进行身份验证,以便在许多情况下实现一键交易。
此外,应用现在可以在受支持的设备上注册过滤器,以便接收轮询循环 activity 的通知,从而与多个 NFC 感知应用顺畅运行。
월렛 역할
Android 15 引入了一个新的钱包角色,可让您与用户首选的钱包应用更紧密地集成。此角色取代了 NFC 默认的感应式付款设置。用户可以通过导航到设置 > 应用 > 默认应用来管理 Google 钱包角色持有者。
在为付款类别中注册的 AID 路由 NFC 触碰时,可使用“钱包”角色。除非已在前台运行为同一 AID 注册的另一个应用,否则点按操作会始终转到钱包角色持有者。
此角色还可用于确定钱包“快速访问”功能块在启用后应转到的位置。当角色设置为“无”时,“快速访问”功能块不可用,并且付款类别 NFC 触碰仅会传送到前台应用。
보안
Android 15를 사용하면 앱의 보안을 강화하고 앱의 데이터를 보호할 수 있으며 사용자에게 데이터에 대한 투명성과 제어 기능을 제공할 수 있습니다. Google I/O의 Android에서 사용자 보안 보호 강연에서 사용자 보호 장치를 개선하고 새로운 위협으로부터 앱을 보호하기 위해 Google에서 어떤 노력을 하고 있는지 자세히 알아보세요.
인증 관리자와 자동 완성 통합
Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.
원탭 가입 및 로그인을 생체 인식 메시지와 통합
인증 관리자는 생체 인식 메시지를 사용자 인증 정보 생성에 통합 및 로그인 프로세스로 이루어져 있으므로 제공업체가 생체 인식 프롬프트 따라서 사용자 인증 정보 제공업체는 생성 및 가져오기 흐름의 결과를 제공하며, 생체 인식 흐름 결과로 보강됩니다. 이 간소화된 프로세스로 더 효율적이고 간소화된 사용자 인증 정보를 만들 수 있습니다. 생성 및 검색 프로세스가 포함됩니다.
엔드 투 엔드 암호화를 위한 키 관리
Android 15에 암호화 공개 키 저장을 위한 OS 수준 API를 제공하여 Android 앱의 엔드 투 엔드 암호화 (E2EE)를 용이하게 하는 E2eeContactKeysManager
가 도입되었습니다.
E2eeContactKeysManager
는 플랫폼 연락처 앱과 통합되도록 설계되어 사용자에게 연락처의 공개 키를 중앙에서 관리하고 확인하는 방법을 제공합니다.
콘텐츠 URI의 권한 확인
Android 15 引入了一组可对内容 URI 执行权限检查的新 API:
Context.checkContentUriPermissionFull
:这会对内容 URI 执行完整的权限检查。Activity
清单属性requireContentUriPermissionFromCaller
:这会在 activity 启动时,对提供的内容 URI 强制执行指定权限。Activity
调用方的ComponentCaller
类:这表示启动 activity 的应用。
접근성
Android 15에는 사용자의 접근성을 개선하는 기능이 추가되었습니다.
향상된 점자
Android 15에서는 TalkBack이 USB 및 보안 블루투스를 통해 HID 표준을 사용하는 점자 디스플레이를 지원할 수 있도록 했습니다.
마우스 및 키보드에서 사용하는 것과 매우 유사한 이 표준은 Android가 시간이 지남에 따라 더 다양한 점자 디스플레이를 지원하는 데 도움이 될 것입니다.
다국어 지원
Android 15에서는 기기가 여러 언어로 사용될 때 사용자 환경을 보완하는 기능이 추가되었습니다.
CJK 가변 글꼴
Android 15부터 한국어, 중국어, 일본어, 한국어 (CJK) 언어의 글꼴 파일 NotoSansCJK가 가변 글꼴로 변경됩니다. 가변 글꼴은 CJK 언어의 창의적인 서체를 위한 새로운 가능성을 열어줍니다. 디자이너는 더 광범위한 스타일을 탐색하고 이전에는 달성하기 어렵거나 불가능했던 시각적으로 눈에 띄는 레이아웃을 만들 수 있습니다.
문자 간 정렬
Android 15부터
JUSTIFICATION_MODE_INTER_CHARACTER
사용 이전 단어 간 사유(이전):
Android 8.0 (API 수준 26)에서 처음 도입되었으며
근거는 특정 API를 사용하는 언어에 유사한 기능을
중국어, 일본어 등 분할을 위한 공백 문자
자동 줄바꿈 구성
Android 从以下语言开始支持基于短语的日语和韩语换行:
Android 13(API 级别 33)。不过,虽然基于短语的行分隔符可以提高短文本行的可读性,但对于长文本行,效果并不理想。在 Android 15 中,应用只能使用 LINE_BREAK_WORD_STYLE_AUTO
选项,针对短文本行应用基于短语的行分隔符。此选项会为文本选择最佳字词样式选项。
对于短文本行,则使用基于短语的换行符,功能相同
为 LINE_BREAK_WORD_STYLE_PHRASE
,如
以下图片:
对于较长的文本行,LINE_BREAK_WORD_STYLE_AUTO
会使用 no
换行字词样式,
LINE_BREAK_WORD_STYLE_NONE
,如
以下图片:
추가 일본어 헤타이가나 글꼴
Android 15의 오래된 일본어 히라가나 (헨타이가나) 글꼴 파일 기본적으로 번들로 묶여 있습니다. 독특한 모양의 헨타이가나 캐릭터는 예술 작품이나 디자인에 독특한 감각을 더하는 동시에 전송 및 이해에 대해 살펴봤습니다.
VideoLAN cone Copyright (c) 1996~2010 VideoLAN. 누구나 VideoLAN 프로젝트 또는 VideoLAN팀에서 개발한 제품을 언급하기 위해 이 로고 또는 수정된 버전을 사용하거나 수정할 수 있지만 프로젝트가 보증한다는 의미는 아닙니다.
Vulkan 및 Vulkan 로고는 Khronos Group Inc.의 등록 상표입니다.
OpenGL은 등록 상표이며 OpenGL ES 로고는 Khronos의 허가 하에 사용한 Hewlett Packard Enterprise의 상표입니다.