Android 7.0 Native 由于 sqlcipher 库和 NDK 限制而崩溃

Android 7.0 Native crashes due to sqlcipher library and NDK restrictions

我在 Android 7.0 Samsung S8 上收到以下崩溃以及许多其他此类本机崩溃:

backtrace:
#00  pc 000000000005da7c  /system/lib64/libbinder.so (_ZN7android6Parcel14freeDataNoInitEv+16)
#01  pc 00000000000f8538  /system/lib64/libandroid_runtime.so
#02  pc 0000000002a4fa24  /system/framework/arm64/boot-framework.oat (android.os.Parcel.nativeDestroy+128)
#03  pc 0000000002a4ee10  /system/framework/arm64/boot-framework.oat (android.os.Parcel.destroy+76)
#04  pc 0000000002a5396c  /system/framework/arm64/boot-framework.oat (android.os.Parcel.finalize+40)
#05  pc 000000000068a6e0  /system/framework/arm64/boot-core-libart.oat (java.lang.Daemons$FinalizerDaemon.doFinalize+140)
#06  pc 000000000068a9bc  /system/framework/arm64/boot-core-libart.oat (java.lang.Daemons$FinalizerDaemon.runInternal+520)
#07  pc 000000000068a054  /system/framework/arm64/boot-core-libart.oat (java.lang.Daemons$Daemon.run+96)
#08  pc 000000000065fda0  /system/framework/arm64/boot.oat (java.lang.Thread.run+60)
#09  pc 00000000000d25b4  /system/lib64/libart.so (art_quick_invoke_stub+580)
#10  pc 00000000000df6e4  /system/lib64/libart.so (_Z N3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+212)
#11  pc 0000000000475fc4  /system/lib64/libart.so (_ZN3artL18InvokeWithArgArrayERKNS_33ScopedObjectAccessAlreadyRunnableEPNS_9ArtMethodEPNS_8ArgArrayEPNS_6JValueEPKc+108)
#12  pc 0000000000477598  /system/lib64/libart.so (_ZN3art35InvokeVirtualOrInterfaceWithJValuesERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectP10_jmethodIDP6jvalue+372)
#13  pc 00000000004988a8  /system/lib64/libart.so (_ZN3art6Thread14CreateCallbackEPv+1104)
#14  pc 00000000000770f4  /system/lib64/libc.so (_ZL15__pthread_startPv+204)
#15  pc 000000000001e7d0  /system/lib64/libc.so (__start_thread+16)

此崩溃记录在 Play 商店中。它会针对我们在 Play 商店中提供的每个构建更新不断重复。

我的应用程序使用了以下库,这是唯一使用 NDK 中的 jni 代码的库。

compile 'net.zetetic:android-database-sqlcipher:3.5.9@aar'
compile 'org.greenrobot:greendao:3.0.1'

SQLCipher Library from Github

Greendao Library from Github

NDK Restrictions on Android 7.0

请帮助解决这个崩溃问题。我的应用程序每天都在增加。 见下图:

Github Issue Link

该错误应该与 NDK 限制无关。只是系统 IPC 模块 libbinder 在发布 Parcel 时崩溃(您可以在此处查看源代码 https://android.googlesource.com/platform/frameworks/native/+/nougat-mr1.7-release/libs/binder/Parcel.cpp)。

Parcel/Intent检查send/receive数据在哪里,并确认这些地方没有错误。

此外,此类崩溃很有可能仅在特定情况下发生,例如当系统强行终止您的应用程序时 - 如果是这种情况,那么您可能与该错误无关。

请确认您没有在共享首选项或本地 sqlite 数据库等持久性存储中存储任何 Parcelable 对象。

Parcel 不是通用序列化机制。这个 class(以及相应的 Parcelable API 用于将任意对象放入 Parcel)被设计为高性能 IPC 传输。因此,将任何 Parcel 数据放入持久存储是不合适的:更改 Parcel 中任何数据的底层实现都会导致旧数据不可读。