{"record":{"id":"57515c946911e304","repo":"MuntashirAkon/AppManager","slug":"failed-to-setup-metadata","errorCode":null,"errorMessage":"Failed to setup metadata.","messagePattern":"Failed to setup metadata\\.","errorType":"exception","errorClass":"BackupException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupOp.java","lineNumber":129,"sourceCode":"    BackupOp(@NonNull String packageName, @NonNull BackupFlags backupFlags,\n             @NonNull BackupItems.BackupItem backupItem, @UserIdInt int userId)\n            throws BackupException {\n        mPackageName = packageName;\n        mBackupItem = backupItem;\n        mUserId = userId;\n        mBackupFlags = backupFlags;\n        mPm = ContextUtils.getContext().getPackageManager();\n        try {\n            mPackageInfo = PackageManagerCompat.getPackageInfo(mPackageName,\n                    PackageManager.GET_META_DATA | GET_SIGNING_CERTIFICATES | PackageManager.GET_PERMISSIONS\n                            | PackageManagerCompat.MATCH_STATIC_SHARED_AND_SDK_LIBRARIES, userId);\n            Objects.requireNonNull(mPackageInfo);\n            mApplicationInfo = Objects.requireNonNull(mPackageInfo.applicationInfo);\n            // Override existing metadata\n            mMetadata = setupMetadataAndCrypto();\n        } catch (Throwable e) {\n            mBackupItem.cleanup();\n            throw new BackupException(\"Failed to setup metadata.\", e);\n        }\n        try {\n            mChecksum = mBackupItem.getChecksum();\n            String[] certChecksums = PackageUtils.getSigningCertChecksums(mMetadata.info.checksumAlgo, mPackageInfo, false);\n            for (int i = 0; i < certChecksums.length; ++i) {\n                mChecksum.add(CERT_PREFIX + i, certChecksums[i]);\n            }\n        } catch (Throwable e) {\n            mBackupItem.cleanup();\n            throw new BackupException(\"Failed to create checksum file.\", e);\n        }\n    }\n\n    @Override\n    public void close() {\n        mBackupItem.cleanup();\n    }\n","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupOp.java#L111-L147","documentation":"BackupOp's constructor calls setupMetadataAndCrypto() to build the backup metadata (package info, crypto setup); any Throwable there triggers cleanup of the backup item and BackupException('Failed to setup metadata.', e). This means backup initialization failed before any data was written — commonly a crypto/key problem or missing package info.","triggerScenarios":"Running a backup where metadata/crypto setup fails: keystore key unavailable or invalidated, bad crypto algorithm/args, PackageInfo/ApplicationInfo unresolvable for the target package, or any exception inside setupMetadataAndCrypto().","commonSituations":"Device keystore locked or keys cleared after OS update/factory reset; encrypted backups requested without proper key/password setup; backing up a package that was uninstalled between listing and backup; checksum-algo misconfiguration.","solutions":["Read getCause() to find the real failure (crypto vs package info).","Re-set up backup encryption keys/passwords in the app settings; retry after the keystore is unlocked.","Confirm the target package is still installed for the given userId before starting the backup.","If crypto is the issue, temporarily back up without encryption to isolate the problem; catch BackupException and clean up partial state (the constructor already calls mBackupItem.cleanup())."],"exampleFix":"// before\nnew BackupOp(context, new BackupOpOptions(pkg, userId, flags, crypto)); // throws\n// after\ntry {\n    new BackupOp(context, options);\n} catch (BackupException e) {\n    Log.e(TAG, \"metadata setup failed\", e.getCause());\n    if (e.getCause() instanceof CryptoException) {\n        // prompt user to reconfigure backup encryption\n    }\n}","handlingStrategy":"try-catch","validationCode":"PackageInfo pi = pm.getPackageInfoAsUser(pkg, 0, userId);\nif (pi == null || pi.applicationInfo == null) {\n    throw new IllegalStateException(\"Package not installed: \" + pkg + \" user \" + userId);\n}","typeGuard":"boolean backupTargetReady(Context ctx, String pkg, int userId) {\n    PackageInfo pi = PackageUtils.getPackageInfoAsUser(pkg, 0, userId);\n    return pi != null && pi.applicationInfo != null;\n}","tryCatchPattern":"try {\n    new BackupOp(context, options);\n} catch (BackupException e) {\n    Throwable cause = e.getCause();\n    if (\"Failed to setup metadata.\".equals(e.getMessage()) && cause != null) {\n        Log.e(TAG, \"backup init failed\", cause); // crypto vs package-info branch\n    }\n}","preventionTips":["Verify package installation state immediately before backup","Set up/validate backup encryption keys before starting backups","Unlock the device keystore prior to encrypted backups","Always catch BackupException around BackupOp construction since the constructor performs setup work"],"tags":["android","backup","crypto","metadata","keystore"],"backgroundTag":"module-init-failed","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}