renameAndroidNames function
Renames the Android app names and labels in the strings.xml and AndroidManifest.xml files.
This function creates or updates the res/values/strings.xml file with the app name,
launcher name, and activity name from the config. It also updates the AndroidManifest.xml
to reference these string resources for labels.
config - The configuration containing the new app names.
Implementation
void renameAndroidNames(RenameConfig config) {
// 1️⃣ Ensure res/values/strings.xml exists
final valuesDir =
Directory(p.join('android', 'app', 'src', 'main', 'res', 'values'));
if (!valuesDir.existsSync()) valuesDir.createSync(recursive: true);
final stringsFile = File(p.join(valuesDir.path, 'strings.xml'));
stringsFile.writeAsStringSync('''<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">${config.name}</string>
<string name="launcher_name">${config.shortName}</string>
<string name="activity_name">@string/launcher_name</string>
</resources>
''');
Logger.success('✅ Android strings.xml created/updated');
// 2️⃣ Update AndroidManifest.xml
final manifestPath =
p.join('android', 'app', 'src', 'main', 'AndroidManifest.xml');
final manifestFile = File(manifestPath);
if (!manifestFile.existsSync()) {
Logger.warn('AndroidManifest.xml not found at $manifestPath');
return;
}
String content = manifestFile.readAsStringSync();
// 2a. Update <application> android:label and android:name
content = content.replaceAllMapped(
RegExp(r'<application([^>]*)>'),
(m) {
var attrs = m.group(1)!;
// Add/replace android:label
if (attrs.contains('android:label=')) {
attrs = attrs.replaceAll(RegExp(r'android:label="[^"]*"'),
'android:label="@string/app_name"');
} else {
attrs += ' android:label="@string/app_name"';
}
return '<application$attrs>';
},
);
// 2b. Update <activity> android:label
content = content.replaceAllMapped(
RegExp(r'<activity([^>]*)>'),
(m) {
var attrs = m.group(1)!;
if (attrs.contains('android:label=')) {
attrs = attrs.replaceAll(RegExp(r'android:label="[^"]*"'),
'android:label="@string/activity_name"');
} else {
attrs += ' android:label="@string/activity_name"';
}
return '<activity$attrs>';
},
);
// 2c. Update <intent-filter> android:label
content = content.replaceAllMapped(
RegExp(r'<intent-filter([^>]*)>'),
(m) {
var attrs = m.group(1)!;
if (attrs.contains('android:label=')) {
attrs = attrs.replaceAll(RegExp(r'android:label="[^"]*"'),
'android:label="@string/launcher_name"');
} else {
attrs += ' android:label="@string/launcher_name"';
}
return '<intent-filter$attrs>';
},
);
manifestFile.writeAsStringSync(content);
Logger.success('✅ AndroidManifest.xml updated with labels and namespace');
}