applyGradle static method

Future<void> applyGradle(
  1. String alias
)

Applies the signing settings to android/app/build.gradle(.kts).

Only the signing related parts are changed and other content is kept. alias is used as the last fallback for the key alias.

android/app/build.gradle(.kts)に署名設定を反映します。

署名に関係する箇所だけを変更し、それ以外の記述は保持します。 aliasはキーエイリアスの最後のフォールバックとして使われます。

Implementation

static Future<void> applyGradle(String alias) async {
  label("Add processing to the Gradle file.");
  final gradle = AppGradle();
  await gradle.load();
  if (gradle.isKotlin &&
      !gradle.imports.any((e) => e.import == "java.util.Properties")) {
    gradle.imports.add(
      GradleImport(
        import: "java.util.Properties",
      ),
    );
  }
  if (gradle.isKotlin &&
      !gradle.imports.any((e) => e.import == "java.util.Base64")) {
    gradle.imports.add(
      GradleImport(
        import: "java.util.Base64",
      ),
    );
  }
  if (!gradle.loadProperties.any((e) => e.name == "keyProperties")) {
    gradle.loadProperties.add(
      GradleLoadProperties(
        path: "key.properties",
        name: "keyProperties",
        file: "keyPropertiesFile",
        isKotlin: gradle.isKotlin,
      ),
    );
  }
  // 署名の参照だけを差し替え、proguardFileなど既存のビルドタイプ設定は残す。
  final buildTypes = gradle.android?.buildTypes;
  if (buildTypes != null) {
    final releaseSigningConfig = gradle.isKotlin
        ? "signingConfigs.getByName(\"release\")"
        : "signingConfigs.release";
    final debugSigningConfig = gradle.isKotlin
        ? "signingConfigs.getByName(\"debug\")"
        : "signingConfigs.debug";
    if (buildTypes.release == null) {
      buildTypes.release =
          GradleAndroidBuildType(signingConfig: releaseSigningConfig);
    } else {
      buildTypes.release!.signingConfig = releaseSigningConfig;
    }
    if (buildTypes.debug == null) {
      buildTypes.debug =
          GradleAndroidBuildType(signingConfig: debugSigningConfig);
    } else {
      buildTypes.debug!.signingConfig = debugSigningConfig;
    }
  }
  // 値は`AndroidSigningEnvironment`が生成するブロックで環境変数 → key.propertiesの順に解決する。
  // debugは解決できない場合に既定のデバッグ署名を使う。
  gradle.android?.signingConfigs = GradleAndroidSigningConfigs(
    release: GradleAndroidSigningConfig(
      keyAlias: AndroidSigningEnvironment.keyAliasExpression,
      keyPassword: AndroidSigningEnvironment.keyPasswordExpression,
      storeFile: AndroidSigningEnvironment.storeFileExpression,
      storePassword: AndroidSigningEnvironment.storePasswordExpression,
      isKotlin: gradle.isKotlin,
    ),
    debug: GradleAndroidSigningConfig(
      keyAlias: "${AndroidSigningEnvironment.keyAliasExpression} ?: keyAlias",
      keyPassword:
          "${AndroidSigningEnvironment.keyPasswordExpression} ?: keyPassword",
      storeFile:
          "${AndroidSigningEnvironment.storeFileExpression} ?: storeFile",
      storePassword:
          "${AndroidSigningEnvironment.storePasswordExpression} ?: storePassword",
      isKotlin: gradle.isKotlin,
    ),
    isKotlin: gradle.isKotlin,
  );
  await gradle.save();
  final gradleFile = File(
    gradle.isKotlin
        ? "android/app/build.gradle.kts"
        : "android/app/build.gradle",
  );
  final source = await gradleFile.readAsString();
  await gradleFile.writeAsString(
    AndroidSigningEnvironment.synchronize(
      source,
      isKotlin: gradle.isKotlin,
      alias: alias,
    ),
  );
}