Android 12 适配简介

咱们好,我叫八两,来自37手游安卓团队。 前不久,9月21号,谷歌更新了 Android 12 Beta5 版别的阐明,Beta5 也会是 Android 12 正式版别前的最终一个 Beta 测验版别。 恰巧9月27号,有幸参加金标联盟的第一次线下活动,也聊到了Android 12 的适配。

Android 12 适配简介

那么 Android 12 到底会给咱们带来什么样的改变,作为一名从业者,咱们又该分配多少资源以及如何去对咱们的产品进行适配呢。

适配

一般咱们说的适配,严厉来讲分成两个阶段。 第一部分是通配性问题, 即使我不对我的项目进行任何修正,不修正 TargetSdkVersion 也需求进行重视, 个人喜爱把它叫通配性问题。 第二部分则是全面适配问题, 即 TargetSdkVersion 等于 31 才需求去重视的问题. 这儿主要和咱们讲讲通配性问题。 假如咱们需求搬迁到 Android 12, 设置 TargetSdkVersion 成 31, 能够依据自身产品运用的东西并参阅 官方文档 来进行搬迁。

通配性问题

通配性问题,咱的界说是,无论你运用哪个版别的 TargetSdkVersion, 只需跑在 Android 12 上,你都需求重视。这儿个人节选了几个比较重要的,一起来看看吧.

Splash Screen

Android 12 添加了体系默许的 APP 发动页,该 APP 发动页会运用APP界说的主题和ICON生成。这或许对很多开发者来说是一个比较大的困恼,假如不做任何适配,发生的成果或许如下:

  1. 假如你本来运用 android:windowBackground 实现了发动页,你的实现会被默许的发动页样式替换。
  2. 假如你运用了一个额外的 Activity 作为发动页,则会先弹出体系默许发动页,再弹出你实现的发动页,用户有幸能够享受两次闪屏了。

现在谷歌的适配方案只提供了设置主题的办法,至于本来运用额外 Activity 作为发动页的办法,谷歌爸爸和蔼的和咱们说,你能够挑选不管或许去掉 Activity并运用设置主题办法来兼容. 具体办法如下:

  • 设置 compileSdkVersion 和引进库
build.gradle
android {
   compileSdkVersion 31
   ...
}
dependencies {
   ...
   implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
}
  • 创立闪屏主题,继承 Theme.SplashScreen, 设置 postSplashScreenThemewindowSplashScreenAnimatedIcon, 其他字段可选.如:
<style name="Theme.App.Starting" parent="Theme.SplashScreen">
   // Set the splash screen background, animated icon, and animation duration.
   <item name="windowSplashScreenBackground">@color/...</item>
   // Use windowSplashScreenAnimatedIcon to add either a drawable or an
   // animated drawable. One of these is required.
   <item name="windowSplashScreenAnimatedIcon">@drawable/...</item>
   <item name="windowSplashScreenAnimationDuration">200</item>  # Required for
                                                                # animated icons
   // Set the theme of the Activity that directly follows your splash screen.
   <item name="postSplashScreenTheme">@style/Theme.App</item>  # Required.
</style>
  • Manifest 运用对应的主题
<manifest>
   <application android:theme="@style/Theme.App.Starting">
    <!-- 或许 -->
        <activity android:theme="@style/Theme.App.Starting">
...
  • 代码中,在setContentView前调用 installSplashScreen, 以 Java 为:
public class SplashScreenSampleActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         // Handle the splash screen transition.
         SplashScreen splashScreen = SplashScreen.installSplashScreen(this);
         setContentView(R.layout.main_activity);
    }
}

installSplashScreen 会回来闪屏目标,其自身也能够进行一些属性设置, 至此,如上便是谷歌引荐的 SplashScreen 的适配办法

OverScroll 翻滚动画添加

Android 12 修正了 OverScroll 的效果动画,从本来的拉到底部显现蓝光,修正成了拉到变形弹弹弹的动画。如下图
假如你需求特别处理 OverScroll 的动画或许动作,谷歌添加了float getDistance()float onPullDistance(float deltaDistance, float displacement) 两个 API 来处理 OverScroll 行为, 需求在 onTouchEvent 中运用如上两个 API,再自界说对应行为.

Android 12 适配简介

假如你不喜爱这个动画的话,你也能够经过 xml 中设置 android:overScrollMode="never" 或许运用代码设置 recyclerview.setOverScrollMode(View.OVER_SCROLL_NEVER); 来屏蔽默许的翻滚动画。

引进约束域概念(官方翻译: 约束性运用待机形式存储分区)

Android 12 引进了 APP 约束域, 约束域不但会界说运用的优先级(是否简单被体系杀死),处于低约束域的运用还会被约束一些比较消耗体系资源的行为。而约束域优先级的区分,很大程度上取决于你运用的运用频率以及当时是否在被前台运用。
想获取 APP 当时的约束域能够运用 getAppStandbyBucket 办法得到,示范:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    UsageStatsManager manager = (UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
    if(manager != null) manager.getAppStandbyBucket();
}

假如需求测验 APP 在严厉约束域的表现,谷歌也提供了相对应的指令来进行模仿:

adb shell am set-standby-bucket PACKAGE_NAME restricted

这个只需求做充分的测验即可,究竟你也做不了什么,防止被约束的办法很简单,让用户停在你的APP界面以及更常常的运用你的 APP, 这应该是一切运用开发者一直在研究的问题吧。

Display.getRealSize() & Display.getRealMetrics() 抛弃

继 Android 11 抛弃了 Display.getSize()Display.getMetrics() 后,Android 12 上进一步抛弃了 Display.getRealMetrics()Display.getRealSize(). 现在引荐运用 WindowMetrics, 而且谷歌提供了一个兼容到 Android 4.0 的 WindowManager 兼容库。 一般状况能够运用如下代码代替以前计算屏幕宽高,:

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) {
     metrics = activity.getWindowManager().getCurrentWindowMetrics();
     int width = metrics.getBounds().width();
     int height = metrics.getBounds().height();
 }

假如你的运用还在运用如上 API, 赶忙替换掉吧。

非可信接触事情会被屏蔽

Android 12 开端,假如 APP 被其他UI遮挡掩盖或许在APP上制作了其他UI,用户一切的接触(touch)事情不再会传递下来了,你的 APP 将无法呼应这些接触事情, 当然APP被如下特殊状况的窗口遮挡, 接触事情能够正常传递:

  1. 不可见的窗口,窗口都不见了,也挡不住用户去摸了。
  2. 彻底透明的窗口,和上一条千篇一律,彻底透明的衣服等于没穿。(alpha 值是 0)
  3. 部分半透明窗口,遮不遮的住取决于透明度,现在版别最大 opacity 值 0.8 以下,仍然能够传递接触事情。不过将来正式版别这个值或许被修正。
  4. 遮挡的 UI 自身由你的APP创立,且只在你的 APP 内显现交互时.
  5. 遮挡你APP的是可信的遮挡UI,包含但不限于如下:
  • 软键盘或其他体系输入
  • 体系帮手悬浮窗
  • 运用了 TYPE_ACCESSIBILITY_OVERLAY 标志的窗口 …


这一条个人认为,也是谷歌爸爸对现运用动不动喜爱搞个体系级的悬浮窗的一种约束,对绝大多数运用应该影响不大。
除了上述问题外,还存在一些其他细节修正,就不一一赘述,感兴趣的亲们能够仔细阅读 通配性问题谷歌文档

适配优先级

作为一个技术,不聊 DeadLine 来谈优先级,简直便是耍流氓。关于通配性问题,主张一切开发者在 Android 12 正式版别发布后第一时间进行测验,来承认是否会影响自家产品和业务。

关于全面更新适配 Android 12(TargetSdkVersion 升级到 31), 现在 Android 12 还在进行 Beta5 测验,但尚未完结彻底兼容测验(Compatibility Test Suite),依照以往的速度,快则个把月,慢则几个月。Android 12 正式版别会与咱们见面,而从发布到用户真正能运用也需求一段时间。关于运用开发者,在Android 12正式版别发布后的任何时候,都能够开端考虑进行适配作业。 比及各大国产厂商开端推送 Android 12 时,再进行适配,或许就被友商卷下去了。 而关于游戏开发者,联运渠道SDK自身适配也需求一段时间,考虑到绝大多数渠道现在还只需求TargetSdkVersion 26, 只上联运的话,会有十分富余的适配时间,等各大联运渠道告诉即可,估摸着2023年吧。 假如发海外 GooglePlay, 一般新体系出来后半年内需求进行适配,之后再过小半年,GooglePlay 就要开端强制要求适配了,发海外 GooglePlay 也是越快适配越好的行情。 假如贵司纯靠买量投进与自有流量导入,那花一上午简单在 Android 12 上测验一下功用,啥时候高兴啥时候适配。

Android 12 已知问题

最终,聊聊谷歌现在 Android 12 的几个高频已知问题,假如你遇上了,不要慌,谷歌已经知道有这些问题了,反正你不需求去纠结。大概率(看谷歌心境)正式版别会被修复的。

  1. 经过 设置->账户密码添加账户时,体系会黑屏.
  2. 下滑告诉栏,有时告诉栏无法正常显现告诉.190269314 锁屏时有时无法正常显现告诉189173895
  3. 连着 USB 调试时,运用谷歌地图或许视频播放软件,Android 体系会溃散.189515336
  4. 运用虚拟键盘时,假如有告诉进来,虚拟键盘会被自动最小化,且划掉告诉前,无法正常运用键盘.193920125

假如想具体了解 Android 12 的已知问题,请参阅 developer.android.com/about/versi…

总结

总体来说,对绝大多数产品, Android 12 的更新并不会像 Android 11 与 Android 10 杂乱,且现在 Android 12 正式版别还未推出,部分内容各大手机硬件厂商也在与谷歌商讨,所以,关于绝大多数运用开发者,我的主张是,Android 12 发布后,针对文章说到的点进行一次兼容性测验就能够了。

关于 Android 12 相关适配有问题,以及想要进行相关沟通的话,欢迎扫描二维码添加好友进群沟通

Android 12 适配简介