in java/com/facebook/soloader/UnpackingSoSource.java [368:425]
protected boolean refreshLocked(final FileLocker lock, final int flags, final byte[] deps)
throws IOException {
final File stateFileName = new File(soDirectory, STATE_FILE_NAME);
byte state;
try (RandomAccessFile stateFile = new RandomAccessFile(stateFileName, "rw")) {
try {
state = stateFile.readByte();
if (state != STATE_CLEAN) {
Log.v(TAG, "dso store " + soDirectory + " regeneration interrupted: wiping clean");
state = STATE_DIRTY;
}
} catch (EOFException ex) {
state = STATE_DIRTY;
}
}
final File depsFileName = new File(soDirectory, DEPS_FILE_NAME);
DsoManifest desiredManifest = null;
try (RandomAccessFile depsFile = new RandomAccessFile(depsFileName, "rw")) {
byte[] existingDeps = new byte[(int) depsFile.length()];
if (depsFile.read(existingDeps) != existingDeps.length) {
Log.v(TAG, "short read of so store deps file: marking unclean");
state = STATE_DIRTY;
}
if (depsChanged(existingDeps, deps)) {
Log.v(TAG, "deps mismatch on deps store: regenerating");
state = STATE_DIRTY;
}
if (state == STATE_DIRTY || ((flags & SoSource.PREPARE_FLAG_FORCE_REFRESH) != 0)) {
Log.v(TAG, "so store dirty: regenerating");
writeState(stateFileName, STATE_DIRTY);
try (Unpacker u = makeUnpacker(state)) {
desiredManifest = u.getDsoManifest();
try (InputDsoIterator idi = u.openDsoIterator()) {
regenerate(state, desiredManifest, idi);
}
}
}
}
if (desiredManifest == null) {
return false; // No sync needed
}
final DsoManifest manifest = desiredManifest;
Runnable syncer = createSyncer(lock, deps, stateFileName, depsFileName, manifest, false);
if ((flags & PREPARE_FLAG_ALLOW_ASYNC_INIT) != 0) {
new Thread(syncer, "SoSync:" + soDirectory.getName()).start();
} else {
syncer.run();
}
return true;
}