上次我们说到gradle的原理,主要是偏理论上的知识点,直通车在这Android Gradle系列-原理篇。这次我们来点实战的,随便巩固下之前的知识点。
android
在app module下的gradle.build中都有一个android闭包,主要配置都在这里设置。例如默认配置项:defaultConfig;签名相关:signingConfig;构建变体:buildTypes;产品风格:productFlavors;源集配置:sourceSets等。
defaultConfig
对于defaultConfig其实它是也一个productFlavor,只不过这里是用来提供默认的设置项,如果之后的productFlavor没有特殊指定的配置都会使用defaultConfig中的默认配置。
public class DefaultConfig extends BaseFlavor {
@Inject
public DefaultConfig(
@NonNull String name,
@NonNull Project project,
@NonNull ObjectFactory objectFactory,
@NonNull DeprecationReporter deprecationReporter,
@NonNull Logger logger) {
super(name, project, objectFactory, deprecationReporter, logger);
}
}
public abstract class BaseFlavor extends DefaultProductFlavor implements CoreProductFlavor {
...
}
可以看到defaultConfig的超级父类就是DefaultProductFlavor。而在DefaultProductFlavor中定义了许多我们经常见到的配置:VersionCode、VersionName、minSdkVersion、targetSdkVersion与applicationId等等。
有了上面的基础,那么在defaultConfig中我们要配置的变量就显而易见了。
defaultConfig {
applicationId "com.idisfkj.androidapianalysis"
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs
signingConfig是用来配置keyStore,我们可以针对不同的版本配置不同的keyStore,例如
signingConfigs {
config {
//默认配置
storeFile file('key.store')
storePassword 'android123'
keyAlias 'android'
keyPassword 'android123'
}
dev {
//dev测试版配置
storeFile file('xxxx')
storePassword 'xxx'
keyAlias 'xxx'
keyPassword 'xxx'
}
}
有人可能会说这不安全的,密码都是明文,都暴露出去了。是的,如果这项目发布到远程,那么这些秘钥就泄露出去了。所以为了安全起见,我们可以对其进一些特殊处理。
- 通过环境变量获取秘钥
storePassword System.getenv("KSTOREPWD")
keyPassword System.getenv("KEYPWD")
- 从命令行中获取秘钥
storePassword System.console().readLine("\nKeystore password: ")
keyPassword System.console().readLine("\nKey password: ")
上面两种是Android Develop官网提供的,但经过测试都会报null异常,查了下资料都说是gradle不支持(如果有成功的可以告知我),所以还是推荐下面的这种方法
在项目的根目录下(settings.gradle平级)创建keystore.properties文件,我们在这个文件中进行存储秘钥,它是支持key-value模式的键值对数据
storePassword = android123
keyPassword = android123
之后就是读取其中的password,在build.gradle通过afterEvaluate回调进行读取与设置
afterEvaluate {
def propsFile = rootProject.file(&