作者:恋猫de小郭 Android12需要更新适配点并不多,本篇主要介绍最常见的两个需要适配的点:android:exported和SplashScreen。一、android:exported 它主要是设置Activity是否可由其他应用的组件启动,true则表示可以,而false表示不可以。若为false,则Activity只能由同一应用的组件或使用同一用户ID的不同应用启动。 当然不止是Activity,Service和Receiver也会有exported的场景。 一般情况下如果使用了intentfilter,则不能将exported设置为false,不然在Activity被调用时系统会抛出ActivityNotFoundException异常。相反如果没有intentfilter,那就不应该把Activity的exported设置为true,这可能会在安全扫描时被定义为安全漏洞。 而在Android12的平台上,也就是使用targetSdkVersion31时,那么你就需要注意: 如果Activity、Service或Receiver使用intentfilter,并且未显式声明android:exported的值,App将会无法安装。 这时候你可能会选择去AndroidManifest一个一个手动修改,但是如果你使用的SDK或者第三方库没有支持怎么办?或者你想要打出不同target平台的包?这时候下面这段gradle脚本可以给你省心:修改Android12因为exported的构建问题android。applicationVariants。all{variantvariant。outputs。all{outputoutput。processResources。doFirst{pmStringmanifestPathoutput。processResources。manifestFiledefmanifestFilenewFile(manifestPath)defxmlnewXmlParser(false,true)。parse(manifestFile)defexportedTagandroid:exported指定spacedefandroidSpacenewgroovy。xml。Namespace(http:schemas。android。comapkresandroid,android)defnodesxml。application〔0〕。。findAll{挑选要修改的节点,没有指定的exported的才需要增加(it。name()activityit。name()receiverit。name()service)it。attribute(androidSpace。exported)null}添加exported,默认falsenodes。each{defisMainfalseit。each{if(it。name()intentfilter){it。each{if(it。name()action){if(it。attributes()。get(androidSpace。name)android。intent。action。MAIN){isMaintrueprintln(。。。。。。。。。。。。。。。。。。。。。。MAINFOUND。。。。。。。。。。。。。。。。。。。。。。)}}}}}it。attributes()。put(exportedTag,{isMain})}PrintWriterpwnewPrintWriter(manifestFile)pw。write(groovy。xml。XmlUtil。serialize(xml))pw。close()}}} 这段脚本你可以直接放到appbuild。gradle下执行,也可以单独放到一个gradle文件之后apply引入,它的作用就是: 在打包过程中检索所有没有设置exported的组件,给他们动态配置上exported。这里有个特殊需要注意的是,因为启动Activity默认就是需要被Launcher打开的,所以android。intent。action。MAIN需要exported设置为true。如果有需要,还可以自己增加判断设置了intentfilter的才配置exported。 二、SplashScreen Android12新增加了SplashScreen的API,它包括启动时的进入应用的动作、显示应用的图标画面,以及展示应用本身的过渡效果。 它大概由如下4个部分组成,这里需要注意:1最好是矢量的可绘制对象,当然它可以是静态或动画形式。2是可选的,也就是图标的背景。与自适应图标一样,前景的三分之一被遮盖(3)。4就是窗口背景。 启动画面动画机制由进入动画和退出动画组成。进入动画由系统视图到启动画面组成,这由系统控制且不可自定义。退出动画由隐藏启动画面的动画运行组成。如果要对其进行自定义,可以通过SplashScreenView自定义。 更详细的介绍这里就不展开了,有兴趣的可以自己看官方的资料:https:developer。android。comguidetopicsuisplashscreen,这里主要介绍下如何适配和使用的问题。 首先不管你的TargetSDK什么版本,当你运行到Android12的手机上时,所有的App都会增加SplashScreen的功能。 如果你什么都不做,那App的Launcher图标会变成SplashScreen界面的那个图标,而对应的原主题下windowBackground属性指定的颜色,就会成为SplashScreen界面的背景颜色。这个启动效果在所有应用的冷启动和热启动期间会出现。其实不适配好像也没啥问题。 关于如何迁移和使用SplashScreen可以查阅官方详细文档:https:developer。android。comguidetopicsuisplashscreenmigrate 另外还可以参考《Jetpack新成员SplashScreen:打造全新的App启动画面》这篇文章,文章详细介绍了如果使用官方的Jetpack库来让这个效果适配到更低的Target平台:https:juejin。cnpost6997217571208445965 而正常情况下我们可以做的就是:1、升级compileSdkVersion31、targetSdkVersion31buildToolsVersion31。0。02、添加依赖implementationandroidx。core:coresplashscreen:1。0。0alpha023、增加valuesv31的目录4、添加styles。xml对应的主题,例如:resourcesstylenameLaunchThemeparentTheme。SplashScreenitemnamewindowSplashScreenBackgroundcolorsplashScreenBackgrounditem!itemnamewindowSplashScreenAnimatedIcondrawablesplashitemitemnamewindowSplashScreenAnimationDuration500itemitemnamepostSplashScreenThemestyleAppThemeitemstyleresources5、给你的启动Activity添加这个主题,不同目录下使用不同主题来达到适配效果。PS:我个人是一点都不喜欢这个玩意。 三、其他1、通知中心又又又变了 Android12更改了可以完全自定义通知外观和行为,以前自定义通知能够使用整个通知区域并提供自己的布局和样式,现在它行为变了。 使用TargetSDK为31的App,包含自定义内容视图的通知将不再使用完整通知区域;而是使用系统标准模板。 此模板可确保自定义通知在所有状态下都与其他通知长得一模一样,例如在收起状态下的通知图标和展开功能,以及在展开状态下的通知图标、应用名称和收起功能,与Notification。DecoratedCustomViewStyle的行为几乎完全相同。 2、AndroidAppLinks验证 AndroidAppLinks是一种特殊类型的DeepLink,用于让Web直接在Android应用中打开相应对应App内容而无需用户选择应用。使用它需要执行以下步骤:如何使用可查阅:https:developer。android。comtrainingapplinksverifysiteassociationsautoverification 使用TargetSDK为31的App,系统对AndroidAppLinks的验证方式进行了一些调整,这些调整会提升应用链接的可靠性。如果你的App是依靠AndroidAppLinks验证在应用中打开网页链接,那么在为AndroidAppLinks验证添加intent过滤器时,请确保使用正确的格式,尤其需要注意的是确保这些intentfilter包含BROWSABLE类别并支持https方案。 3、安全和隐私设置3。1、大致位置 使用TargetSDK为31的App,用户可以请求应用只能访问大致位置信息。如果App请求ACCESSCOARSELOCATION但未请求ACCESSFINELOCATION那么不会有任何影响。 TargetSDK为31的App请求ACCESSFINELOCATION运行时权限,还必须请求ACCESSCOARSELOCATION权限。当App同时请求这两个权限时,系统权限对话框将为用户提供以下新选项: 3。2、SameSiteCookie Cookie的SameSite属性决定了它是可以与任何请求一起发送,还是只能与同站点请求一起发送。没有SameSite属性的Cookie被视为SameSiteLax。带有SameSiteNone的Cookie还必须指定Secure属性,这意味着它们需要安全的上下文,需要通过HTTPS发送。站点的HTTP版本和HTTPS版本之间的链接现在被视为跨站点请求,因此除非将Cookie正确标记为SameSiteNSecure,否则Cookie不会被发送。在WebViewdevtools中切换界面标志webviewenablemoderncookiesamesite,可以在测试设备上手动启用SameSite行为。 4、应用休眠 Android12在Android11(API级别30)中引入的自动重置权限行为的基础上进行了扩展。 如果TargetSDK为31的App用户几个月不打开,则系统会自动重置授予的所有权限并将App置于休眠状态。更多可以查阅:https:developer。android。comtopicperformanceapphibernation 四、最后 大致需要注意的就是这些,基本上其实除了exproted和SplashScreen之外,其他基本都不怎么需要适配,事实上SplashScreen我个人觉得会很遭产品嫌弃,毕竟MaterialDesign在国内的待遇确实有点惨,没办法去掉SplashScreen这点估计需要和产品扯皮一段时间,不过产品和设计一般没有Android手机,何况Android12,所以日后再说吧 在这里还分享一份由大佬亲自收录整理的学习PDF架构视频面试文档源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。 当然,你也可以拿去查漏补缺,提升自身的竞争力。 真心希望可以帮助到大家,Android路漫漫,共勉! 如果你有需要的话,只需私信我【进阶】即可获取