一)将 targetSdkVersion
提高后,需要适配 Android 新版本的行为变更(Behavior Changes),以确保应用在更高版本的系统中正常运行。以下是主要适配点(以最新 Android 版本为例):
关键适配项(按版本分类)
Android 14(API 34)
-
前台服务类型(Foreground Service)
-
必须声明具体的前台服务类型(如
camera
、location
),否则会抛出异常。 -
适配方法:在
AndroidManifest.xml
中声明<uses-permission>
并指定android:foregroundServiceType
。
-
-
隐式广播限制
-
针对非导出(
exported=false
)的广播接收器,限制接收隐式广播。 -
适配方法:使用显式 Intent 或动态注册广播。
-
-
照片和视频选择器
-
访问用户媒体文件需使用系统选择器(
PhotoPicker
),而非直接请求READ_MEDIA_IMAGES
权限。
-
-
非线性字体缩放
-
默认禁止非系统字体缩放超过 2.0,需适配
dp
单位或检查布局。
-
Android 13(API 33)
-
通知权限(POST_NOTIFICATIONS)
-
新增运行时通知权限,需动态请求
Manifest.permission.POST_NOTIFICATIONS
。
-
-
附近 Wi-Fi 设备权限
-
访问附近 Wi-Fi 设备需申请
NEARBY_WIFI_DEVICES
权限,替代ACCESS_FINE_LOCATION
。
-
-
Intent 过滤器限制
-
向其他应用的未导出组件发送 Intent 会失败,需对方组件标记为
exported=true
或使用PendingIntent
。
-
Android 12(API 31)
-
PendingIntent 可变性
-
必须显式声明
PendingIntent
的可变性(FLAG_IMMUTABLE
或FLAG_MUTABLE
)。
-
-
大致位置(BLUETOOTH_SCAN)
-
蓝牙扫描需声明
android:usesPermissionFlags="neverForLocation"
以避免定位权限。
-
-
前台服务启动限制
-
后台应用启动前台服务需添加
HIGH_QUALITY
服务类型。
-
Android 11(API 30)
-
分区存储(Scoped Storage)
-
默认限制访问外部存储,需使用
MediaStore
或申请MANAGE_EXTERNAL_STORAGE
(需上架审核)。
-
-
单次权限(One-time permissions)
-
用户可选择授予临时权限(如位置),需处理权限失效后的逻辑。
-
Android 10(API 29)
-
设备标识符限制
-
禁止非特权应用访问
IMEI
等设备标识符,需使用ANDROID_ID
或广告 ID。
-
-
后台位置权限
-
需动态请求
ACCESS_BACKGROUND_LOCATION
并说明用途。
-
通用适配步骤
-
测试兼容性
-
在真机或模拟器上测试高版本系统的行为变更。
-
使用
adb
命令模拟权限变更(如adb shell pm revoke <package> android.permission.XXX
)。
-
-
检查清单文件
-
更新
<uses-permission>
和<uses-feature>
声明。 -
确保
android:exported
属性显式定义(Android 12+ 强制要求)。
-
-
更新第三方库
-
确保依赖库支持高版本
targetSdkVersion
(如 Glide、OkHttp、Firebase)。
-
-
处理权限回调
-
适配
ActivityResultLauncher
(替代onRequestPermissionsResult
)。
-
示例代码(Android 13 通知权限)
java
复制
// 检查并请求通知权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);} }
注意事项
-
逐步升级:建议逐个版本升级(如从 30 → 31 → 33),而非直接跳到最新。
-
官方文档:参考 Android 行为变更文档 获取完整列表。
通过以上适配,可以避免因 targetSdkVersion
升级导致的崩溃或功能异常。
二)Android 12 targetSdkVersion 31兼容性修改指南
当将 targetSdkVersion
升级到 31(Android 12) 时,需要重点关注以下兼容性修改点,以确保应用在新版本上的正常运行:
1. 精确的组件导出(Exported Components)
问题:Android 12 要求所有声明 <intent-filter>
的组件(Activity、Service、Receiver)必须显式设置 android:exported="true|false"
。
修改:
在 AndroidManifest.xml
中为相关组件添加 exported
属性:
xml
复制
<activityandroid:name=".MyActivity"android:exported="true"> <!-- 明确是否需要被其他应用访问 --><intent-filter><action android:name="android.intent.action.VIEW" /></intent-filter> </activity><receiverandroid:name=".MyBroadcastReceiver"android:exported="false"> <!-- 仅内部使用 --> </receiver>
运行 HTML
2. 蓝牙权限变更
问题:Android 12 引入了新的蓝牙权限 BLUETOOTH_SCAN
、BLUETOOTH_ADVERTISE
和 BLUETOOTH_CONNECT
,替代旧的 BLUETOOTH
和 BLUETOOTH_ADMIN
。
修改:
-
在
AndroidManifest.xml
中声明所需权限:xml
复制
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
运行 HTML
-
动态请求权限(针对 Android 12+ 设备):
java
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {requestPermissions(new String[]{Manifest.permission.BLUETOOTH_SCAN,Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_CODE); }
3. 前台服务启动限制
问题:Android 12 禁止后台应用启动前台服务(少数特殊情况除外)。
修改:
-
使用
startForegroundService()
时,确保从用户可见的上下文(如 Activity)调用。 -
考虑使用 WorkManager 替代后台任务。
4. 自定义通知样式变更
问题:Android 12 要求自定义通知必须提供标准模板(如 Notification.DecoratedCustomViewStyle
)。
修改:
在创建通知时添加样式:
java
复制
Notification.Builder(context, CHANNEL_ID).setSmallIcon(R.drawable.icon).setContentTitle("Title").setContentText("Message").setStyle(new Notification.DecoratedCustomViewStyle()) // 添加默认样式.build();
5. 应用休眠(App Hibernation)
问题:如果用户长时间未使用应用,系统会自动重置其运行时权限并强制停止应用。
修改:
-
在关键操作前检查权限是否被撤销:
java
复制
if (checkSelfPermission(Manifest.permission.CAMERA) != PERMISSION_GRANTED) {// 重新请求权限 }
6. 隐私仪表板与麦克风/摄像头访问
问题:Android 12 在状态栏显示麦克风/摄像头使用指示器,并允许用户通过快捷设置禁用访问。
修改:
-
在访问麦克风或摄像头前,检查硬件是否可用:
java
复制
PackageManager pm = getPackageManager(); boolean hasCamera = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
-
处理用户突然禁用权限的情况(捕获
SecurityException
)。
7. 兼容性测试建议
-
测试组件导出:确保无用的组件未意外暴露(安全风险)。
-
测试蓝牙功能:验证新权限是否正常工作。
-
模拟应用休眠:通过命令强制休眠应用测试恢复逻辑:
bash
复制
adb shell am suspend com.your.package
其他注意事项
-
PendingIntent 可变性:Android 12 要求明确指定
PendingIntent
的 mutability(FLAG_IMMUTABLE
或FLAG_MUTABLE
)。 -
新的应用启动动画:适配新的启动画面(Splash Screen API)。
-
性能分析:使用 Android Studio 的 Profiler 检测升级后的性能影响。
通过以上修改,可以确保应用在 Android 12 上保持兼容性和用户体验。建议参考 官方迁移指南 获取完整细节。