MuntashirAkon/AppManager · warning · UnsupportedOperationException

Memory mapping a remote file is not supported!

Error message

Memory mapping a remote file is not supported!

What it means

RemoteFileChannel.map(mode, position, size) always throws UnsupportedOperationException: mmap() is a local process-address-space operation and cannot be performed on a file that lives in a remote process via Binder IPC. The channel deliberately rejects the call instead of emulating it.

Solutions

  1. Replace map() with positional read()/write() loops over the same region.
  2. If mmap is essential, copy the remote file locally first and map the local FileChannel.
  3. Branch on channel type in shared code paths and use a buffer-based fallback for remote channels.
  4. Wrap map-dependent consumers behind an abstraction that accepts a readable channel instead of a MappedByteBuffer.

Example fix

// before
MappedByteBuffer buf = remoteChannel.map(MapMode.READ_ONLY, 0, remoteChannel.size());
// after
ByteBuffer buf = ByteBuffer.allocate((int) remoteChannel.size());
remoteChannel.read(buf, 0);
buf.flip();
Defensive patterns

Strategy: fallback

Validate before calling

if (channel instanceof RemoteFileChannel) {
    useBufferedReadWrite(channel); // never call map()
}

Type guard

boolean supportsMmap(FileChannel ch) {
    return !(ch instanceof RemoteFileChannel);
}

Try / catch

try {
    return channel.map(mode, position, size);
} catch (UnsupportedOperationException e) {
    return readIntoBuffer(channel, position, size); // fallback
}

Prevention

When it happens

Trigger: Calling map() on any RemoteFileChannel — always throws, regardless of mode, position, or size.

Common situations: Code paths shared between local FileChannel and RemoteFileChannel (e.g. parsing file formats via MappedByteBuffer); optimization attempts to avoid read() round-trips; libraries that internally mmap inputs.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of MuntashirAkon/AppManager@0152f468fc (2026-09-12). Data as JSON: /api/errors/401556a5d49fa18c. Report an issue: GitHub.

Appendix: source

Thrown at libcore/io/src/main/java/io/github/muntashirakon/io/RemoteFileChannel.java:356

            throw new IllegalArgumentException("Negative position");
        ensureOpen();
        return write0(src, position);
    }

    @Override
    protected void implCloseChannel() {
        try { fs.close(handle); } catch (RemoteException ignored) {}
        synchronized (fdLock) {
            try { Os.close(read); } catch (ErrnoException ignored) {}
            try { Os.close(write); } catch (ErrnoException ignored) {}
        }
    }

    // Unsupported operations

    @Override
    public MappedByteBuffer map(MapMode mode, long position, long size) {
        throw new UnsupportedOperationException("Memory mapping a remote file is not supported!");
    }

    @Override
    public FileLock lock(long position, long size, boolean shared) {
        throw new UnsupportedOperationException("Locking a remote file is not supported!");
    }

    @Override
    public FileLock tryLock(long position, long size, boolean shared) {
        throw new UnsupportedOperationException("Locking a remote file is not supported!");
    }
}

View on GitHub (pinned to 0152f468fc)