乐趣区

关于android:个推发布Android13适配攻略开发者请查收

前言:

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… 如果您还想就新零碎适配以及安卓开发等内容进行更深刻的交换,欢送增加 @个推技术支持,和咱们分割。

 后续,个推还将继续关注安卓零碎和行业倒退动静,和开发者们一起交换挪动开发技术,共建挪动互联网新生态。

 

退出移动版