实战技巧:Android 14适配从挂号到出院

news2024/11/17 20:03:31

公众号「稀有猿诉」        原文链接 实战技巧:Android 14适配从挂号到出院

啥?这都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代开外的。

  • Android Distribution Chart
  • Distribution dashboard
  • Mobile Android Version Market Share Worldwide

最心急的当然是谷歌,辛苦花大价钱开发的最新特性竟然没人用,这能忍?于是谷歌对升级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。例如:

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 存储权限问题

欢迎搜索并关注 公众号「稀有猿诉」 获取更多的优质文章!

原创不易,「打赏」「点赞」「在看」「收藏」「分享」 总要有一个吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue网上商城系统的设计与实现

系统介绍 随着社会的不断进步与发展,人们经济水平也不断的提高,于是对各行各业需求也越来越高。特别是从2019年新型冠状病毒爆发以来,利用计算机网络来处理各行业事务这一概念更深入人心,由于用户工作繁忙的原因,去商…

《看漫画学C++》背后的故事1:艺术与科技的结合

引言: 在数字化浪潮中,艺术与科技的结合催生了无数创新。《看漫画学C》正是这一跨界合作的产物,它不仅是一本编程书籍,更是艺术与科技融合的典范。 一、相遇: 科技与艺术的火花作为一名专注于技术的软件程序员&…

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为: Python函数的黑魔法:递归,嵌套函数与装饰器 个人主页:CILMY23-CSDN博客 系列专栏:Python | C | C语言 | 数据结构与算法 感谢观看,支持的可以给个一键三连&#xff…

五、e2studio VS STM32CubeIDE之汉化

目录 一、概述/目的 二、stm32cubeide汉化 2.1 在线下载安装汉化插件 2.2 直接安装汉化包(推荐) 三、e2studio STM32CubeIDE中英文切换 五、e2studio VS STM32CubeIDE之汉化 一、概述/目的 介绍stm32cubeide汉化方案和汉化包 e2studio自带汉化包,在安装过程中…

代理IP供应商的代理池大小怎么看?

代理池作为网络爬虫、数据采集和隐私保护等领域中的重要工具,扮演着连接真实网络和爬虫之间的桥梁。代理池的大小是影响其性能和可用性的关键因素之一。在这篇文章中,我们将深入探讨代理池的大小对业务的影响,并探讨在不同情况下如何选择合适…

AI-数学-高中-43常见函数的导数

原作者视频:【导数】【一数辞典】2常见函数的导数_哔哩哔哩_bilibili

OpenHarmony语言基础类库【@ohos.url (URL字符串解析)】

说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import Url from ohos.url URLParams9 URLParams接口定义了一些处理URL查询字符串的实用方法。 constructor9 constructor(init?…

【注释和反射】类加载的过程

继上一篇博客【注释和反射】获取class类实例的方法-CSDN博客 目录 三、类加载的过程 例子 三、类加载的过程 在Java虚拟机(JVM)中,类加载是一个将类的字节码文件从文件系统或其他来源加载到JVM的内存中,并将其转换为类或接口的…

SEW减速机参数查询 2-2 实践

首先说说结论:在不和SEW官方取得沟通之前,你几乎无法直接通过查阅SEW官方文档得到相关减速机的所有技术参数:比如轴的模数和齿数,轴承的参数。我在周一耗费了一个上午,最终和SEW方面确认后才知晓相关技术参数需要凭借销…

LeetCode 1052. 爱生气的书店老板

题目链接 https://leetcode.cn/problems/grumpy-bookstore-owner/description/?envTypedaily-question&envId2024-04-23 先把最初的满意人数累加算出来,然后使用滑动窗口来模拟连续 minutes分钟不生气,计算不生气minutes分钟最大的满意数 class S…

2010-2023年“国家级大数据综合试验区”试点城市DID匹配数据

2010-2023年国家级大数据综合试验区试点城市DID匹配数据 1、时间:2010-2023年 2、来源:国家发展改革委、工业和信息化部、ZY网信办发函批复的试验区 3、指标:行政区划代码、年份、所属省份、地区、国家级大数据综合试验区、最早设立年份 …

基于Google Gemini 探索大语言模型在医学领域应用评估和前景

概述 近年来,大规模语言模型(LLM)在理解和生成人类语言方面取得了显著的飞跃,这些进步不仅推动了语言学和计算机编程的发展,还为多个领域带来了创新的突破。特别是模型如GPT-3和PaLM,它们通过吸收海量文本…

面试遇到算法题:实现LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 这是一道大厂面试高频出现的算法题,难度为⭐️⭐️⭐️,属于中等,老铁们来一起看看这个题该怎么解? 1. 原题再现 没有废话,翠花,上酸菜&…

LeetCode:2385. 感染二叉树需要的总时间(DFS Java)

目录 2385. 感染二叉树需要的总时间 题目描述: 实现代码与解析: DFS 原理思路: 2385. 感染二叉树需要的总时间 题目描述: 给你一棵二叉树的根节点 root ,二叉树中节点的值 互不相同 。另给你一个整数 start 。在第…

Simulink从0搭建模型03-Enabled Subsystem 使能子系统

参考博客 b站视频 【Simulink 0基础入门教程 P4 使能子系统 Enabled Subsystem 的使用介绍】 个人听了这个博主的视频风格觉得很适合我入门学习,讲得很清楚。 另外,视频里面教得很详细了,我也不会再详细写怎么打开创建等步骤,跟着…

QT中对于QPushButton样式的调整

文章目录 前言1.QPushButton1.1 新建项目导入资源1.2 添加Push Button并定义样式1.3 调整样式1.4 实际需求情况1.5 背景色和边框 2. 一些概念理解2.1 图片2.2 边距 总结 前言 前段时间在调软件的样式,学到了些新的东西,也碰到了些问题,这里做…

电脑遗失d3dx9_43.dll文件会给电脑带来什么问题,有哪些方法可以解决丢失d3dx9_43.dll文件的办法

电脑遗失了d3dx9_43.dll文件,可能会引发一系列麻烦的后果。那么,针对这种情况,我们应该采取哪些方法来修复丢失的d3dx9_43.dll文件呢?下面将介绍几种解决d3dx9_43.dll文件丢失问题的有效方法。 对d3dx9_43.dll文件的简要介绍 d3d…

Flutter 中优雅切换应用主题的组件

Flutter 中优雅切换应用主题的组件 视频 https://youtu.be/L–XLpc452I https://www.bilibili.com/video/BV1wD421n75p/ 前言 原文 https://ducafecat.com/blog/flutter-app-theme-switch Adaptive Theme 这个组件通过包裹 MaterialApp 的方式整体管理 theme 主题&#xff0…

Linux中Ctrl+C和Ctrl+Z的区别_实战讲解(超详细)

1、CtrlC和CtrlZ的区别: CtrlZ:暂停进程 即挂起进程 暂停当前进程并将其放到后台。可以在后续恢复执行。 暂停的进程仍然占用系统内存 CtrlC:终止进程 终止进程后,程序代码占用的内存会释放掉 2、实战讲解 跑人工智能代码的时候…

Ts类型体操详讲 之 extends infer (下)

目录 1、函数 (1)提取参数类型 (2)提取返回值类型 2、构造器 (1)提取构造器返回值 (2)提取构造器参数类型 3、索引类型 本章我们继续上节的内容继续,展示我们对ex…