in java/com/facebook/soloader/UnpackingSoSource.java [320:362]
private void regenerate(byte state, DsoManifest desiredManifest, InputDsoIterator dsoIterator)
throws IOException {
Log.v(TAG, "regenerating DSO store " + getClass().getName());
File manifestFileName = new File(soDirectory, MANIFEST_FILE_NAME);
try (RandomAccessFile manifestFile = new RandomAccessFile(manifestFileName, "rw")) {
DsoManifest existingManifest = null;
if (state == STATE_CLEAN) {
try {
existingManifest = DsoManifest.read(manifestFile);
} catch (Exception ex) {
Log.i(TAG, "error reading existing DSO manifest", ex);
}
}
if (existingManifest == null) {
existingManifest = new DsoManifest(new Dso[0]);
}
deleteUnmentionedFiles(desiredManifest.dsos);
byte[] ioBuffer = new byte[32 * 1024];
while (dsoIterator.hasNext()) {
try (InputDso iDso = dsoIterator.next()) {
boolean obsolete = true;
for (int i = 0; obsolete && i < existingManifest.dsos.length; ++i) {
String iDsoName = iDso.getDso().name;
if (existingManifest.dsos[i].name.equals(iDsoName)
&& existingManifest.dsos[i].hash.equals(iDso.getDso().hash)) {
obsolete = false;
}
}
File dsoFile = new File(soDirectory, iDso.getFileName());
if (!dsoFile.exists()) {
// so file exists, but file name changed
obsolete = true;
}
if (obsolete) {
extractDso(iDso, ioBuffer);
}
}
}
}
Log.v(TAG, "Finished regenerating DSO store " + getClass().getName());
}