gpt4 book ai didi

由于磁盘加密,Android Crashlytics 在直接启动时失败

转载 作者:太空狗 更新时间:2023-10-29 13:03:47 27 4
gpt4 key购买 nike

Android Crashlytics 在 Android 上直接启动时将无法初始化。问题在于,在用户输入其凭据之前,Android 中支持上下文的默认存储是加密的:

https://developer.android.com/reference/android/content/Context.html#createDeviceProtectedStorageContext()

你会在日志中看到一堆信息,比如

07-17 16:47:18.083 1897-1982/XXX E/SharedPreferencesImpl: Couldn't create directory for SharedPreferences file /data/user/0/com.xxx.xxx/shared_prefs/com.crashlytics.sdk.android:answers:settings.xml

还通过使用 Fabric.Builder 注册一个 initializationCallback 来验证

有什么方法可以通过 createDeviceProtectedStorageContext 存储配置 crashlytics 使用共享首选项后端?

问题是,如果应用程序以这种方式在启动时启动,那么 crashlytics 将无法在应用程序的整个生命周期内工作。这可能会导致遗漏大量崩溃报告。

最佳答案

基本上它会失败,因为像 Crashlytics 这样的库会调用 getBaseContext,这会使 createDeviceProtectedStorageContext 无效。对于 Crashlytics,它还期望 getApplicationContext 返回一个 Application。这是完整的解决方法。

实现以下类:(将其翻译成 Java 应该不会太难)

@SuppressLint("Registered")
@TargetApi(24)
class DeviceStorageApp(context: Context) : Application() {
init {
attachBaseContext(context.createDeviceProtectedStorageContext())
}

/**
* Thou shalt not get the REAL underlying application context which would no
* longer be operating under device protected storage.
*/
override fun getApplicationContext(): Context = this
}

AndroidManifest.xml 中禁用自动初始化:

<meta-data android:name="firebase_crashlytics_collection_enabled"
android:value="false"/>

然后在您真正的 Application.onCreate 中,执行此操作:(省略 Android SDK 版本检查)

Fabric.with(DeviceStorageApp(this), Crashlytics())

完整示例:https://github.com/Mygod/VPNHotspot/commit/2578c1c6ec67a8b9c7274c6f0e0f47ed030a6813

编辑:如果您想使用远程配置等 Firebase 功能,您可能还需要将这些添加到您的 AndroidManifest.xml 中。 (你可能想要添加这个,因为这只是一个 stub 服务)

<service android:name="com.google.firebase.components.ComponentDiscoveryService"
android:directBootAware="true"/>

关于由于磁盘加密,Android Crashlytics 在直接启动时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51377089/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com