createAndPatchAvd function
Implementation
Future<void> createAndPatchAvd(String name,
{required String device, required String systemImage}) async {
print('📦 Ensuring system image is installed...');
final sdkResult = await runSdkManager([systemImage]);
if (sdkResult.exitCode == -1) {
print('❌ System image installation timed out after 30 minutes.');
print('Attempted system image package: $systemImage');
print('This can happen when the image is large or your network is slow.');
print('Please verify that sdkmanager is available and retry.');
print('stdout:\n${sdkResult.stdout}');
print('stderr:\n${sdkResult.stderr}');
return;
}
if (sdkResult.exitCode != 0) {
print('❌ Failed to install system image: $systemImage');
print('stdout:\n${sdkResult.stdout}');
print('stderr:\n${sdkResult.stderr}');
return;
}
print('🧰 Creating AVD...');
final javaHomeExpr = Platform.isMacOS ? r'$(echo $JAVA_HOME)' : r'$JAVA_HOME';
final command = '''
export JAVA_HOME=$javaHomeExpr;
echo no | avdmanager create avd -n "$name" -k "$systemImage" --device "$device"
''';
final result = await Process.run(
'bash',
['-c', command],
runInShell: true,
);
if (result.exitCode != 0) {
print('❌ Failed to create AVD:\n${result.stdout}\n${result.stderr}');
return;
}
print('✅ AVD $name created successfully.');
// Confirm AVD actually exists
final avdHome = Platform.environment['ANDROID_AVD_HOME'] ??
'${Platform.environment['HOME']}/.android/avd';
final configPath = '$avdHome/$name.avd/config.ini';
final configFile = File(configPath);
if (!configFile.existsSync()) {
print('❌ Could not find config.ini for $name.');
return;
}
print('🔧 Patching config.ini for performance...');
var config = configFile.readAsStringSync();
if (!config.contains('hw.gpu.enabled')) {
config += '\nhw.gpu.enabled=yes\nhw.gpu.mode=auto\n';
configFile.writeAsStringSync(config);
print('✅ Patched config.ini for GPU acceleration.');
} else {
print('config.ini already patched.');
}
}