createAndPatchAvd function

Future<void> createAndPatchAvd(
  1. String name, {
  2. required String device,
  3. required String systemImage,
})

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.');
  }
}