{"record":{"id":"c2cd7bc2ee72252d","repo":"MuntashirAkon/AppManager","slug":"destination-doesn-t-contain-any-data-files","errorCode":null,"errorMessage":"Destination doesn't contain any data files.","messagePattern":"Destination doesn't contain any data files\\.","errorType":"exception","errorClass":"BackupException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/OABConverter.java","lineNumber":232,"sourceCode":"                    metadataV2.flags.addFlag(BackupFlags.BACKUP_APK_FILES);\n                } else {\n                    throw new BackupException(\"Destination doesn't contain any APK files.\");\n                }\n            }\n            if (backupMode == MODE_DATA || backupMode == MODE_BOTH) {\n                boolean hasBackup = false;\n                if (mBackupLocation.hasFile(CryptoUtils.getAppropriateFilename(mPackageName + \".zip\",\n                        mSourceCryptoMode))) {\n                    metadataV2.flags.addFlag(BackupFlags.BACKUP_INT_DATA);\n                    hasBackup = true;\n                }\n                if (mBackupLocation.hasFile(EXTERNAL_FILES) && mBackupLocation.findFile(EXTERNAL_FILES).hasFile(\n                        CryptoUtils.getAppropriateFilename(mPackageName + \".zip\", mSourceCryptoMode))) {\n                    metadataV2.flags.addFlag(BackupFlags.BACKUP_EXT_DATA);\n                    hasBackup = true;\n                }\n                if (!hasBackup) {\n                    throw new BackupException(\"Destination doesn't contain any data files.\");\n                }\n                metadataV2.flags.addFlag(BackupFlags.BACKUP_CACHE);\n            }\n            metadataV2.userId = UserHandleHidden.myUserId();\n            metadataV2.dataDirs = ConvertUtils.getDataDirs(mPackageName, mUserId, metadataV2.flags\n                    .backupInternalData(), metadataV2.flags.backupExternalData(), false);\n            metadataV2.tarType = Prefs.BackupRestore.getCompressionMethod();\n            metadataV2.keyStore = false;\n            metadataV2.installer = Prefs.Installer.getInstallerPackageName();\n            metadataV2.version = 2;  // Old version is used so that we know that it needs permission fixes\n            return metadataV2;\n        } catch (JSONException | IOException | CryptoException e) {\n            return ExUtils.rethrowAsBackupException(\"Could not parse JSON file.\", e);\n        }\n    }\n\n    private void backupApkFile() throws BackupException {\n        Path[] baseApkFiles;","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/OABConverter.java#L214-L250","documentation":"When backupMode is MODE_DATA or MODE_BOTH, the converter looks for the app's data archive (packageName + \".zip\", possibly with crypto-transformed name) both in the backup root and in the external-files subdirectory (EXTERNAL_FILES). If neither exists, no data backup can be produced, so it throws. This guards the invariant that a data-mode backup actually contains data files.","triggerScenarios":"In readLogFile(), backupMode == MODE_DATA or MODE_BOTH, and neither mBackupLocation.hasFile(<packageName>.zip, crypto-named) nor mBackupLocation.findFile(EXTERNAL_FILES).hasFile(<packageName>.zip) is true at OABConverter.java:232.","commonSituations":"APK-only OAndBackup backups being converted as data backups; the data zip was deleted or never created because the app had no backing-up-able data; the zip sits in an unexpected subdirectory the converter doesn't scan; encrypted filename mismatch due to wrong source crypto mode.","solutions":["Place the <packageName>.zip data archive in the backup root (or the external-files subfolder) before converting.","Re-create the OAndBackup backup in Data or Both mode so the data zip is generated.","If you only have the APK, set backupMode to MODE_APK in the log instead of MODE_DATA/MODE_BOTH.","Verify the source crypto mode: an encrypted backup stores the zip under a transformed name; a wrong mSourceCryptoMode makes hasFile() miss it."],"exampleFix":"// before: MODE_DATA requested, backup dir contains only base.apk\n// after: either copy com.example.app.zip into the backup directory\n//   backup/\n//     base.apk\n//     com.example.app.zip\n// or set \"backupMode\": 0 (MODE_APK) in the log","handlingStrategy":"validation","validationCode":"String zip = CryptoUtils.getAppropriateFilename(packageName + \".zip\", sourceCryptoMode);\nboolean hasData = backupLocation.hasFile(zip)\n        || (backupLocation.hasFile(EXTERNAL_FILES)\n            && backupLocation.findFile(EXTERNAL_FILES).hasFile(zip));\nif (mode == MODE_DATA || mode == MODE_BOTH) {\n    if (!hasData) throw new IllegalStateException(\"No data zip for \" + packageName);\n}","typeGuard":null,"tryCatchPattern":"try {\n    converter.convert(...);\n} catch (BackupException e) {\n    if (e.getMessage().contains(\"doesn't contain any data files\")) {\n        Log.e(TAG, \"Data-mode conversion but no <pkg>.zip found\", e);\n    }\n}","preventionTips":["Confirm <packageName>.zip exists in the backup root or external-files folder before converting.","Convert APK-only backups with MODE_APK, not MODE_DATA/MODE_BOTH.","Check crypto mode when the zip is stored under an encrypted name."],"tags":["android","backup","file-not-found","data","conversion"],"backgroundTag":"file-not-found","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}