当前位置: 首页 > article >正文

01-17-01 API Level与版本管理机制

01-17-01 API Level与版本管理机制什么是API LevelAPI Level是Android系统的版本号每个Android版本都有唯一的API Level。源码定义// Build.javapublicclassBuild{publicstaticclassVERSION{/** * 设备的Android版本 */publicstaticfinalintSDK_INTandroid.os.Build.VERSION.SDK_INT;/** * Android版本代号 */publicstaticfinalStringRELEASEgetString(ro.build.version.release);}}API Level对应表Android版本API Level代号发布时间Android 1434Upside Down Cake2023Android 1333Tiramisu2022Android 12L32Snow Cone v22022Android 1231Snow Cone2021Android 1130Red Velvet Cake2020Android 1029Quince Tart2019Android 928Pie2018Android 8.127Oreo2017Android 8.026Oreo2017Android 7.125Nougat2016Android 7.024Nougat2016Android 6.023Marshmallow2015Android 5.122Lollipop2015Android 5.021Lollipop2014三个关键版本号1. minSdkVersion - 最低支持版本android { defaultConfig { minSdkVersion 21 // 最低支持Android 5.0 } }作用Google Play不会将应用分发给API Level低于minSdkVersion的设备低版本设备无法安装该应用选择建议API 21覆盖99%设备推荐API 23覆盖98%设备支持运行时权限API 26覆盖90%设备支持通知渠道2. targetSdkVersion - 目标版本android { defaultConfig { targetSdkVersion 34 // 目标Android 14 } }作用告诉系统我已针对这个版本进行了适配重要特性// targetSdkVersion决定系统行为// targetSdkVersion 23安装时授予所有权限// targetSdkVersion 23运行时申请危险权限// targetSdkVersion 24file:// URI可用// targetSdkVersion 24必须使用FileProvider// targetSdkVersion 29可访问外部存储// targetSdkVersion 29Scoped Storage限制// targetSdkVersion 30可查询所有已安装应用// targetSdkVersion 30需要QUERY_ALL_PACKAGES权限Google Play要求2023年8月起新应用必须targetSdkVersion 332023年11月起应用更新必须targetSdkVersion 333. compileSdkVersion - 编译版本android { compileSdkVersion 34 // 使用Android 14 SDK编译 }作用决定可以使用哪些API只影响编译不影响运行规则compileSdkVersion targetSdkVersion minSdkVersion最佳实践android { compileSdkVersion 34 // 使用最新SDK编译 defaultConfig { minSdkVersion 21 // 支持Android 5.0 targetSdkVersion 34 // 已适配Android 14 } }API Level检查机制源码实现// PackageManagerService.javaprivatevoidcheckMinSdkVersion(PackageInfoLitepkg){if(pkg.installLocationPackageInfo.INSTALL_LOCATION_INTERNAL_ONLY){if(pkg.versionCodeandroid.os.Build.VERSION_CODES.CUR_DEVELOPMENT){// 检查minSdkVersionif(pkg.minSdkVersionBuild.VERSION.SDK_INT){thrownewPackageManagerException(INSTALL_FAILED_OLDER_SDK,Requires newer sdk version #pkg.minSdkVersion);}}}}运行时检查// 检查设备API Levelif(Build.VERSION.SDK_INTBuild.VERSION_CODES.TIRAMISU){// Android 13代码registerReceiver(receiver,filter,RECEIVER_NOT_EXPORTED)}else{// Android 12及以下registerReceiver(receiver,filter)}编译时检查// 使用RequiresApi注解RequiresApi(Build.VERSION_CODES.O)funcreateNotificationChannel(){valchannelNotificationChannel(channel_id,Channel Name,NotificationManager.IMPORTANCE_DEFAULT)notificationManager.createNotificationChannel(channel)}// Lint会检查调用处是否有版本判断API变更类型1. 新增API// Android 8.0新增NotificationChannelRequiresApi(26)publicfinalclassNotificationChannel{// 新增类}2. 废弃API// Android 10废弃DeprecatedpublicStringgetDeviceId(){returnnull;}3. 移除API// Android 9移除Apache HTTP Client// import org.apache.http.client.HttpClient; // 编译失败4. 行为变更// Android 9限制明文HTTP// targetSdkVersion 28时默认禁止HTTP请求兼容性保障机制1. CTS测试# Compatibility Test Suite# 确保设备API实现符合Android规范adb shell am instrument-w\-eclass android.app.cts.ActivityManagerTest\android.app.cts/androidx.test.runner.AndroidJUnitRunner2. SDK Tools验证# Lint检查API使用./gradlew lint# 输出Warning: Call requires API level26(current min is21): NotificationChannel[NewApi]3. API Diff报告Google每次发布新版本都会生成API变更报告API Additions- 新增的APIAPI Changes- 修改的APIAPI Removals- 移除的API实战版本兼容代码条件编译classCompatActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)// 通知渠道Android 8.0if(Build.VERSION.SDK_INTBuild.VERSION_CODES.O){createNotificationChannel()}// Scoped StorageAndroid 10valimageUriif(Build.VERSION.SDK_INTBuild.VERSION_CODES.Q){MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)}else{MediaStore.Images.Media.EXTERNAL_CONTENT_URI}}RequiresApi(Build.VERSION_CODES.O)privatefuncreateNotificationChannel(){valchannelNotificationChannel(CHANNEL_ID,Default Channel,NotificationManager.IMPORTANCE_DEFAULT)valmanagergetSystemService(NotificationManager::class.java)manager.createNotificationChannel(channel)}}反射调用新API// 在minSdk 26的应用中使用NotificationChannelfuncreateChannelCompat(context:Context){if(Build.VERSION.SDK_INTBuild.VERSION_CODES.O){// 直接调用valchannelNotificationChannel(id,name,NotificationManager.IMPORTANCE_DEFAULT)context.getSystemService(NotificationManager::class.java).createNotificationChannel(channel)}else{// 低版本无需创建Channel}}常见错误错误1直接使用新API// minSdkVersion 21但直接使用API 26的类valchannelNotificationChannel(...)// 编译失败或运行时崩溃修复if(Build.VERSION.SDK_INTBuild.VERSION_CODES.O){valchannelNotificationChannel(...)}错误2targetSdkVersion过低targetSdkVersion 22 // 太低无法上架Google Play影响Google Play拒绝上架无法使用新特性用户体验差错误3compileSdkVersion低于targetSdkVersioncompileSdkVersion 30 targetSdkVersion 34 // 编译失败修复compileSdkVersion 34 targetSdkVersion 34总结API Level核心概念API LevelAndroid版本的数字标识minSdkVersion应用支持的最低系统版本targetSdkVersion应用适配的目标版本compileSdkVersion编译使用的SDK版本版本管理原则compileSdkVersion始终使用最新targetSdkVersion尽量保持最新满足Google Play要求minSdkVersion根据用户覆盖率决定推荐21新API必须加版本判断兼容性保障编译期Lint检查API使用运行期Build.VERSION.SDK_INT判断测试期CTS测试保证兼容性关键要点API Level是Android版本兼容的基石理解三个版本号的作用是编写兼容代码的前提

相关文章:

01-17-01 API Level与版本管理机制

01-17-01 API Level与版本管理机制 什么是API Level API Level是Android系统的版本号,每个Android版本都有唯一的API Level。 源码定义 // Build.java public class Build {public static class VERSION {/*** 设备的Android版本*/public static final int SDK_INT …...

终极write-good CLI指南:10个快速提升英语写作质量的命令行技巧

终极write-good CLI指南:10个快速提升英语写作质量的命令行技巧 【免费下载链接】write-good Naive linter for English prose 项目地址: https://gitcode.com/gh_mirrors/wr/write-good write-good是一款专为开发者打造的英语写作质量检查工具,它…...

如何优雅管理JetBrains IDE试用期?3种场景下的完美解决方案

如何优雅管理JetBrains IDE试用期?3种场景下的完美解决方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 你是否曾经因为JetBrains IDE试用期结束而不得不中断开发工作?当代码写到关键部…...

OpenClaw安全方案:Phi-3-vision本地处理敏感图文数据实践

OpenClaw安全方案:Phi-3-vision本地处理敏感图文数据实践 1. 为什么需要本地化处理敏感数据 去年我参与了一个医疗数据整理项目,团队需要从数千份病历扫描件中提取关键指标。最初尝试使用某知名云服务商的OCR文本分析API,却在法务审核阶段被…...

Sequel批量插入性能终极指南:如何快速处理百万级数据

Sequel批量插入性能终极指南:如何快速处理百万级数据 【免费下载链接】sequel Sequel: The Database Toolkit for Ruby 项目地址: https://gitcode.com/gh_mirrors/seq/sequel Sequel作为Ruby的强大数据库工具包,提供了高效处理数据的能力&#x…...

Tessent ATPG实战避坑:从Stuck-at到Transition Delay测试,我的向量生成与验证全流程

Tessent ATPG实战避坑指南:从Stuck-at到Transition Delay测试的完整流程解析 1. 芯片测试工程师的日常挑战 作为一名从业多年的芯片测试工程师,我深知ATPG(自动测试向量生成)工具在实际项目中的应用绝非一帆风顺。每当拿到一个新的…...

4G5G专题-85: 架构 - 5G NR空中接口与协议栈演进

1. 5G NR空中接口设计原理 5G NR(New Radio)空中接口是5G网络的核心技术之一,它直接决定了无线信号的传输效率和质量。与4G LTE相比,5G NR在设计上做了许多突破性的改进,尤其是在低延迟和高带宽场景下表现尤为突出。 1…...

vuejs-datepicker高亮日期完全指南:打造智能日历体验

vuejs-datepicker高亮日期完全指南:打造智能日历体验 【免费下载链接】vuejs-datepicker A simple Vue.js datepicker component. Supports disabling of dates, inline mode, translations 项目地址: https://gitcode.com/gh_mirrors/vu/vuejs-datepicker v…...

PHP5.2下chunk_split()函数整数溢出漏洞 分析

受影响系统&#xff1a; PHP PHP < 5.2.3 不受影响系统&#xff1a; PHP PHP 5.2.3 描述&#xff1a; -------------------------------------------------------------------------------- BUGTRAQ ID: 24261 CVE(CAN) ID: CVE-2007-2872PHP是一种流行的WEB服务器端编程语言…...

OpenClaw隐私保护:Qwen3.5-9B本地处理敏感数据的实践

OpenClaw隐私保护&#xff1a;Qwen3.5-9B本地处理敏感数据的实践 1. 为什么需要本地化处理敏感数据&#xff1f; 去年我在处理一批客户调研报告时&#xff0c;曾遇到一个尴尬场景&#xff1a;当我把包含联系方式和消费习惯的Excel表格上传到某云端AI分析平台后&#xff0c;突…...

论文阅读:arxiv 2026 From Assistant to Double Agent: Formalizing and Benchmarking Attacks on OpenClaw for

总目录 大模型安全研究论文整理 2026年版&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/159047894 From Assistant to Double Agent: Formalizing and Benchmarking Attacks on OpenClaw for Personalized Local AI Agent https://arxiv.org/abs/2602.08412 该…...

深入理解xcode-install的实现原理:Ruby CLI工具开发最佳实践

深入理解xcode-install的实现原理&#xff1a;Ruby CLI工具开发最佳实践 【免费下载链接】xcode-install &#x1f53d; Install and update your Xcodes 项目地址: https://gitcode.com/gh_mirrors/xc/xcode-install xcode-install是一款高效的Ruby CLI工具&#xff0c…...

OpenClaw多通道接入:Qwen3-4B同时服务飞书与钉钉机器人

OpenClaw多通道接入&#xff1a;Qwen3-4B同时服务飞书与钉钉机器人 1. 为什么需要多通道接入&#xff1f; 上周我遇到一个尴尬场景&#xff1a;团队部分成员用飞书沟通&#xff0c;另一些用钉钉。当我尝试用OpenClaw搭建自动化助手时&#xff0c;发现默认配置只能对接单一平台…...

论文阅读:arxiv 2026 Uncovering Security Threats and Architecting Defenses in Autonomous Agents: A Case S

总目录 大模型安全研究论文整理 2026年版&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/159047894 Uncovering Security Threats and Architecting Defenses in Autonomous Agents: A Case Study of OpenClaw https://arxiv.org/abs/2603.12644 该论文《Uncov…...

ZString与System.Text.Json集成:零分配JSON序列化的终极方案

ZString与System.Text.Json集成&#xff1a;零分配JSON序列化的终极方案 【免费下载链接】ZString Zero Allocation StringBuilder for .NET and Unity. 项目地址: https://gitcode.com/gh_mirrors/zs/ZString ZString是.NET和Unity平台的零分配高性能字符串构建库&…...

Mongoose OS项目部署清单:从开发到生产的完整流程

Mongoose OS项目部署清单&#xff1a;从开发到生产的完整流程 【免费下载链接】mongoose-os Mongoose OS - an IoT Firmware Development Framework. Supported microcontrollers: ESP32, ESP8266, CC3220, CC3200, STM32F4, STM32L4, STM32F7. Amazon AWS IoT, Microsoft Azur…...

OpenClaw权限管理:千问3.5-35B-A3B-FP8操作范围最小化实践

OpenClaw权限管理&#xff1a;千问3.5-35B-A3B-FP8操作范围最小化实践 1. 为什么需要限制OpenClaw的权限 去年夏天&#xff0c;我在本地部署OpenClaw对接千问3.5模型时&#xff0c;曾因为一个简单的文件整理指令差点酿成大祸。当时我让AI帮我整理下载文件夹&#xff0c;结果它…...

打造 AI 冒险团:HagiCode 多 Agent 协作配置实战派

MySQL 中的 count 三兄弟&#xff1a;效率大比拼&#xff01; 一、快速结论&#xff08;先看结论再看分析&#xff09; 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的&#xff01;我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄弟…...

NBIO Websocket支持:通过Autobahn测试套件的完整指南

NBIO Websocket支持&#xff1a;通过Autobahn测试套件的完整指南 【免费下载链接】nbio Pure Go 1000k connections solution, support tls/http1.x/websocket and basically compatible with net/http, with high-performance and low memory cost, non-blocking, event-drive…...

嵌入式飞控信号滤波:SMA/EMA/互补滤波与卡尔曼简化实现

1. NexgenFilter 库概述&#xff1a;面向嵌入式飞行控制的轻量级信号处理工具集NexgenFilter 是专为 Nexgen Magpie 无人机飞控系统设计的一套高性能、低开销数字滤波与噪声生成库。它并非通用 DSP 库&#xff0c;而是深度嵌入在实时性严苛、资源受限的 MCU&#xff08;如 STM3…...

如何用readme.so快速制作专业README:揭秘实时预览与Markdown同步技术

如何用readme.so快速制作专业README&#xff1a;揭秘实时预览与Markdown同步技术 【免费下载链接】readme.so An online drag-and-drop editor to easily build READMEs 项目地址: https://gitcode.com/gh_mirrors/re/readme.so readme.so是一款功能强大的在线拖放编辑器…...

React Express渲染模式终极指南:Render Props与自定义Hook的对比分析

React Express渲染模式终极指南&#xff1a;Render Props与自定义Hook的对比分析 【免费下载链接】react-express Learn React through interactive examples 项目地址: https://gitcode.com/gh_mirrors/re/react-express 想要在React中实现组件逻辑复用&#xff1f;Ren…...

Go 限流器性能优化终极指南:避免缓存伪共享的 padding 策略

Go 限流器性能优化终极指南&#xff1a;避免缓存伪共享的 padding 策略 【免费下载链接】ratelimit A Go blocking leaky-bucket rate limit implementation 项目地址: https://gitcode.com/gh_mirrors/ra/ratelimit 在 Go 高性能限流器开发中&#xff0c;go.uber.org/r…...

OpenClaw+百川2-13B量化模型:个人知识库自动整理实战指南

OpenClaw百川2-13B量化模型&#xff1a;个人知识库自动整理实战指南 1. 为什么需要自动化知识管理 作为一名独立研究者&#xff0c;我常年被两个问题困扰&#xff1a;一是收集的文献资料散落在不同文件夹&#xff0c;每次找文件都要经历"考古式搜索"&#xff1b;二…...

ExcelCPU安全指南:在电子表格中运行代码的5大风险与防护策略

ExcelCPU安全指南&#xff1a;在电子表格中运行代码的5大风险与防护策略 【免费下载链接】excelCPU 16-bit CPU for Excel, and related files 项目地址: https://gitcode.com/gh_mirrors/ex/excelCPU ExcelCPU是一个创新的16位CPU模拟器&#xff0c;完全在Excel电子表格…...

开发者利器:OpenClaw+Qwen3.5-9B-AWQ-4bit自动生成UI设计文档

开发者利器&#xff1a;OpenClawQwen3.5-9B-AWQ-4bit自动生成UI设计文档 1. 为什么我们需要自动化设计文档 作为一名长期奋战在一线的开发者&#xff0c;我深知设计交接环节的痛点。每次收到Figma设计稿后&#xff0c;手动整理设计规范、提取颜色代码、记录组件结构要耗费数小…...

Braft Editor图片处理优化:拖拽调整大小与等比例缩放的终极指南

Braft Editor图片处理优化&#xff1a;拖拽调整大小与等比例缩放的终极指南 【免费下载链接】braft-editor 美观易用的React富文本编辑器&#xff0c;基于draft-js开发 项目地址: https://gitcode.com/gh_mirrors/br/braft-editor Braft Editor是一款基于React和Draft.j…...

OpenClaw模型热切换方案:Qwen2.5-VL-7B与其他模型无缝交替使用

OpenClaw模型热切换方案&#xff1a;Qwen2.5-VL-7B与其他模型无缝交替使用 1. 为什么需要模型热切换&#xff1f; 去年夏天&#xff0c;我接手了一个跨部门协作项目&#xff0c;需要同时处理技术文档摘要、会议纪要整理和社交媒体图片分析三种任务。最初用单一模型处理所有需…...

百川2-13B-4bits量化模型+OpenClaw:自动化测试报告生成器

百川2-13B-4bits量化模型OpenClaw&#xff1a;自动化测试报告生成器 1. 为什么需要自动化测试报告生成 每次代码提交后&#xff0c;看着CI/CD流水线里密密麻麻的JUnit测试报告&#xff0c;我都会陷入一种"数据过载"的焦虑。特别是当测试用例失败时&#xff0c;需要…...

色彩心理学与品牌情感:vibrant.js颜色提取终极指南 [特殊字符]

色彩心理学与品牌情感&#xff1a;vibrant.js颜色提取终极指南 &#x1f3a8; 【免费下载链接】vibrant.js Extract prominent colors from an image. JS port of Androids Palette. 项目地址: https://gitcode.com/gh_mirrors/vi/vibrant.js 在数字时代&#xff0c;色彩…...