前言:
android14快要来了,最近2月8日,android14的第一个开发者预览版发布了,正式版大约会和往常一样,大概率在六月份左右推出,八九月份时会有国内会有第一批手机支持安卓14。所以,本文就带你来了解一下安卓14的变化吧。
本文主要介绍以下内容:
1.谷歌官方英文文档翻译。
2.挑重点讲解android14的变化对开发者的影响。
一.android14开发者预览介绍
以下介绍主要来源于谷歌对英文文档的翻译,部分内容翻译不准确的,作者手动帮忙改掉了。
官方文档地址:
https://android-developers.googleblog.com/2023/02/first-developer-preview-android14.html
1.Android14的第一个开发者预览版
Android14的第一个开发者预览版
2023年2月8日
发布者:工程副总裁DaveBurke
为数十亿Android用户提供良好的服务,需要我们/Android硬件制造商以及安卓社区之间通力协作。
今天,我们发布了Android14的第一个开发者预览版,您在这些预览版中的反馈,是让Android更好地服务于所有人的关键。Android14继续致力于提高开发人员的工作效率,同时增强性能、隐私、安全性和用户自定义。此预览只是一个开始,随着发布周期的推进,我们将分享更多内容。
Android全年不断增强功能和提供新特性,您在Android14开发者预览版和季度平台发布(QPR)测试版计划的反馈,会帮助Android在不断改进方面发挥着关键作用。Android14开发者网站提供了更多关于预览版的信息,包括Pixel的下载和发布时间表。我们期待听到您的想法,并提前感谢您一直以来的帮助,使Android成为适合所有人的平台。
2.跨设备和外形规格方面的工作
Android14建立在Android12L和13中支持平板电脑和可折叠外形的基础之上。为了帮助您构建适应不同屏幕尺寸的应用程序,我们创建了窗口大小类、滑动窗格布局、Activity嵌入和带约束的盒子等,所有这些功能都在JetpackCompose中受支持。对于每个版本,我们的目标是让您更轻松地在所有Android平台上优化您的应用程序。
为了帮助简化您的应用程序准备工作,我们更新了针对大屏幕的应用程序质量指南,并提供了有关构建大屏幕和可折叠设备的更多学习机会。大屏幕画廊包含经过验证的设计模式以及围绕您的应用程序支持的市场的设计灵感,例如社交和通信、媒体、生产力、购物和阅读应用程序。
多设备体验是Android未来的重要组成部分。您今天就可以开始使用跨设备SDK的预览版,让您能够有丰富的体验,这些体验可以直观地跨不同的设备和外形规格工作,而且还会有更多。
简化后台工作
Android14继续努力优化应用程序协同工作的方式,改善系统健康状况和电池寿命,并改善最终用户体验。
JobScheduler和前台服务的更新和添加
执行一些后台工作比必要的工作更复杂,例如在WiFi可用时下载大文件。我们正在为这项工作创建一个标准路径,以简化您的应用程序开发并可能改善用户体验。我们也明确了前台服务的使用范围,只为最高优先级的面向用户的任务保留它们,以便Android可以改善资源消耗和电池寿命。
在Android14中,我们正在对现有的AndroidAPI(前台服务和JobScheduler)进行更改,包括为用户启动的数据传输添加新功能,以及声明前台服务类型的更新要求。用户启动的数据传输作业将使管理用户启动的下载和上传更加容易,特别是当它们需要限制时,例如仅在Wi-Fi上下载。声明前台服务类型的要求允许您清楚地定义应用程序后台工作的意图,同时明确哪些用例适合前台服务。此外,GooglePlay将推出新政策以确保正确使用这些API,更多细节即将推出。
优化广播
我们对内部广播系统进行了多项优化,以提高电池寿命和响应速度。虽然大多数优化是Android内部的,不会影响您的应用程序,但我们已经调整了应用程序进入缓存状态后接收Context注册广播的方式。对上下文注册的接收者的广播可能会排队,并且只有在它脱离缓存状态后才会传递给应用程序。此外,一些重复的上下文注册广播,例如BATTERY_CHANGED,一旦应用程序脱离缓存状态,可能会在交付之前合并为一个最终广播。
精确的Alarms
调用精确的Alarms会显著影响设备的资源,例如电池寿命。因此在Android14中,新安装的针对Android13+(SDK33+)的非时钟或日历应用必须请求用户授予它们SCHEDULE_EXACT_ALARM特殊权限,然后才能设置精准的Alarms。应用程序可以通过意图切换此权限将用户引导至设置页面,如果可能的话我们鼓励您评估您的用例并选择更灵活的计划替代方案。
targetSDK大于33并且依赖精确定时作为其核心应用工作流程的一部分的时钟和日历应用,需要在升级或安装时声明USE_EXACT_ALARM权限。除非它们符合政策语言的要求,否则Play商店将会不允许此类应用发布其版本。
3.定制化
我们将继续确保Android用户可以根据他们的个人需求调整他们的体验,包括增强的可访问性和国际化功能。
具有非线性缩放的更大字体
从Android14开始,用户将能够将字体放大到200%。以前,Pixel设备上的最大字体大小比例为130%。
为了缓解文本过大的问题,从Android14开始,系统会自动应用非线性字体缩放曲线。这确保已经足够大的文本不会以与较小文本相同的速度增长。
在Android14中,上图中左侧为文本原始比例100%(无缩放)、中间为标准缩放(200%)和右侧非线性缩放(200%),你可以参考他们之间的差异,您可以使用辅助功能>显示大小和文本设置中的字体大小选项,以最大字体大小测试您的应用程序UI。确保调整后的大文本大小设置反映在UI中,并且不会导致文本被截断。我们的文档有更多关于最佳实践的内容。
每个应用程序的语言首选项
您可以使用LocaleManager.setOverrideLocaleConfig动态更新应用的localeConfig,以自定义Android设置中每个应用语言列表中显示的语言集。这允许您自定义每个区域的语言列表、运行A/B实验,并在您的应用程序使用服务器端本地化推送时提供更新的语言环境。
IME现在可以使用LocaleManager.getApplicationLocales了解当前应用程序的UI语言以更新键盘上的语言。
语法变形API
GrammaticalInfectionAPI允许您更轻松地为使用具有语法性别的语言的用户添加支持。例如,
男性:“Vousêtesabonnéà…”
女性:“Vousêtesabonnéeà…”
中性:“Abonnementà…activé”
语法性别是语言固有的,在某些非英语语言中不容易解决。与必须在每个字符串基础上应用的ICU中的SelectFormat相比,这个新的API减少了支持查看者性别(谁正在查看UI;而不是正在谈论谁)的工作。
要显示个性化翻译,您只需为受影响语言的每个语法性别添加变形的翻译并集成API。
4.隐私和安全
运行时接收器
targetSDK=14的应用,动态广播接受者Context.registerReceiver()注册时必须标明“对外”或“不对外”,这是之前版本清单级工作的延续。点击这里了解更多。
更安全的隐式Intent
为防止恶意应用程序拦截意图,目标为Android14的应用程序中未表明目标package的应用将会被限制其启动功能。在这里了解更多。
更安全的动态代码加载
动态代码加载(DCL)为恶意软件和漏洞利用引入了出口,因为动态下载的可执行文件可能会被意外操纵,从而导致代码注入。目标为Android14的应用,需要将动态加载的文件标记为只读。在这里了解更多。
阻止安装应用程序
恶意软件通常以较老的targetSDK为目标,以绕过较新Android版本中引入的安全和隐私保护。为了防止这种情况,从Android14开始,targetSdkVersion低于23的应用将无法安装。选择此特定版本是因为某些恶意软件应用程序使用targetSdkVersion22以避免受到Android6.0(API级别23)于2015年引入的运行时权限模型的约束。
在设备升级到Android14时,targetSdkVersion低于23的任何应用都将保持之前的安装状态。
您可以使用以下ADB命令测试针对较旧API级别的应用:
adbinstall–bypass-low-target-sdk-block文件名.apk
凭据管理器和密钥支持
我们最近发布了CredentialManager的alpha版本,这是一种新的JetpackAPI,可让您简化用户的身份验证过程,同时还通过支持密钥来提高安全性。密钥是密码和其他可钓鱼身份验证因素的更安全替代品,并且对用户来说更方便(它们只需要生物识别刷卡即可在任何设备上安全登录)。在这里阅读更多。
5.应用兼容性
我们正在努力通过优先考虑应用程序兼容性来使每个平台版本的更新更快、更顺畅。在Android14中,我们对大多数面向应用的更改进行了选择加入,以便您有更多时间进行任何必要的应用更改,并且我们更新了我们的工具和流程以帮助您提早准备。
OpenJDK17支持-此预览包括对300个OpenJDK17类的访问。我们正在努力在即将推出的开发人员预览版中完全启用Java17功能。这些包括记录类、多行字符串和模式匹配instanceof。得益于GooglePlay系统更新(ProjectMainline),超过6亿台设备能够接收包含这些更改的最新Android运行时(ART)更新。为应用程序提供跨设备的更一致、更安全的环境,并为用户提供独立于平台版本的新特性和功能,这是我们承诺。
更轻松地测试和调试更改-为了让您更轻松地测试可能影响您的应用程序的选择加入更改,我们将在今年再次将其中的许多更改设为可切换。通过切换,您可以从开发人员选项或adb中单独强制启用或禁用更改。从这里获得更多信息。
平台稳定性里程碑-与去年一样,我们提前让您知道我们的平台稳定性里程碑,让您有更多时间规划应用程序兼容性工作。在这个里程碑,我们将提供最终的SDK/NDKAPI以及最终的内部API和面向应用程序的系统行为。我们预计在2023年6月达到平台稳定性,从那时起您将有几周的时间在正式发布前进行最终测试。发布时间表的详细信息在这里。
6.开始使用Android14
DeveloperPreview包含您尝试Android14功能、测试您的应用以及向我们提供反馈所需的一切。要使用平板电脑和可折叠设备测试您的应用程序,最简单的入门方法是在AndroidStudioSDK管理器的最新预览版中使用平板电脑或可折叠配置中的AndroidEmulator。对于手机,您可以立即开始使用Pixel7Pro、Pixel7、Pixel6a、Pixel6Pro、Pixel6、Pixel5a5G、Pixel5或Pixel4a(5G)设备上的系统映像。如果您没有Pixel设备,则可以在AndroidStudio中将64位系统映像与AndroidEmulator结合使用。
为了获得Android14的最佳开发体验,我们建议您使用最新的AndroidStudioGiraffe预览版(或更新的Giraffe+版本)。设置完成后,您应该执行以下操作:
试用新功能和API-在开发人员预览的早期阶段,您的反馈至关重要。在反馈页面上报告我们跟踪器中的问题。
测试您当前应用的兼容性——了解您的应用是否受到Android14中默认行为变化的影响;将您的应用程序安装到运行Android14的设备或模拟器上,并对其进行广泛测试。
使用选择加入更改测试您的应用程序-Android14具有选择加入行为更改,这些更改只会影响您的应用程序以新平台为目标时。尽早了解和评估这些变化很重要。为了更容易测试,您可以单独打开和关闭更改。
我们将在整个Android14发布周期中定期更新预览系统映像和SDK。此初始预览版仅供开发人员使用,不适合日常使用或消费者使用,因此我们仅通过手动下载提供它。一旦您手动安装了预览版本,您将自动通过无线方式获得未来所有预览版和Beta版的更新。在这里阅读更多。
如果您打算从Android13QPRBeta计划转移到Android14DeveloperPreview计划并且不想擦除您的设备,我们建议您现在转移到DeveloperPreview1。否则,您可能会遇到Android13Beta的构建日期更新的时间段,这将阻止您在不执行数据擦除的情况下直接进入Android14DeveloperPreview。
当我们发布Beta版时,我们也将邀请消费者试用Android14,届时我们将开放AndroidBeta计划的注册。目前,请注意AndroidBeta程序尚不适用于Android14。
如需完整信息,请访问Android14开发者网站。
Java和OpenJDK是Oracle和/或其附属公司的商标或注册商标。
二.重点变化介绍
这一章,简单来说就是对上面文档中核心内容的解读。
JobScheduler和前台服务的更新和添加
一种推荐的文件下载方式
首先谷歌给我们推荐了一种使用前台Service进行文件下载的方式:
具体流程在下面的链接中,这里就不详细介绍了。答题流程就是声明权限,使用JobScheduler来完成具体的下载操作,并且绑定Notification让用户可知。
https://developer.android.com/about/versions/14/changes/user-initiated-data-transfers
前台Service需要主动声明其所属的类型
其次前台Service在android14中需要主动声明其所属的类型,如下面代码中的mediaPlayback类型
<manifest ...>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYPACK" />
<application ...>
<service
android:name=".MyMediaPlaybackService"
android:foregroundServiceType="mediaPlayback"
android:permission="android.permission.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYPACK"
android:exported="false">
</service>
</application>
</manifest>
广播的变化
后台广播接收者将会延时收到广播消息
android14开始,如果应用切换到了后台,并且其对应的进程已经进入了缓存进程状态,则此时广播接收者有可能就收不到广播了,只有其进程切换回正常状态后,才会收到这个迟到的广播,而且再次期间有多个广播的话,最终有可能会被合并为一个广播消息。
所以,如果后台进程想通过监听广播来完成某些操作的话,有可能要绑定一个前台服务使其不会变为缓存进程状态。
缓存进程的状态可以参照谷歌的官方文档:https://developer.android.com/guide/components/activities/process-lifecycle?hl=zh-cn
动态广播接收者注册需要声明其使用范围
这个功能,其实android13上就已经有了,只是android13需要启动兼容性框架。
使用方式如下
context.registerReceiver(sharedBroadcastReceiver, intentFilter,
RECEIVER_EXPORTED);
context.registerReceiver(privateBroadcastReceiver, intentFilter,
RECEIVER_NOT_EXPORTED);
字体的优化
android14开始,用户可以将字体放大到200%了,而之前的的比例为130%。并且还增加了一个新的功能,如果字体本身已经较大,则不会像小的字体一样按照同样的比例增大。
代码动态加载的变化
我们使用中有很多动态加载代码的场景,加载jar或者aar文件。android14开始,如果仍要加载这些代码,需要把jar或者aar文件声明为仅可读,从而避免动态修改AAR造成的代码入侵的文件。
val jar = File("DYNAMICALLY_LOADED_FILE.jar")
val os = FileOutputStream(jar)
os.use {
// Set the file to read-only first to prevent race conditions
jar.setReadOnly()
// Then write the actual file content
}
val cl = PathClassLoader(jar, parentClassLoader)
targetSDK<23的应用将无法在安卓14上安装
targetSDK<23的应用将无法在安卓14上安装。按照谷歌的说法,之所以设置为23(android6.0),是因为从6.0开始引入的动态权限申请,如果targetSDK<23会有绕过动态权限申请的风险。
但是实际上,做了一个实验,发现其实还是绕不过去的,targetSDK=22的话,会在安装之后首次启动的弹出权限选择的页面,让用户来选择是否给予权限,如果不选择授予,仍然是没有权限的。
JDK17的支持
android14开始支持JDK17,当然不是全部,首批只有300个类,包括记录类、多行字符串和模式匹配 instanceof等。