uni-app 离线打包调整targetSdkVersion 34时打出的包启动时闪退报SecurityException
uni-app 离线打包调整targetSdkVersion 34时打出的包启动时闪退报SecurityException
信息类别 | 详情 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Mac |
PC版本号 | macOS 14.4.1 |
HBuilderX | 正式 |
HBuilderX版本 | 3.8.7 |
手机系统 | Android |
手机版本号 | Android 14 |
手机厂商 | 小米 |
手机机型 | 小米12 |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 离线 |
项目创建方式 | HBuilderX |
操作步骤:
- 将
app/build.gradle
的targetSdkVersion
改为 34。 - 在Android Studio点击运行到手机。
- 手机上App启动后闪退。
预期结果:
- App正常打开。
实际结果:
- App在闪屏页面就闪退了, 报出SecurityException的异常。
bug描述:
本App的targetSdkVersion
为30时在各种Android设备上都是正常的运行, 但是提交到Google Play商店, 需要将targetSdkVersion
改为34, 打包后, 在Android 14 (SDK 34) 启动页面闪退。
Google developer上 Android 14的升级说明: https://developer.android.com/about/versions/14/behavior-changes-14?hl=zh-cn#runtime-receivers-exported
在运行时注册的广播接收器必须指定导出行为 以 Android 14(API 级别 34)或更高版本为目标平台并使用上下文注册的接收器的应用和服务必须指定一个标志,以指明接收器是否应导出到设备上的所有其他应用:分别为 RECEIVER_EXPORTED 或 RECEIVER_NOT_EXPORTED。此要求有助于利用 Android 13 中引入的这些接收器的功能,保护应用免受安全漏洞的影响。
报错信息:
2024-09-30 14:27:37.321 1052-1052/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.ola100.app2, PID: 1052
java.lang.SecurityException: com.ola100.app2: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts
...
升级到最新版HBuilderX重新打包试下
楼主解决了吗
还没有, 最近几天没处理
遇到一样的问题,有解决方案吗?
在处理uni-app离线打包并调整targetSdkVersion
到34时遇到的SecurityException
闪退问题,通常与Android系统权限管理、组件安全配置等相关。由于具体异常信息未提供,我将给出一个常见的安全配置检查和调整的代码案例,这有助于解决一些常见的安全异常。
1. 检查AndroidManifest.xml
首先确保AndroidManifest.xml
中的权限声明和组件配置正确。例如,如果你的应用需要访问网络,确保有以下权限声明:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2. 调整Provider配置
从Android 8.0(API级别26)开始,对于ContentProvider
,如果其exported
属性未明确设置,系统会抛出SecurityException
。检查你的应用中是否有ContentProvider
,并确保其exported
属性被正确设置:
<provider
android:name=".YourProvider"
android:authorities="com.example.yourapp.provider"
android:exported="false"> <!-- 根据需要设置为true或false -->
</provider>
3. 使用queries
元素处理隐式Intent
从Android 11(API级别30)开始,对于隐式Intent调用,如果目标组件不在同一个应用或签名域中,需要在AndroidManifest.xml
中添加queries
元素来声明你希望查询的组件:
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="image/*" />
</intent>
<package android:name="com.example.anotherapp" /> <!-- 需要访问的第三方应用包名 -->
</queries>
4. 动态权限请求
如果你的应用需要动态权限(如相机、存储访问等),确保在运行时正确请求这些权限。这里是一个简单的权限请求示例:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA);
}
5. 调试和日志
使用Android Studio的Logcat查看详细的异常堆栈信息,这可以帮助你更准确地定位问题。异常信息通常会指出是哪个组件或权限导致了SecurityException
。
通过上述步骤,你应该能够定位并解决因targetSdkVersion
升级到34后遇到的SecurityException
导致的闪退问题。如果问题依旧存在,建议查看具体的异常堆栈信息,并根据提示进一步调整配置或代码。