{"record":{"id":"ba8342f3e227607f","repo":"MuntashirAkon/AppManager","slug":"package-name-mismatch-expected-mpackagename-actual","errorCode":null,"errorMessage":"Package name mismatch: Expected=${mPackageName}, Actual=${mPackageInfo.packageName}","messagePattern":"Package name mismatch: Expected=(.+?), Actual=(.+?)","errorType":"exception","errorClass":"BackupException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java","lineNumber":294,"sourceCode":"                IoUtils.copy(pis, fos);\n            }\n            mFilesToBeDeleted.add(getApkFile());\n        } catch (IOException e) {\n            throw new BackupException(\"Could not cache APK file\", e);\n        }\n        String filePath = Objects.requireNonNull(mCachedApk.getFilePath());\n        PackageInfo packageInfo = mPm.getPackageArchiveInfo(filePath, 0);\n        if (packageInfo == null) {\n            throw new BackupException(\"Could not fetch package info\");\n        }\n        mPackageInfo = packageInfo;\n        Objects.requireNonNull(mPackageInfo.applicationInfo);\n        mPackageInfo.applicationInfo.publicSourceDir = filePath;\n        mPackageInfo.applicationInfo.sourceDir = filePath;\n        ApplicationInfo applicationInfo = mPackageInfo.applicationInfo;\n\n        if (!mPackageInfo.packageName.equals(mPackageName)) {\n            throw new BackupException(\"Package name mismatch: Expected=\" + mPackageName + \", Actual=\" + mPackageInfo.packageName);\n        }\n\n        metadataV2.label = applicationInfo.loadLabel(mPm).toString();\n        metadataV2.packageName = mPackageName;\n        metadataV2.versionName = mPackageInfo.versionName;\n        metadataV2.versionCode = PackageInfoCompat.getLongVersionCode(mPackageInfo);\n        metadataV2.isSystem = false;\n        metadataV2.hasRules = false;\n        metadataV2.backupTime = mBackupTime;\n        metadataV2.crypto = CryptoUtils.MODE_NO_ENCRYPTION;\n        metadataV2.apkName = \"base.apk\";\n        // Backup flags\n        BackupFlags flags = new BackupFlags(BackupFlags.BACKUP_APK_FILES);\n        try {\n            mFilesToBeDeleted.add(getObbFile());\n            flags.addFlag(BackupFlags.BACKUP_EXT_OBB_MEDIA);\n        } catch (FileNotFoundException ignore) {\n        }","sourceCodeStart":276,"sourceCodeEnd":312,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java#L276-L312","documentation":"Thrown by SBConverter.generateMetadata when the package name parsed from the cached APK does not match mPackageName (the expected name derived from the backup/metadata). It's a consistency guard preventing converted backups whose contents don't match their declared identity.","triggerScenarios":"metadata.apkName points to the wrong APK (a different app) inside the source folder; the backup folder was renamed/reassigned to another package; hand-edited metadata declares a package name that differs from the actual APK manifest.","commonSituations":"Users renaming or merging backup folders manually; cloning a backup folder as a template for another app; source archives containing multiple APKs where name resolution picked the wrong one.","solutions":["Dump the APK's real package name (aapt dump badging base.apk | grep package) and align the folder/metadata with it.","Fix metadata.apkName so it references the correct base APK for the declared package.","If the wrong app was placed in the folder, restore the correct APK from the original backup.","Do not hand-edit packageName in metadata; let generateMetadata derive identity from the APK."],"exampleFix":"// before: metadata edited by hand\nmetadata.packageName = \"com.example.renamed\";\n// after: keep the real package name from the APK\nString real = getPackageNameFromApk(baseApk); // aapt/PackageManager\nmetadata.packageName = real; // folder name must equal real too","handlingStrategy":"validation","validationCode":"PackageInfo pi = pm.getPackageArchiveInfo(apkPath, 0);\nif (pi != null && !pi.packageName.equals(expectedPackageName))\n    throw new IllegalStateException(\"folder/app mismatch: expected \"\n        + expectedPackageName + \" but APK is \" + pi.packageName);","typeGuard":null,"tryCatchPattern":"try { converter.convert(); }\ncatch (BackupException e) {\n    if (e.getMessage().startsWith(\"Package name mismatch\")) {\n        // derive the real package from the message and rename the folder/metadata\n    }\n}","preventionTips":["Never rename or reassign backup folders to other packages","Derive folder names from the APK manifest, not vice versa","Don't hand-edit packageName in metadata","Spot-check one conversion before batch-converting a modified collection"],"tags":["android","backup","package-name","validation"],"backgroundTag":"schema-validation-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"}