MuntashirAkon/AppManager · error · IOException

Failed to sign

Error message

Failed to sign 

What it means

ApkFile throws this IOException when the apksig Signer.sign() call fails or the signature verification via Signer.verify() returns false after producing the signed APK file. The original cause (a nested Exception) is wrapped as the IOException cause when sign() itself threw.

Source

Thrown at app/src/main/java/io/github/muntashirakon/AppManager/apk/ApkFile.java:742

         * @throws IOException If the APK cannot be signed or cached.
         */
        private File getSignedFile() throws IOException {
            File realFile = getRealCachedFile();
            if (Paths.exists(mSignedFile)) return mSignedFile;
            mSignedFile = mFileCache.createCachedFile("apk");
            SigSchemes sigSchemes = Prefs.Signing.getSigSchemes();
            boolean zipAlign = Prefs.Signing.zipAlign();
            try {
                Signer signer = Signer.getInstance(sigSchemes);
                if (signer.isV4SchemeEnabled()) {
                    mIdsigFile = mFileCache.createCachedFile("idsig");
                    signer.setIdsigFile(mIdsigFile);
                }
                if (signer.sign(realFile, mSignedFile, -1, zipAlign)
                        && Signer.verify(sigSchemes, mSignedFile, mIdsigFile)) {
                    return mSignedFile;
                }
                throw new IOException("Failed to sign " + realFile);
            } catch (IOException e) {
                throw e;
            } catch (Exception e) {
                throw new IOException(e);
            }
        }

        /**
         * Same as {@link #getSignedFile()} except that it returns an {@link InputStream}.
         *
         * @throws IOException If the APK cannot be signed or cached.
         */
        private InputStream getSignedInputStream() throws IOException {
            return new FileInputStream(getSignedFile());
        }

        /**
         * Get the APK file source if it has a physical location.

View on GitHub (pinned to 0152f468fc)

Solutions

  1. Read the wrapped cause exception to find whether signing or verification failed
  2. Verify the keystore/alias/password and that the signing key is valid and readable
  3. Check free disk space for the output signed file
  4. Ensure requested signature schemes match the provided files (e.g. provide an idsig file for v4 scheme)
  5. Test the input APK opens as a valid ZIP before signing

Example fix

// before
throw new IOException("Failed to sign " + realFile);
// after
throw new IOException("Failed to sign " + realFile + "; verify signing key and input APK validity", e);
Defensive patterns

Strategy: try-catch

Validate before calling

// before signing
if (!realFile.canRead() || realFile.length() == 0) throw new IllegalArgumentException("Input APK unreadable/empty");
if (new File(mSignedFile.getPath()).getUsableSpace() < realFile.length() * 2L) throw new IOException("Not enough disk space");

Try / catch

try {
    File signed = apkFile.sign();
} catch (IOException e) {
    // inspect e.getCause(): signing failure vs verification failure
    Log.e(TAG, "APK signing failed", e);
}

Prevention

When it happens

Trigger: Calling ApkFile.withSignature(...) / sign flow where signer.sign(realFile, mSignedFile, -1, zipAlign) returns false, or Signer.verify(sigSchemes, mIdsigFile) returns false, or sign() throws a non-IOException (wrapped by catch (Exception e)).

Common situations: Corrupt or already-signed input APK, invalid/missing keystore or signing key, unsupported signature schemes requested (e.g. v4 without idsig file), disk full while writing mSignedFile, or zipAlign failing on a malformed APK.

Understand the failure class

Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.

Related errors


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