前言:
8月16日,谷歌发表Android13新零碎的源代码曾经上传到Android开源我的项目(AOSP)中,Android13正式公布。自从2022年2月Android13第一个预览版上线以来,历经7个月的测试和优化,正式版本的Android13终于来了!Android13依然聚焦个人隐私爱护和平安,并提供了万物互联时代下大小屏适配、电池利用率优化等相干的技术开发能力。
感兴趣的开发者能够登录官网下载源码测试学习:https://developer.android.goo...
个推服务开发者多年,始终亲密关注和跟进行业发展趋势。Android13正式版公布后,咱们应用模拟器进行了钻研和适配测试。本文将从权限变更、系统优化、性能更新等方面来谈谈Android13新个性,以帮忙开发者疾速上手实现Android新零碎的适配。
权限变更
一、告诉权限
告诉栏音讯始终是App和用户沟通的无效渠道。在Android13之前,App只须要应用NotificationManager即可向终端用户推送告诉栏音讯。Android13则引入了新的运行时告诉权限:POST_NOTIFICATIONS。对此,App开发者须要予以重点关注。
个推对该权限进行了测试,总结如下:
1. 首先看TargetSdk<33的状况。
如下图,当App应用告诉栏性能时,零碎将自动弹出受权弹窗:
用户点击“容许”,App可失常给用户推送音讯:
2. 再看TargetSdk == 33的状况。
开发者须要在AndroidManifest.xml中申明POST_NOTIFICATIONS权限,还须要在应用告诉栏推送性能时在代码中申请运行时权限:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.gt.demo.mubai.push"> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/></manifest>requestPermissions(new String[]{“android.permission.POST_NOTIFICATIONS”})
以上是用户点击“容许”App推送的状况。当然,用户也有可能点击“不容许”。值得注意的是,一旦被用户回绝受权,下次零碎将不会再呈现权限申请的弹窗。如果App依然要推送重要音讯(比方重大版本更新)给用户,则须要疏导用户返回设置界面关上告诉权限。
代码如下:
private void jumpNotificationSetting() { final ApplicationInfo applicationInfo = getApplicationInfo(); try { Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", applicationInfo.packageName); intent.putExtra("android.provider.extra.APP_PACKAGE", applicationInfo.packageName); intent.putExtra("app_uid", applicationInfo.uid); startActivity(intent); } catch (Throwable t) { t.printStackTrace(); Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", applicationInfo.packageName, null)); startActivity(intent); }
★舒适提醒:
如果App要确认用户是否已启用告诉,能够调用NotificationManager.areNotificationsEnabled()进行判断。 另外,除了“容许”和“不容许”两种抉择外,用户还能够划走权限申请对话框(User swipes away from dialog),即用户未抉择受权(也未抉择不受权)。那么下次App进行告诉栏音讯推送时,零碎将再次弹出用户受权弹窗。
★个推说:
Android13的告诉权限变更将使终端用户的体验失去极大改善。用户可能自主抉择是否承受App推送的告诉栏音讯,缩小被有效信息频繁打搅的状况。个推以音讯推送服务起家,也始终提倡绿色推送,强调在适合的工夫、适合的地点、适合的场景把适合的内容推送给适合的人群,给终端用户更好的体验。
二、WiFi权限变更
Android13对WiFi权限的变更也是一大重点。在万物互联的当下,不同的智能家居/智能穿戴设施多是通过WiFi互通互联,因而这些类型的App开发者更要着重关注该局部内容。
在以往版本的Android零碎下,如果App要应用WiFi相干性能,须要申请 ACCESS_FINE_LOCATION,即地位权限,如下图:
▲图片来源于Android13官网
为了防止App适度索权,更好地爱护终端用户隐衷,Android13将WiFi权限从地位权限中拆散了进去,引入了新的运行时权限:NEARBY_WIFI_DEVICES。
如果App仅须要应用WiFi相干的API,并不需要应用getScanResults()、startScan()等与地位相干的API,那么倡议App开发者切换到新的NEARBY_WIFI_DEVICES权限。
新的WiFi权限运行机制:
▲图片来源于Android13官网
权限应用和适配:
开发者须要留神的是,如果你的利用(targetSdk == 33)曾经申明不会依据 WiFi信息推导设施的物理地位信息,那就不再须要申明 ACCESS_FINE_LOCATION 权限。
另外,如果利用在Android13上只应用WiFi API而不应用地位信息,那开发者能够在AndroidManifest.xml中减少NEARBY_WIFI_DEVICES权限,并将usesPermissionFlags属性设为neverForLocation,给ACCESS_FINE_LOCATION权限减少maxSdkVersion="32"的限度,代码如下:
<manifest ...> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="32" /></manifest>
三、更细分的媒体权限
除了告诉权限和WiFi权限的更新外,Android13对本地数据拜访权限也做了进一步细化。Android13将READ_EXTERNAL_STORAGE和 WRITE_EXTERNAL_STORAGE权限细分为:READ_MEDIA_IMAGES、 READ_MEDIA_VIDEO和 READ_MEDIA_AUDIO,
如下图:
▲图片来源于Android13官网
个推应用android.permission.READ.MEDIA_IMAGES,对新权限进行了测试:
咱们发现,独自申请READ_MEDIA_IMAGES、独自申请 READ_MEDIA_VIDEO和同时申请READ_MEDIA_IMAGES& READ_MEDIA_VIDEO,零碎均将只显示一个受权弹窗。另外,如果App(targetSdk == 33)曾经申请了读的权限,那App同时也就有了写的权限,无需再额定申明 WRITE_EXTERNAL_STORAGE权限,代码如下:
<manifest ...> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /></manifest>
四、准确的闹钟权限
为了节俭系统资源,Android12引入了SCHEDULE_EXACT_ALARM权限进行“闹钟和揭示”性能的受权治理。Android13则又引入了新的闹钟权限USE_EXACT_ALARM。和Android12的SCHEDULE_EXACT_ALARM权限不同,如果App曾经申请应用了USE_EXACT_ALARM新权限,那么用户是不能在设置页面里敞开受权的。对于日程治理、工夫治理等类型的App来讲,Android13引入的USE_EXACT_ALARM权限可能带来肯定便当。
相比Android12的SCHEDULE_EXACT_ALARM权限,应用新权限的利用将不再须要频繁打搅用户进行受权,可能更高效地为用户提供闹钟、日程揭示等服务。 不过,为了避免新权限被滥用,GooglePlay设置了严格的上架审核机制。
开发者要留神,一旦应用了USE_EXACT_ALARM权限,App在上架GooglePlay时将会被平台严格审查。除非App属于闹钟、计时器、日历等类型的利用或者在已被列入到利用市场的白名单里,否则GooglePlay将不会容许应用该权限的利用上架。
★个推说:随着我国对App用户集体权利爱护力度的一直加大,置信后续国内的手机厂商和利用市场也将跟进建设相应的审查机制,加强对用户权利的爱护。倡议App开发者继续关注相干动静,及时做好适配工作。
五、后盾的传感器权限
现在生物信息安全也是公众关注的焦点。为了更好地爱护终端用户的集体生物信息,Android13减少了新的后盾传感器权限。App在后盾运行时,如果须要获取心率、体温、血氧饱和度等传感器信息,将不仅须要向用户申请现有的BODY_SENSORS权限,还必须申明新的BODY_SENSORS_BACKGROUND权限。综上能够看到,Android13对个人隐私爱护的器重和增强。除了权限变更方面,Android13还进行了系统优化、组件更新,以进一步晋升零碎的安全性和敌对性。
系统优化
一、更平安的零碎组件
IntentFilter
在之前版本的Android零碎中,开发者只需将android:exported设为true就能够跨利用显式启动Activity和Service,即便intent-filter中的action或者type不匹配,也可能启动。为防止上述破绽,Android 13加强了intent-filter的匹配过滤逻辑。在接管方的targetSdk == 33的状况下,如果intent-filter匹配命中,无论发送方的targetSdk版本如何,intent都将失效。
★舒适提醒:以下几种状况不须要遵循intent-filter的匹配过滤逻辑:组件没有申明同一个App里的intent零碎或Root过程收回的intent BroadcastReceiver以往的Android零碎下,利用动静注册的BroadcastReceiver播送接收器会接管到任何利用发送的播送(除非该接收器应用了利用签名权限爱护),这会使动静注册的播送接收器存在平安危险。
Android13要求,利用动静注册的播送接收器必须以显著的形式指出是否容许其余利用拜访,即其余利用是否能够向其发送播送。否则,在动静注册时零碎将抛出平安异样(SecurityException)。目前该加强措施并非默认失效,开发者需启用 DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED兼容性框架,并在动静注册播送时指定是否承受其余利用的播送:
context.registerReceiver(receiver, intentFilter, RECEIVER_EXPORTED)context.registerReceiver(receiver, intentFilter, RECEIVER_NOT_EXPORTED)
★舒适提醒:零碎播送不受RECEIVER_NOT_EXPORTED影响。
二、前台服务(FGS)工作管理器
Android13还新增了前台服务(FGS)工作管理器性能。
如下图,用户能够在下拉的告诉栏中间接敞开前台服务和应用程序:
此外,如果零碎检测到利用长时间运行某项前台服务(在24小时的时间段内至多运行20小时),便会向用户发送揭示告诉,告诉内容如下:APP is running in the background for a long time. Tap to review. 值得注意的是,满足以下任一条件的状况下,零碎均将不会显示该告诉:曾经发送过前台服务相干的告诉,也就是说,用户未敞开之前的揭示告诉前台服务的类型为FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK 或 FOREGROUND_SERVICE_TYPE_LOCATION
★舒适提醒:
如果零碎针对某利用曾经显示过此告诉,那至多在30天后零碎才会再次显示该告诉。另外,零碎级利用、平安利用(比方具备android.app.role.EMERGENCY 角色的利用)等运行的前台服务,将不会显示在FGS工作管理器中。
三、告诉权限
Android9引入了利用待机存储分区性能,依据利用的应用工夫和频率,将利用动态分配到五个不同优先级的存储分区,而后对不同存储分区的利用施加不同级别的利用资源限度。
如下,存储分区依照优先级从高到低排序,优先级越低对该分区内的App限度越多:
- 沉闷:利用目前正在应用中,或者最近刚刚应用过。
- 工作集:利用会定期应用。
- 罕用:利用会常常应用,但不会每天应用。
- 极少应用:利用不常常应用。
- 受限:利用会耗费大量的系统资源,或体现出不良行为(Android11引入)。
其中“受限”状态的利用,将受到以下限度:
- 无奈启动前台服务。
- 现有的前台服务会从前台移除。
- 不会触发闹钟。
- 不会执行Jobs。
在Android9利用待机存储分区性能的根底上,Android13对电池资源策略进行了优化,以缩短设施的电池续航工夫,晋升终端用户的体验。
首先,Android13新增了以下规定,合乎相应规定的利用将进入到“受限”存储分区(设施处于敞开状态的工夫不会计入互动限度):
- 用户曾经8天没有与利用互动。
- 利用在1天内调用过多的播送或者绑定服务。
- 利用在1天内耗费了大量的电池电量,阈值取决于设施。
其次,Android13还对“受限”存储分区的利用减少了限度措施:
- 利用将不收受到BOOT_COMPLETED、LOCKED_BOOT_COMPLETED播送
四、对non-SDK接口限度的更新
Android 13对一些non-SDK接口进行了限度(并针对局部限度提供了代替计划)。开发者须要明确App在降级时是否应用了受限的non-SDK接口。Android13中受限的non-SDK接口参考:
Landroid/app/Activity;->setDisablePreviewScreenshots(Z)V # Use setRecentsScreenshotEnabled() instead.Landroid/os/PowerManager;->isLightDeviceIdleMode()Z # Use isDeviceLightIdleMode() instead.Landroid/os/Process;->setArgV0(Ljava/lang/String;)V # In general, do not try to change the process name. If you must change the process name (for instance, for debugging), you can use pthread_setname_np() instead, though be aware that doing this might confuse the system.Landroid/view/accessibility/AccessibilityInteractionClient;->clearCache(I)V # Use android.accessibilityservice.AccessibilityService#clearCache() instead.
性能更新
用户体验的晋升也始终是Android零碎更新的重点。Android13次要针对剪切板、大小屏适配、UI展现等进行了性能更新。
一、剪切板
首先来看剪贴板。置信大家都应用过剪贴板,它可能疾速复制页面上的内容,不便咱们进行内容编辑和批改。 然而始终以来,剪切板性能存在这样一个隐患,即剪切板复制的内容中可能存在敏感信息。为了更好地保障剪切板中的隐衷内容(比方手机号码、邮箱、账号密码等)不被泄露,Android13对剪切板性能进行了更新。
如下图,Android13剪切板性能的应用分2步:确认内容已胜利复制。提供所复制内容的预览。
此外,Android13还提供了脱敏性能,使用户可能对剪切板中的敏感信息进行暗藏,实现了便利性和安全性兼得。
二、更好地反对平板和大屏幕
平板电脑、车载大屏、智能电视屏等的广泛应用,使用户的终端场景越来越多样化。如何给不同终端的用户始终好看和晦涩的体验?Android13对此提供了更好的反对,对大屏上的零碎UI以及分屏展现等进行了更新。
如下图,在大屏幕上,Android13反对不同的功能模块同屏展现,使得大屏幕的劣势可能充沛被利用。
▲Android13零碎下,用户能够将“疾速设置”版块和“告诉栏”版块置于同屏当中。
三、Jetpack WindowManager
另外,Android13还反对用户在大屏幕中一次显示多个Activity,以充分利用大屏的显示空间。开发者可通过创立XML配置文件或进行Jetpack WindowManager API调用来确定App实现多个Activity同屏显示(比方并排或重叠)的具体形式。
▲比方,以宰割工作窗口(splite task window)的模式实现单个屏幕内展现两个Activity。
四、更好的兼容性反对
对于尚未适配大屏幕的App,Android13也提供了更加敌对和稳固的兼容反对,让这些App在默认状况下也能有舒服好看的UI展现,不会影响到终端用户的体验,
如下图:
▲图片来源于Android13官网
总结: 通过近两年的Android零碎更新能够看到,Google不再对安卓零碎进行大刀阔斧的改变,而是在用户体验、隐衷爱护、系统安全、组件优化等方面下足了功夫。更多Android13的更新要点,开发者可进入Android13官网做进一步理解:https://developer.android.goo...如果您还想就新零碎适配以及安卓开发等内容进行更深刻的交换,欢送增加@个推技术支持,和咱们分割。
后续,个推还将继续关注安卓零碎和行业倒退动静,和开发者们一起交换挪动开发技术,共建挪动互联网新生态。