MuntashirAkon/AppManager · error · BackupException

Could not cache APK file

Error message

Could not cache APK file

What it means

Thrown by SBConverter.generateMetadata when copying the source base.apk into the temporary cache file (mCachedApk) throws IOException. The cached APK is required to parse package info, so conversion aborts.

Source

Thrown at app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java:280

                }
            } catch (IOException e) {
                throw new BackupException("Backup failed for " + dataFile, e);
            }
        }
    }

    @SuppressLint("WrongConstant")
    @NonNull
    private BackupMetadataV2 generateMetadata() throws BackupException {
        BackupMetadataV2 metadataV2 = new BackupMetadataV2();
        mCachedApk = FileUtils.getTempPath(mPackageName, "base.apk");
        try (InputStream pis = getApkFile().openInputStream()) {
            try (OutputStream fos = mCachedApk.openOutputStream()) {
                IoUtils.copy(pis, fos);
            }
            mFilesToBeDeleted.add(getApkFile());
        } catch (IOException e) {
            throw new BackupException("Could not cache APK file", e);
        }
        String filePath = Objects.requireNonNull(mCachedApk.getFilePath());
        PackageInfo packageInfo = mPm.getPackageArchiveInfo(filePath, 0);
        if (packageInfo == null) {
            throw new BackupException("Could not fetch package info");
        }
        mPackageInfo = packageInfo;
        Objects.requireNonNull(mPackageInfo.applicationInfo);
        mPackageInfo.applicationInfo.publicSourceDir = filePath;
        mPackageInfo.applicationInfo.sourceDir = filePath;
        ApplicationInfo applicationInfo = mPackageInfo.applicationInfo;

        if (!mPackageInfo.packageName.equals(mPackageName)) {
            throw new BackupException("Package name mismatch: Expected=" + mPackageName + ", Actual=" + mPackageInfo.packageName);
        }

        metadataV2.label = applicationInfo.loadLabel(mPm).toString();
        metadataV2.packageName = mPackageName;

View on GitHub (pinned to 0152f468fc)

Solutions

  1. Confirm the source backup actually contains the APK (apkName in metadata) and the path is readable.
  2. Free storage space in the app's temp/cache directory.
  3. Re-copy the source backup to internal storage and retry.
  4. Check the wrapped IOException cause for the exact failing path or permission.

Example fix

// before: assume APK present
converter.convert();
// after: verify APK file exists in source before converting
File apk = new File(sourceDir, metadata.apkName);
if (!apk.isFile()) {
    throw new IllegalStateException("APK missing in source: " + apk);
}
converter.convert();
Defensive patterns

Strategy: validation

Validate before calling

File apk = new File(sourceDir, metadata.apkName);
if (!apk.isFile() || !apk.canRead())
    throw new IllegalStateException("source APK missing/unreadable: " + apk);
if (cacheDir.getUsableSpace() < apk.length())
    throw new IllegalStateException("not enough cache space for " + apk.length());

Try / catch

try { converter.convert(); }
catch (BackupException e) {
    if (e.getMessage().equals("Could not cache APK file")) {
        Log.e(TAG, "APK cache copy failed", e.getCause());
        // check source path readability and cache space before retry
    }
}

Prevention

When it happens

Trigger: getApkFile() returns a path whose stream cannot be opened (missing file, unreadable location), or the temp output stream cannot be written (no cache space, cache dir not writable).

Common situations: Source backup folder on removed/unmounted external storage; the source archive lacks the APK because only data was backed up but APK conversion was still attempted; device cache full after many conversions.

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/f6eedc62036067c3. Report an issue: GitHub.