背景
项目有一个新需求,适配Android 12 闪屏动画,通过调研文档,查询资料,发现完成适配需要以下几步:
1、升级项目编译版本 compileSdkVersion 31 以上
2、添加库 implementation 'androidx.core:core-splashscreen:1.0.0'
3、更换application的theme,类似以下,其中postSplashScreenTheme指原来的theme,这样可以兼容12以下版本的api,windowSplashScreenBackground是背景色,windowSplashScreenAnimatedIcon是图标
<style name="SplashScreenTheme" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/splash_screen_background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/cat</item>
<item name="postSplashScreenTheme">@style/Theme.SplashScreenDemo</item>
</style>
具体依据可以参考以下文档:
启动画面文档
https://developer.android.com/guide/topics/ui/splash-screen?hl=zh-cn
SplashScreen compat 库:
https://developer.android.com/jetpack/androidx/releases/core?hl=zh-cn#core-splashscreen-1.0.0
相关实践:
https://juejin.cn/post/7026188311198695432
问题
将以上适配过程应用到项目里,然后执行assembleDebug打包,发现编译报错,找到不到windowSplashScreenBackground等属性。
37911d752b37e8affd04439a163bf85.jpg
查看报错得知,报错的属性都是适配12 闪屏api需要用到的属性,而这些属性都是系统的,通过查看31 的sdk,发现了这些属性
image.png
由此推测打包过程可能中,compileSdkVersion 31 并没有生效,接下来修改代码,去掉上诉步骤的23,只保留compileSdkVersion 31,打包验证,发现apk里面的compileSdkVersion 居然是30。
处理过程
处理该问题,大概有两个方法:
1、对gradle的编译流程进行插桩,找到compileSdkVersion 变化的路径,分析具体的原因,因为时间紧迫,相关的技术积累不太充分,该方法暂时未被采纳。
2、通过修改一些配置环境或者代码尝试修复该问题。
接下来,需要确认是统一问题还是项目个案。
创建了一个demo 工程,
保持agp 、gradle、jdk版本都和项目一致,
保持compileSdkVersion、minSdkVersion、targetSdkVersion都和项目一致。
运行demo工程之后,
查看demo.apk里面的AndroidManifest.xml,compileSdkVersion 是31,
总结,demo未复现出项目里的问题,说明只是项目存在该问题。
通过查询文档,发现sdk 31之后适配jdk 11,尝试修改gradle 的jdk版本为11,但是依然打包项目报错。
尝试升级agp和gradle版本,再次打包,打包成功,apk内compileSdkVersion 是31 。
最终的解决方法:
升级agp为4.2.0,
升级gradle为6.7.1,
升级gradle的jdk为11
网友评论