private void processEntry(FileLike entry) throws IOException { long entrySize = entry.getSize(); if (entrySize <= 0) { return; } if (entrySize > zipSizeHardLimit) { throw new IllegalArgumentException("Single entry larger than limit: " + entry); } DefaultZipOutputStreamHelper targetOut; // An entry is placed in the primary zip if either of the following is true: // // (1) The entry must appear in the first zip according to the EntryProcessor predicate. // (2) All of the remaining zip entries fit in the remaining space in the primary zip and // we're trying to maximize the size of the primary zip. // // Otherwise, the entry will be added to the secondary zip. boolean canFitAllRemaining = remainingSize + primaryOut.getCurrentSize() <= zipSizeHardLimit; if ((canFitAllRemaining && dexSplitStrategy == ZipSplitter.DexSplitStrategy.MAXIMIZE_PRIMARY_DEX_SIZE) || requiredInPrimaryZip.apply(entry.getRelativePath()) // File must be in primary ) { // Going to write this entry to the primary zip. if (!primaryOut.canPutEntry(entry)) { throw new IllegalArgumentException("Unable to fit all required files in primary zip."); } targetOut = primaryOut; } else { targetOut = secondaryDexWriter.getOutputToWriteTo(entry); } targetOut.putEntry(entry); remainingSize -= entrySize; }