修改Target SDK Version至29后,Android 10/9设备无法运行求助
从你提供的apktool.yml和AndroidManifest.xml来看,主要存在几个targetSdkVersion 29(Android 10)适配相关的问题,以及Manifest的缺失配置,下面逐一说明:
1. AndroidManifest.xml 缺失 <uses-sdk> 标签
你的Manifest文件里没有声明<uses-sdk>节点,虽然apktool.yml里已经配置了minSdkVersion和targetSdkVersion,但系统在解析APP时,优先以Manifest里的配置为准。缺失这个标签可能导致设备无法正确识别APP的兼容范围,甚至出现安装或运行异常。
解决方案:在<manifest>根标签下添加该节点:
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="29" />
2. Scoped Storage 适配问题(针对 WRITE_EXTERNAL_STORAGE 权限)
Android 10(API29)引入了Scoped Storage机制,默认限制APP访问公共外部存储。你的Manifest里声明了WRITE_EXTERNAL_STORAGE权限,但如果没有配置兼容开关,APP在Android 10+设备上将无法正常读写公共存储(比如DCIM、Download目录)。
解决方案:在<application>标签中添加兼容属性,临时启用旧的存储行为(如果暂时不想迁移到Scoped Storage):
<application ... android:requestLegacyExternalStorage="true"> ... </application>
如果后续打算适配Scoped Storage,可以逐步替换为MediaStore或APP私有目录的API,移除这个属性。
3. READ_PHONE_STATE 权限的动态申请要求
READ_PHONE_STATE在API29及以上属于危险权限,仅在Manifest里静态声明是不够的,必须在代码中向用户动态申请该权限,否则APP在Android 10+设备上无法获取到设备状态信息(比如IMEI),会触发权限异常。
解决方案:在APP启动或使用相关功能前,添加动态权限申请逻辑,示例伪代码:
// 检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // 申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_CODE_PHONE_STATE); }
同时要处理权限申请的回调结果,确保权限通过后再执行相关操作。
4. 潜在的其他适配点(需要根据APP功能确认)
明文HTTP请求限制:如果你的APP需要访问HTTP(非HTTPS)接口,API28及以上默认禁止明文请求,需要在
<application>标签添加:android:usesCleartextTraffic="true"或者创建
res/xml/network_security_config.xml配置允许特定域名的明文请求。后台启动Activity限制:API29开始,APP在后台状态下无法直接启动Activity,除非满足特定场景(比如通知点击、闹钟触发等)。如果你的APP有后台启动页面的逻辑,需要调整为符合系统规则的实现方式。
DISABLE_KEYGUARD权限的替代方案:API29推荐使用
KeyguardManager的requestDismissKeyguard()方法替代直接使用DISABLE_KEYGUARD权限,旧的权限方式在新版本系统上可能被限制。
总结需要添加/修改的内容
- 向AndroidManifest.xml添加
<uses-sdk>标签 - 向
<application>标签添加android:requestLegacyExternalStorage="true"(适配存储) - 在代码中添加
READ_PHONE_STATE的动态权限申请逻辑 - (可选)添加明文HTTP兼容配置(如果需要)
完成这些修改后,重新构建并签名APK,就能更好地适配Android 10及以上设备了。
内容的提问来源于stack exchange,提问作者samsam114

