iBotPeaches/Apktool · error · IOException

Error while skipping chunk header.

Error message

Error while skipping chunk header.

What it means

Generic wrapper thrown by ResChunkPullParser.skipHeader() for non-EOF IOExceptions raised while skipping the header bytes; the original exception is attached as the cause. The 'Stream advanced past chunk header end.' throw at ResChunkPullParser.java:182 is inside the try, so it also surfaces wrapped here with its message only on the cause chain.

Solutions

  1. Unwrap ex.getCause() to distinguish 'advanced past header end' (logic error / bad headerSize) from genuine I/O failures.
  2. Only call skipHeader() before any header consumption, once per chunk.
  3. Keep exclusive ownership of the BinaryDataInputStream during parsing.
Defensive patterns

Strategy: try-catch

Try / catch

try {
    parser.skipHeader();
} catch (IOException ex) {
    Throwable cause = ex.getCause();
    if (cause != null && cause.getMessage().contains("chunk header end")) {
        // header was already consumed -> fix calling code
    } else {
        // I/O failure on backing stream
    }
}

Prevention

When it happens

Trigger: position > headerEnd when skipHeader() is called (wrapped error 43); underlying stream already closed; I/O errors on the backing file or zip entry during the skip.

Common situations: Custom chunk-header reads followed by skipHeader(); sharing the input stream between components; corrupt APKs with rewritten headerSize fields.

Related errors


AI-assisted analysis of iBotPeaches/Apktool@79b63384d7 (2026-08-14). Data as JSON: /api/errors/d57ff6367a1cce5a. Report an issue: GitHub.

Appendix: source

Thrown at brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResChunkPullParser.java:188

    public int skipHeader() throws IOException {
        if (mChunkHeader == null) {
            throw new IllegalStateException();
        }
        try {
            long position = mIn.position();
            long headerEnd = headerEnd();
            if (position == headerEnd) {
                return 0;
            }
            if (position > headerEnd) {
                throw new IOException("Stream advanced past chunk header end.");
            }
            return mIn.skipBytes((int) (headerEnd - position));
        } catch (EOFException ignored) {
            throw new EOFException("Unexpected EOF while skipping chunk header.");
        } catch (IOException ex) {
            throw new IOException("Error while skipping chunk header.", ex);
        }
    }
}

View on GitHub (pinned to 79b63384d7)