公众号「稀有猿诉」
啥?这都4202年了,你的应用还没有升级到targetSDK 34?莫慌,本文就带着你全面的了解升级targetSDK 34的方法以及避坑指南。
注意,Android版本与其API level或者targetSDK是一一对应的,只不过一个是外在的说法,一个是具体要做的事情,对于开发者来说适配Android 14,就等同于升级targetSDK到34,这个34称作API level。本文会混着用,但说的都是同一个意思。
等下,有同学举手了,这眼看着Android 15(API 35)都要出来,您才教我们升级到targetSDK 34?您 是不是写错了,还是在这里浪费时间呢?
这位同学你先坐下,没写错今天要讲的就是适配Android 14的。至于Android 15还处于预览(Preview)状态呢,它要至少等到10月份左右才会正式发布,属于下半年的KPI了。不过如果 我们把targetSDK 34搞定了,那么年底升级targetSDK 35就会非常的顺畅。
为啥要升级targetSDK
在折腾之前要先要搞明白为啥要折腾升级SDK,因为毕竟配置开发环境是软件开发中的排名第二的麻烦事儿(排名第一的是折腾操作系统)项目跑的好好的,何必自找麻烦?
省流点的说,就是你不得不升级。众所周知,Android生态最麻烦的事情就是碎片化,也就是用户手机的版本远远小于最新的版本,而且主流的版本升级较慢,通常会比最新的慢3个版本以上,对面的水果则能保持在2个版本以内。这对应用开发生态来说是十分不友好的,因为开发者不愿意升级到最新的SDK,使用平台的最新特性,核心原因在于升级了也没用,因为用户手上的版本仍是3代开外的。
最心急的当然是谷歌,辛苦花大价钱开发的最新特性竟然没人用,这能忍?于是谷歌对升级targetSDK要求越来越严,对于谷歌能管得到的地方 ,如Google Play Store和厂商的GTS测试,都要求至少升级targetSDK到前一代的版本,比如2023年发布了Android 14,那就必须到targetSDK 33(Android 13);今年将发布Android 15(API 35)那到快要发布时约在2024年秋,应用必须升级到targetSDK 34。
如果不是强制要求升级targetSDK,比如我既不上线到Play Store也不用过GTS,那确实也没必要折腾。因为最近几年Android的新特性其实也都挺鸡肋的,犯不着折腾。
Android 14的新特性与变化
具体折腾前还是要先了解一下平台的变化,以评估影响,省流点说,Android 14有以下变化:
- FOREGROUND_SERVICE必须要指定一个类型。
- 调用BluetoothAdapter#getProfileConnectionState时必須在Manifest中声明BLUETOOTH_CONNECT权限。
- 支持JDK17,可以使用Java 17了。
- 动态广播接收器必须指明export flag,这个其实targetSDK 33时就有了。
- 动态加载的代码(Jar 或者Dex)文件必须标记为只读。这个对插件化和Hotfix等影响较大。
- Zip文件处理时,如果有路径越界(如".."或者以"/"开头的绝对路径)会抛异常。
总的来说变化不大,主要还是权限收紧和安全加强 。可以查看官方文档来看具体的。不喜欢看原文的同学,还有翻译的版本。啥?官方无法访问,莫慌还有官方的镜像。
如何升级
做好准备
折腾开发环境是比较烦的,所以最好找一个相对轻松的时间(比如产品汪休假时),以及心情还不错时。另外一定要把手头的事情做好备份并切到新的分支,以防不测。这真不是把33改到34就能完事儿的,会有各种意想不到的事情。
修改build.gradle文件
升级targetSDK的第一步是修改应用的build.gradle文件。找到defaultConfig部分,将targetSdkVersion的值修改为34。例如:
Groovy
android {
compileSdkVersion 34
defaultConfig {
targetSdkVersion 34
// 其他配置...
}
// 其他构建配置...
}
同时,确保compileSdkVersion也设置为34,以确保使用最新的编译工具。
注意,建议手动改配置,而不要用所谓的SDK Upgrade Assistant,因为你不晓得它都会干啥,有可能把项目的配置改的面目全非。
适配SDK的变化
就是针对平台的新变化做对应的修改。如何修改?其实官方文档里面都有具体的指导,或者这篇文章讲的也非常详细,这里就不重复了。
避坑指南
Android 14的变化并不大,没有Android 13带来的变化多,这几年最大的影响是Android 11到Android 13,主要体现在存储读写 的变化上面,可以看之前的一篇文章。
所以升级到targetSDK 34的难度有多大,有啥坑?这要取决于升级前的基础是什么。如果之前已经升级到了targetSDK 33,那么不会有坑,前面那几点稍弄下,就没有问题了。但如果还在API 30或者31,那麻烦会比较多,因为要先过targetSDK 33这一关,它的坑是最多的,可以参考这篇文章。
做好对平台的封装与隔离
最近几年Android版本的最大变化就是存储权限的收紧,以前可以直接用File到处读写,现在只有极少数文件夹可读可写,且像媒体文件要用MediaStore API。如果你的项目代码中到处都是File,甚至在JNI的so中也到处都是绝对路径,那么升级targetSDK会相当痛苦。
这就要求我们在开发过程中多留一个心眼儿。一个伟大的计算机科学家说过「计算机科学中的任何问题都能通过增加一个层来解决」。解决这种平台的硬性依赖的最好方法就是多加一层封装以进行隔离:
- 用一个模块来封装所有的涉及存储的I/O操作,这样即使遇到平台的重大变化,也只需要改这一个模块,风险大大减小。
- 对于JNI,要尽可能的传递数据,而非直接让其操作文件。如果确实要操作文件,那么也要把根文件夹从Java层传入,不能让so使用绝对路径。
对平台做好封装和隔离 ,会大大加强项目的兼容性,在升级平台SDK时起码能做到风险可控。
未来Android的发展趋势
Android(其实智能手机操作系统也一样)诞生于21世纪的第一个10年,在第二个10年达到了顶峰,移动互联网让科技巨头吃尽了红利,巨头们的市值更是超过了全球GDP总值。但回首最近两年的Google I/O和水果的WWDC,可以发现,Android和水果越来越像,也在相互抄袭,已经很久没有见到让人感到惊艳的东西了(乔帮主在天上估计都要看不下去了)。
对于Android来说,系统安全(包括权限收紧和数据安全)和隐私保护 (安全和隐私曾经是Android的弱项,现在已追上来了),以及互联互通 这三个方面还有点新东西,其他的已经没有什么变化了。智能手机已经到了比较明显的瓶颈期,巨头的注意力已经全都转移到了AI上面了。可以看一看Android 15的变化,基本上没啥变化,以后的升级会越来越简单了,可能下次只是把34改成35就完事儿了。
参考资料
- Behavior changes: Apps targeting Android 14 or higher
- Use the Android SDK Upgrade Assistant
- Set up the Android 14 SDK
- How To Update Your App SDK To Target Android API Level 34
- Android14 适配之------targetSdkVersion 升级到 34 需要注意些什么?
- 升级targetSDK为33后的十来个坑 (工具篇)
- Android 14 快速适配要点
- Android 14 正式版适配笔记(二)--- 针对Android14或更高版本应用的变更
- Android 14 正式版适配笔记(一)--- 针对所有应用的变更
- 记一个 Android 14 适配引发的Android 存储权限问题
欢迎搜索并关注 公众号「稀有猿诉」 获取更多的优质文章!
原创不易,「打赏」 ,「点赞」 ,「在看」 ,「收藏」 ,「分享」 总要有一个吧!