如何在AGP 7.0.0-alpha15之后更改版本号码?

8

在 AGP 7.0.0-alpha15 之前,我可以像这样更改应用程序的版本号码

android {
  defaultConfig {
    applicationVariants.all {
      if (buildType.name == "debug") {
        outputs.forEach { output ->
          (output as? com.android.build.gradle.internal.api.ApkVariantOutputImpl)?.versionCodeOverride = 1
        }
      }
    }
  }
}

在AGP 7.0.0-alpha15之后,applicationVariants似乎已经消失了,如何更改?

PS:在普通的gradle中似乎没有问题,上面是Kotlin。

编辑

根据下面的答案,我成功地在构建中覆盖了版本代码:

android {
  androidComponents.onVariants { appVariant ->
    if (appVariant.buildType == "release") {
      appVariant.outputs.forEach {
        it.versionCode.set(1)
      }
    }
  }
}

ApplicationVariant仍然存在,并且具有List<VariantOutput> - Martin Zeitler
在普通的 Gradle 中可以,但在 Kotlin DSL 中不行。 - Damiancioo
3个回答

6

Variant API会在AGP 7.0.0中改为按需评估模型,而Alpha 15似乎已经删除了旧的API。从现在开始,你需要使用androidComponents DSL来访问变量。但是不确定是否可以像这样重写版本代码。请查看beforeVariantsonVariants获取更多信息:

android {
  androidComponents.beforeVariants { variantBuilder ->
    // Callback before variants are built. Can be modified, but doesn't allow access to outputs
  }
  androidComponents.onVariants { variant ->
    // Callback after variants are built. Apparently it's read-only access at this point, but outputs are available here
    println(variant.outputs)
  }
}

1
在Java插件代码中,可以像这样设置版本代码和名称:

class SomePlugin implements Plugin<Project> {

    @Override
    @SuppressWarnings("UnstableApiUsage")
    public void apply(@NotNull Project project) {
    
        ApplicationAndroidComponentsExtension androidComponents = project.getExtensions()
                .getByType(ApplicationAndroidComponentsExtension.class);
    
        androidComponents.finalizeDsl(extension -> {
            for (AndroidSourceSet sourceSet : extension.getSourceSets()) {
                System.out.println(sourceSet.getName());
            }
        });
    
        int versionCode = 1;
        String versionName = "1.0.0";

        VariantSelector selector = androidComponents.selector().all();
        androidComponents.onVariants(selector, variant -> {
            for (VariantOutput variantOutput : variant.getOutputs()) {
                variantOutput.getVersionName().set( versionName );
                variantOutput.getVersionCode().set( versionCode );
                System.out.println(">>>> " +
                        variant.getName() + " " +
                        variantOutput.getVersionCode().get() + " / " + 
                        variantOutput.getVersionName().get());

            }
        });
    }
}
finalizeDsl会在onVariants之前发生。

0
android {
    // ..
    splits {
        abi {
            enable true
            reset()
            include 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
        }
    }
    // ..
}

androidComponents {
    onVariants(selector().all()) { appVariant ->
        for (VariantOutput variantOutput : appVariant.getOutputs()) {
            def versionCodes = ['[armeabi]'       : 100000,
                                '[armeabi-v7a]'   : 200000,
                                '[x86]'           : 300000,
                                '[arm64-v8a]'     : 400000,
                                '[x86_64]'        : 500000]
            String abi = variantOutput.getFilters().identifier;
            Integer version = versionCodes.get(abi) + versionCode
            if (appVariant.getName().contains("Debug")) {
                version += 10000
            }
            variantOutput.getVersionCode().set(version);
        }
    }
}

dependencies {
    // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接