web-dev-qa-db-ja.com

バックアップ関連のプロセスが原因でアプリケーションのonCreateが実行されないのはなぜですか?

以下のようにApplicationクラスを持つことは一般的です

_public class WeNoteApplication extends MultiDexApplication {
    public static WeNoteApplication instance() {
        return me;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        me = this;
_

通常の状況では、ApplicationonCreateは常にエントリポイントActivityのonCreateの前に呼び出されます。

_public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Normally, it will NOT be null.
        Android.util.Log.i("CHEOK", "WeNoteApplication -> " + WeNoteApplication.instance());
_

ただし、アプリの起動中に次のコマンドを実行すると

_c:\yocto>adb Shell bmgr restore com.yocto.wenote
restoreStarting: 1 packages
onUpdate: 0 = com.yocto.wenote
restoreFinished: 0
done
_

アプリは閉じられます。もしそうなら、私はアプリのアイコンをタップして再起動します。これは何が起こるかです

  1. ApplicationonCreateは実行されません!
  2. ActivityonCreateが実行され、WeNoteApplication.instance()null

私はいくつかのGoogleのAndroidソースコード(例:WorkManager)を見て)

https://github.com/googlecodelabs/Android-workmanager/issues/8

彼らのコメントでは、彼らはそれを述べています

_// 1. The app is performing an auto-backup.  Prior to O, JobScheduler could erroneously
//    try to send commands to JobService in this state (b/32180780).  Since neither
//    Application#onCreate nor ContentProviders have run,...
_

バックアップ関連の処理が含まれている場合、ApplicationonCreateは実行されないようです。

なぜそうなのか?この動作はどこかに記録されていますか?


課題追跡

https://issuetracker.google.com/issues/138423608


バグのデモの完全な例

https://github.com/yccheok/AutoBackup-bug

21
Cheok Yan Cheng

これに関するドキュメントを見つけることができる唯一の場所は Test Backup and Restore です。これは、アプリが終了すること、および完全バックアップの場合、クラスの代わりにアプリケーション基本クラスが使用されることを示しています。この理由がどこに文書化されているかはわかりませんが、カスタムアプリケーションクラスがファイルのオープンや変更などによってバックアップや復元に干渉する可能性があるためと考えられます。

Androidはアプリのカスタムアプリケーションクラスを認識できないため、Androidコードベースでこの問題を解決できる方法はないと思いますカスタムアプリケーションクラスの実行中は自動バックアップを安全に実行できません。

アプリでこれを回避する方法は2つあります。

  • アプリケーションクラスのドキュメント で提案されているように、アプリケーションから派生しないでください。代わりに、シングルトンとContext.getApplicationContext()。を使用してください。
    • Android開発チームのメンバーから、カスタムアプリケーションクラスを許可することは、Android APIの設計において重大な誤りであったと言われました。
  • Key/Value backup を使用してアプリをバックアップします。これはかなり手間がかかりますが、アプリがバックアップを制御できるようになったため、バックアップまたは復元と実行中のアプリとの間に競合がないことを確認できます。
0
Anthony Berent