故障排除 - Kotlin SDK
iOS/iPad OS 分配错误/可用内存不足
在可用内存很少的 iOS 或 iPad 设备中,或者使用多个 Realm 或许多通知的内存密集型应用程序中,您可能会遇到以下错误:
libc++abi: terminating due to an uncaught exception of type std::bad_alloc: std::bad_alloc
该错误通常表示由于可用内存不足而无法分配资源。
如果您正在针对 iOS15 + 或 iPad15 + 进行构建,则可以添加 扩展虚拟寻址权利 以解决此问题。
将这些键添加到属性列表中,并将值设置为 true
:
<key>com.apple.developer.kernel.extended-virtual-addressing</key> <true/> <key>com.apple.developer.kernel.increased-memory-limit</key> <true/>
在自定义 Android ROM 上的系统应用中使用
Atlas Device SDK 使用命名管道来支持通知以及从多个进程访问 Realm 文件。虽然普通用户应用程序默认允许这样做,但系统应用程序不允许这样做。
系统应用是通过在 Android 清单中设置android:sharedUserId="android.uid.system"
来定义的。 对于系统应用,您可能会在 Logcat 中看到如下所示的安全违规:
05-24 14:08:08.984 6921 6921 W .realmsystemapp: type=1400 audit(0.0:99): avc: denied { write } for name="realm.testapp.com.realmsystemapp-Bfqpnjj4mUvxWtfMcOXBCA==" dev="vdc" ino=14660 scontext=u:r:system_app:s0 tcontext=u:object_r:apk_data_file:s0 tclass=dir permissive=0 05-24 14:08:08.984 6921 6921 W .realmsystemapp: type=1400 audit(0.0:100): avc: denied { write } for name="realm.testapp.com.realmsystemapp-Bfqpnjj4mUvxWtfMcOXBCA==" dev="vdc" ino=14660 scontext=u:r:system_app:s0 tcontext=u:object_r:apk_data_file:s0 tclass=dir permissive=0
要解决此问题,您需要调整 ROM 中的 SELinux 安全规则。这可以通过使用工具audit2allow
来完成。该工具作为 AOSP 的一部分提供。
从设备中拉取当前策略:
adb pull /sys/fs/selinux/policy
。将 SELinux 错误复制到名为
input.txt
的文本文件中。运行
audit2allow
工具:audit2allow -p policy -i input.txt
。该工具应输出一条规则,您可以将其添加到现有策略中。 该规则允许您从多个进程访问 Realm 文件。
audit2allow
在编译 AOSP/ROM 时生成,并且只能在 Linux 上运行。 查看 Android 源文档 中的详细信息 。另请注意,自 Android Oreo 以来,Google 改变了配置 SELinux 的方式,默认安全策略现在更加模块化。 更多详细信息,请参阅 Android 源文档。