uni-app 离线打包调整targetSdkVersion 34时打出的包启动时闪退报SecurityException

发布于 1周前 作者 ionicwang 来自 Uni-App

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.gradletargetSdkVersion 改为 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
...

5 回复

升级到最新版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导致的闪退问题。如果问题依旧存在,建议查看具体的异常堆栈信息,并根据提示进一步调整配置或代码。

回到顶部