1

Firebase docsから、彼らは次のように述べています。

複数のプロセス

Crash Reporting は、クラッシュ情報をアップロードするための別のバックグラウンド プロセスを作成します。アプリが Android Application クラスを拡張する場合は、マルチプロセス セーフであることを確認する必要があります。そうしないと、同時実行の問題が発生する可能性があります。アプリが Application オブジェクトを拡張すると、このオブジェクトはマルチプロセス アプリのプロセスごとにインスタンス化されます。注意すべき重要な点は次の 2 つです。

このオブジェクトの実装がプロセス外の状態 (データベース、ファイル システム、共有設定など) にアクセスする場合、またはマルチプロセス環境にとって安全ではないその他のアクションを実行する場合、同時実行の問題が発生する可能性があります。これは、Application オブジェクトの複数のインスタンスが同時に実行される可能性があるためです。多くのサードパーティ ライブラリは、プロセス外の状態 (ローカル データベースなど) を保持し、Application オブジェクトから初期化された場合、同じ同時実行の問題の影響を受けます。アプリが上記の説明に適合し、アプリで Crash Reporting を使用する予定がある場合は、アプリケーション ロジックをコンテンツ プロバイダーまたは Android アクティビティに移動することを検討することを強くお勧めします。マルチプロセス環境で安全でないアプリケーション ロジックは、アプリに予期しない影響を与える可能性があります。

または他のインスタンスとのクラッシュを避けるために、クラス内に別のインスタンスがあるかどうかをApplication クラスから確認するにはどうすればよいですか?Application onCreateFabric

4

1 に答える 1

4

一般的に言えば、別のプロセスから別の Application オブジェクトがあるかどうかを「確認する」ことはありません。アプリ内のすべてのプロセスに対して常に 1 つの Application オブジェクトが作成されると想定し、他のプロセス内の他の Applications オブジェクトと組み合わせて実行しても安全であることを確認してください。アプリケーションから共有の読み取り/書き込みリソースにアクセスしないだけで問題ありません。

メイン プロセスのみから何かを初期化する必要がある場合、これを行うより信頼性の高い方法は、ContentProvider を作成し (マニフェストで宣言し、他のコンポーネントと同様にオブジェクトを作成します)、その onCreate() を使用することです。ContentProvider はメイン プロセスからのみ作成および初期化され、他のプロセスからは作成されません。このようにして、init が他のプロセスで複製されないようにすることができます。

または、これにまったく対処したくない場合は、Crash Reporting がベータ版からフル リリースになるまで待ってください。将来、その時点で追加のプロセスは使用されないためです。私たち (Google) はそれがいつになるかを正確に言うことはできませんが、完全なリリースを公開するために時間を無駄にするつもりはありません.

于 2016-07-18T02:35:48.173 に答える