resolvePackageName static method

Future<String> resolvePackageName(
  1. String appRoot,
  2. AndroidConfig config, {
  3. String? flavor,
})

Resolves the application ID used by Google Play.

Implementation

static Future<String> resolvePackageName(
  String appRoot,
  AndroidConfig config, {
  String? flavor,
}) async {
  final configuredPackageName = config.packageName;
  if (configuredPackageName != null) return configuredPackageName;
  SmfError.check(
    flavor == null,
    'platforms.android.package_name is required when flavor is configured.',
    SmfErrorCode.packageNameRequired,
  );
  final androidApp = p.join(appRoot, 'android', 'app');
  final possiblePaths = <String>[
    p.join(androidApp, 'build.gradle.kts'),
    p.join(androidApp, 'build.gradle'),
  ];
  for (final path in possiblePaths) {
    if (!(await File(path).exists())) continue;
    final source = await File(path).readAsString();
    final match = RegExp(
      r'''applicationId\s*(?:=|\s)\s*["']([^"'$]+)["']''',
    ).firstMatch(source);
    final packageName = match?.group(1)?.trim();
    if (packageName != null && packageName.isNotEmpty) return packageName;
  }
  throw const SmfError(
    'Could not detect the Android application ID. Set '
    'platforms.android.package_name in smf/config.yaml.',
    SmfErrorCode.packageNameRequired,
  );
}