Fail a job when you can't instantiate it.

This will still crash, but prevent apps from getting into crash loops
when we have bad data in a job.
This commit is contained in:
Greyson Parrelli 2019-11-13 11:39:58 -05:00
parent 6cd4728e3c
commit 88c0e6f8ab

View file

@ -322,6 +322,8 @@ class JobController {
private @NonNull Job createJob(@NonNull JobSpec jobSpec, @NonNull List<ConstraintSpec> constraintSpecs) {
Job.Parameters parameters = buildJobParameters(jobSpec, constraintSpecs);
try {
Data data = dataSerializer.deserialize(jobSpec.getSerializedData());
Job job = jobInstantiator.instantiate(jobSpec.getFactoryKey(), parameters, data);
@ -330,6 +332,20 @@ class JobController {
job.setContext(application);
return job;
} catch (RuntimeException e) {
Log.e(TAG, "Failed to instantiate job! Failing it and its dependencies without calling Job#onCanceled. Crash imminent.");
List<String> failIds = Stream.of(jobStorage.getDependencySpecsThatDependOnJob(jobSpec.getId()))
.map(DependencySpec::getJobId)
.toList();
jobStorage.deleteJob(jobSpec.getId());
jobStorage.deleteJobs(failIds);
Log.e(TAG, "Failed " + failIds.size() + " dependent jobs.");
throw e;
}
}
private @NonNull Job.Parameters buildJobParameters(@NonNull JobSpec jobSpec, @NonNull List<ConstraintSpec> constraintSpecs) {