Android 12 适配简介
咱们好,我叫八两,来自37手游安卓团队。 前不久,9月21号,谷歌更新了 Android 12 Beta5 版别的阐明,Beta5 也会是 Android 12 正式版别前的最终一个 Beta 测验版别。 恰巧9月27号,有幸参加金标联盟的第一次线下活动,也聊到了Android 12 的适配。
那么 Android 12 到底会给咱们带来什么样的改变,作为一名从业者,咱们又该分配多少资源以及如何去对咱们的产品进行适配呢。
适配
一般咱们说的适配,严厉来讲分成两个阶段。 第一部分是通配性问题, 即使我不对我的项目进行任何修正,不修正 TargetSdkVersion 也需求进行重视, 个人喜爱把它叫通配性问题。 第二部分则是全面适配问题, 即 TargetSdkVersion 等于 31 才需求去重视的问题. 这儿主要和咱们讲讲通配性问题。 假如咱们需求搬迁到 Android 12, 设置 TargetSdkVersion 成 31, 能够依据自身产品运用的东西并参阅 官方文档 来进行搬迁。
通配性问题
通配性问题,咱的界说是,无论你运用哪个版别的 TargetSdkVersion, 只需跑在 Android 12 上,你都需求重视。这儿个人节选了几个比较重要的,一起来看看吧.
Splash Screen
Android 12 添加了体系默许的 APP 发动页,该 APP 发动页会运用APP界说的主题和ICON生成。这或许对很多开发者来说是一个比较大的困恼,假如不做任何适配,发生的成果或许如下:
- 假如你本来运用
android:windowBackground
实现了发动页,你的实现会被默许的发动页样式替换。 - 假如你运用了一个额外的 Activity 作为发动页,则会先弹出体系默许发动页,再弹出你实现的发动页,用户有幸能够享受两次闪屏了。
现在谷歌的适配方案只提供了设置主题的办法,至于本来运用额外 Activity 作为发动页的办法,谷歌爸爸和蔼的和咱们说,你能够挑选不管或许去掉 Activity并运用设置主题办法来兼容. 具体办法如下:
- 设置
compileSdkVersion
和引进库
build.gradle
android {
compileSdkVersion 31
...
}
dependencies {
...
implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
}
- 创立闪屏主题,继承
Theme.SplashScreen
, 设置postSplashScreenTheme
和windowSplashScreenAnimatedIcon
, 其他字段可选.如:
<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,再自界说对应行为.
假如你不喜爱这个动画的话,你也能够经过 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被如下特殊状况的窗口遮挡, 接触事情能够正常传递:
- 不可见的窗口,窗口都不见了,也挡不住用户去摸了。
- 彻底透明的窗口,和上一条千篇一律,彻底透明的衣服等于没穿。(alpha 值是 0)
- 部分半透明窗口,遮不遮的住取决于透明度,现在版别最大 opacity 值 0.8 以下,仍然能够传递接触事情。不过将来正式版别这个值或许被修正。
- 遮挡的 UI 自身由你的APP创立,且只在你的 APP 内显现交互时.
- 遮挡你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 的几个高频已知问题,假如你遇上了,不要慌,谷歌已经知道有这些问题了,反正你不需求去纠结。大概率(看谷歌心境)正式版别会被修复的。
- 经过 设置->账户密码添加账户时,体系会黑屏.
- 下滑告诉栏,有时告诉栏无法正常显现告诉.190269314 锁屏时有时无法正常显现告诉189173895
- 连着 USB 调试时,运用谷歌地图或许视频播放软件,Android 体系会溃散.189515336
- 运用虚拟键盘时,假如有告诉进来,虚拟键盘会被自动最小化,且划掉告诉前,无法正常运用键盘.193920125
假如想具体了解 Android 12 的已知问题,请参阅 developer.android.com/about/versi…
总结
总体来说,对绝大多数产品, Android 12 的更新并不会像 Android 11 与 Android 10 杂乱,且现在 Android 12 正式版别还未推出,部分内容各大手机硬件厂商也在与谷歌商讨,所以,关于绝大多数运用开发者,我的主张是,Android 12 发布后,针对文章说到的点进行一次兼容性测验就能够了。
关于 Android 12 相关适配有问题,以及想要进行相关沟通的话,欢迎扫描二维码添加好友进群沟通