Fixed
Status Update
Comments
su...@google.com <su...@google.com> #2
This is definitely on our radar and there are plans to support it coming soon. We'll keep you updated on this bug.
ap...@google.com <ap...@google.com> #3
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 65e1ddf3b22249241c496890510071648bdff904
Author: Sumir Kataria <sumir@google.com>
Date: Mon Apr 01 16:33:01 2019
On-demand initialization for WorkManager.
This CL introduces WorkManager#getInstance(Context) as the preferred
method and deprecates the argument-less version. This method performs
on-demand initialization of WorkManager if it hasn't been initialized
previously by looking to see if the application Context implements
Configuration.Provider and querying it for the Configuration.
The exact order of initialization checks are now as follows:
1. Through WorkManagerInitializer if it's enabled.
2. Otherwise, through a WorkManager#initialize in Application#onCreate
or ContentProvider#onCreate if specified by the developer.
3. Otherwise, through WorkManager#getInstance(Context) if the
application Context implements Configuration.Provider. Using
WorkManager#getInstance() at this point results in an exception as
it does not contain the necessary information to initialize.
4. Otherwise, throws an IllegalStateException.
This change allows WorkManager to be setup in a manner where you can
only allow it to be initialized when it is needed. This is good for
apps that care about the critical path initialization needed by
WorkManager; in addition, all of WorkManager's own BroadcastReceivers
and Services are set up to try to auto-initialize if needed. Note
that this initialization can still happen on the main thread.
Bug: 127497100
Test: Ran integration tests with integration app doing on-demand init.
Change-Id: I30930d6445c0e9c5f08eaaab554963aaac99b3c9
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RecursiveWorker.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryActivity.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/TestApplication.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/sherlockholmes/AnalyzeSherlockHolmesActivity.java
M work/workmanager-gcm/src/main/java/androidx/work/impl/background/gcm/WorkManagerGcmService.java
M work/workmanager-testing/api/2.1.0-alpha01.txt
M work/workmanager-testing/api/current.txt
M work/workmanager-testing/src/androidTest/java/androidx/work/testing/TestSchedulerTest.java
M work/workmanager-testing/src/androidTest/java/androidx/work/testing/WorkManagerInitHelperTest.java
M work/workmanager-testing/src/main/java/androidx/work/testing/TestScheduler.java
M work/workmanager-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
M work/workmanager-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java
M work/workmanager-testing/src/main/java/androidx/work/testing/package-info.java
M work/workmanager-testing/src/test/java/androidx/work/testing/RobolectricSmokeTest.java
M work/workmanager/api/2.1.0-alpha01.txt
M work/workmanager/api/current.txt
M work/workmanager/src/androidTest/java/androidx/work/impl/background/systemjob/SystemJobServiceTest.java
M work/workmanager/src/main/java/androidx/work/Configuration.java
M work/workmanager/src/main/java/androidx/work/WorkManager.java
M work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/RescheduleReceiver.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
M work/workmanager/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java
https://android-review.googlesource.com/937085
https://goto.google.com/android-sha1/65e1ddf3b22249241c496890510071648bdff904
Branch: androidx-master-dev
commit 65e1ddf3b22249241c496890510071648bdff904
Author: Sumir Kataria <sumir@google.com>
Date: Mon Apr 01 16:33:01 2019
On-demand initialization for WorkManager.
This CL introduces WorkManager#getInstance(Context) as the preferred
method and deprecates the argument-less version. This method performs
on-demand initialization of WorkManager if it hasn't been initialized
previously by looking to see if the application Context implements
Configuration.Provider and querying it for the Configuration.
The exact order of initialization checks are now as follows:
1. Through WorkManagerInitializer if it's enabled.
2. Otherwise, through a WorkManager#initialize in Application#onCreate
or ContentProvider#onCreate if specified by the developer.
3. Otherwise, through WorkManager#getInstance(Context) if the
application Context implements Configuration.Provider. Using
WorkManager#getInstance() at this point results in an exception as
it does not contain the necessary information to initialize.
4. Otherwise, throws an IllegalStateException.
This change allows WorkManager to be setup in a manner where you can
only allow it to be initialized when it is needed. This is good for
apps that care about the critical path initialization needed by
WorkManager; in addition, all of WorkManager's own BroadcastReceivers
and Services are set up to try to auto-initialize if needed. Note
that this initialization can still happen on the main thread.
Bug: 127497100
Test: Ran integration tests with integration app doing on-demand init.
Change-Id: I30930d6445c0e9c5f08eaaab554963aaac99b3c9
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RecursiveWorker.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/RetryActivity.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/TestApplication.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/imageprocessing/ImageProcessingActivity.java
M work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/sherlockholmes/AnalyzeSherlockHolmesActivity.java
M work/workmanager-gcm/src/main/java/androidx/work/impl/background/gcm/WorkManagerGcmService.java
M work/workmanager-testing/api/2.1.0-alpha01.txt
M work/workmanager-testing/api/current.txt
M work/workmanager-testing/src/androidTest/java/androidx/work/testing/TestSchedulerTest.java
M work/workmanager-testing/src/androidTest/java/androidx/work/testing/WorkManagerInitHelperTest.java
M work/workmanager-testing/src/main/java/androidx/work/testing/TestScheduler.java
M work/workmanager-testing/src/main/java/androidx/work/testing/TestWorkManagerImpl.java
M work/workmanager-testing/src/main/java/androidx/work/testing/WorkManagerTestInitHelper.java
M work/workmanager-testing/src/main/java/androidx/work/testing/package-info.java
M work/workmanager-testing/src/test/java/androidx/work/testing/RobolectricSmokeTest.java
M work/workmanager/api/2.1.0-alpha01.txt
M work/workmanager/api/current.txt
M work/workmanager/src/androidTest/java/androidx/work/impl/background/systemjob/SystemJobServiceTest.java
M work/workmanager/src/main/java/androidx/work/Configuration.java
M work/workmanager/src/main/java/androidx/work/WorkManager.java
M work/workmanager/src/main/java/androidx/work/impl/WorkManagerImpl.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/RescheduleReceiver.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemalarm/SystemAlarmDispatcher.java
M work/workmanager/src/main/java/androidx/work/impl/background/systemjob/SystemJobService.java
M work/workmanager/src/main/java/androidx/work/impl/workers/ConstraintTrackingWorker.java
ra...@google.com <ra...@google.com>
li...@pinterest.com <li...@pinterest.com> #4
Thanks for the fix! Is there any information about when this can be released to production?
su...@google.com <su...@google.com> #5
As this is a new API, this will first be released in 2.1.0-alpha01 and go through the normal alpha/beta/rc/stable release process. You can expect the first alpha in the next 2 weeks.
li...@pinterest.com <li...@pinterest.com> #6
Great! Thanks for the fast response.
cr...@gmail.com <cr...@gmail.com> #7
Wow super fast responce
Description
Version used: 1.0.0-beta05
Devices/Android versions reproduced on: all devices
The context of this ticket is to support initializing WorkManager a bit later after the application cold start in order to keep cold start fast. I am aware that:
1. WorkManager has this auto-initialization support through the WorkManagerInitializer provider.
2. It can be disabled and replaced by a custom provider to call WorkManager.initialize() directly or call it from Application.onCreate().
3. A number of services and receivers are registered by WorkManager and they rely on the early initialization of the WorkManager.
During testing, I realized the WorkManager.initialize() spends non-trivial time, it could be 50ms on some low end devices. So I want to avoid that delay during the cold start and have an option to initialize WorkManager a bit later. The request is to add code into the receivers and services to initialize WorkManager by themselves if WorkManager has not been initialized. This will help to cover the time from the application startup to the time that the application initialize the WorkManager manually.
Currently, a crash will happen in those receivers and services if they are triggered before the WorkManager is initialized in the application.
03-04 22:35:15.552 5784-5784/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pinterest, PID: 5784
java.lang.RuntimeException: Unable to create service androidx.work.impl.background.systemjob.SystemJobService: java.lang.IllegalStateException: WorkManager needs to be initialized via a ContentProvider#onCreate() or an Application#onCreate().
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3172)
at android.app.ActivityThread.-wrap5(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1550)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.IllegalStateException: WorkManager needs to be initialized via a ContentProvider#onCreate() or an Application#onCreate().
at androidx.work.impl.background.systemjob.SystemJobService.onCreate(SystemJobService.java:68)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:3162)
at android.app.ActivityThread.-wrap5(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1550)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)