gpt4 book ai didi

android - 如何将 build.gradle 逻辑拆分成更多的 .gradle 文件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:43:51 24 4
gpt4 key购买 nike

我有很长的 build.gradle 文件,其中包含我想移动到单独的 .gradle 文件中的功能,以保持逻辑清晰。文档建议使用 external build scripts对于这种情况。我在 build.gradle 文件中有下一个函数:

android{
buildTypes {
debug {
signingConfig = loadFromPropertiesFile("DEBUG_KEY_PROPERTIES")
}
}
}

import com.android.builder.signing.DefaultSigningConfig
import com.android.builder.model.SigningConfig

SigningConfig loadFromPropertiesFile(keyProperty) {
// Load signing config from singning properties file
println keyProperty
println ("${keyProperty}")
if (project.hasProperty(keyProperty)) {
File releasePropsFile = new File(project.property(keyProperty))
println("Loading config from properties file: ${releasePropsFile}")
if (releasePropsFile.exists()) {
Properties releaseProps = new Properties()
releaseProps.load(new FileInputStream(releasePropsFile))
println releaseProps

def signingConfig = new DefaultSigningConfig(keyProperty)
signingConfig.storeFile = file(releasePropsFile.getParent() + "/" + releaseProps['keystore.file'])
signingConfig.storePassword = releaseProps['keystore.password']
//signingConfig.storeType = 'PKCS12'
signingConfig.keyAlias = releaseProps['alias.name']
signingConfig.keyPassword = releaseProps['alias.password']
return signingConfig
} else {
println("Can't read configuration file: ${releasePropsFile}")
return null
}
} else {
println("Project has not define configuration file: ${keyProperty}")
return null
}
}

代码逻辑无关紧要,放在build.gradle 文件中就可以正常工作。但是当我将此方法移动到外部文件并将其包含在以下文件中时它失败了:

申请自:“$rootDir/gradle/android-signing.gradle”

我遇到下一个错误:

Cannot cast object 'DefaultSigningConfig{..}' with class
com.android.builder.signing.DefaultSigningConfig' to class
'com.android.builder.model.SigningConfig'

基本上它说它不能将实现转换为接口(interface)。因为 DefaultSigningConfig 实现了 SigningConfig see here .这毫无意义,直到我看到下一个 answer .

Two classes are treated as entirely different classes, even if they have the same package and name (and even implementation/fields/methods) when loaded by different classloaders. Which is the case when you are using plugin or external build script.

但是,我怎样才能将 build.gradle 中的方法拆分成模块化的单独文件?

最佳答案

我发现(感谢,开源!)android 插件 DSL api 通过让 setter 采用 SigningConfig 接口(interface)但强制 getter 转换为 internal.dsl.SigningConfig 类。

所以应该是这样的:

package com.android.builder.core;

import com.android.builder.internal.BaseConfigImpl;
import com.android.builder.model.BuildType;
import com.android.builder.model.SigningConfig;

public class DefaultBuildType extends BaseConfigImpl implements BuildType {

...

public BuildType setSigningConfig(SigningConfig signingConfig) {
mSigningConfig = signingConfig;
return this;
}

@Override
public SigningConfig getSigningConfig() {
return mSigningConfig;
}
}

但随后 BuiltTypeDSL 强制转换为 SigningConfigDSL 类:

package com.android.build.gradle.internal.dsl

import com.android.builder.core.DefaultBuildType

/**
* DSL object to configure build types.
*/
public class BuildType extends DefaultBuildType implements Serializable {

...

/** The signing configuration. */
@Override
SigningConfig getSigningConfig() {
return (SigningConfig) super.signingConfig
}
}

请注意,这两种方法 getSigningConfig() 的返回类型都具有相同的名称 SigningConfig 但包名不同。一个是接口(interface) com.android.builder.model.SigningConfig 另一个是类 com.android.build.gradle.internal.dsl.SigningConfig 扩展 com .android.builder.signing.DefaultSigningConfig 实现了 com.android.builder.model.SigningConfig 而这就是我的代码停止工作的地方,因为根据 OOP 原则我们可以转换 DefaultSigningConfig SigningConfig 接口(interface),但不能将其转换为 internal.dsl.SigningConfig 类。

为了使代码工作,我们可以创建 internal.dsl.SigningConfig 而不是 DefaultSigningConfig:

import com.android.build.gradle.internal.dsl.SigningConfig

def signingConfig = new SigningConfig(keyProperty) // note that this is class which extends DefaultSigningConfig, not interface
signingConfig.storeFile = ... // same as before
signingConfig.storePassword = ...
signingConfig.keyAlias = ...
signingConfig.keyPassword = ...
return signingConfig

或者用内部 dsl 模型包装 DefaultSigningConfig:

android{
signingConfigs {
debug {
initWith loadFromPropertiesFile("DEBUG_KEY_PROPERTIES")
}
}

buildTypes {
debug {
signingConfig signingConfigs.debug
}
}
}

关于android - 如何将 build.gradle 逻辑拆分成更多的 .gradle 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26884623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com