假如我们的gradle.properties文件内容如下:
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
SDK_RELEASE=true
SDK_VERSION=2.0.15
appVersionCode=100
appVersionName=1.0.0
RELEASE_STORE_PASSWORD=111111
RELEASE_KEY_ALIAS=key0
RELEASE_KEY_PASSWORD=111111
android.useAndroidX=true
android.enableJetifier=true
appKey="oosjv"
appType="1"
#不能使用中文做变量内容,乱码
alihotfixFlag=""
现在我们要获取useAndroidX、appKey、appType、hotfixTag这几个参数,则流程如下:
首先
在app下的build.gradle里面配置参数:
buildTypes {
release {
......
buildConfigField("String", "appKey", project.properties.get("appKey"))
buildConfigField("String", "appType", project.properties.get("appType"))
buildConfigField "String", "hotfixTag", hotfixTag
buildConfigField("boolean", "useAndroidX", project.properties.get("android.useAndroidX"))
}
debug {
......
buildConfigField("String", "appKey", project.properties.get("appKey"))
buildConfigField("String", "appType", project.properties.get("appType"))
buildConfigField "String", "alihotfixFlag", alihotfixFlag
buildConfigField("boolean", "useAndroidX", project.properties.get("android.useAndroidX"))
}
}
然后
在BuildConfig里面配置对应的属性:
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.bjh.iauhgdf";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "developDebug";
public static final int VERSION_CODE = 100;
public static final String VERSION_NAME = "1.0.0";
public static final String appKey = "oosjv";
public static final String appType = "1";
public static final String alihotfixFlag= "";
public static final boolean useAndroidX = true;
}
最后
最后在要用到的地方获取:
String alihotfixFlag= BuildConfig.alihotfixFlag;
boolean isuseAndroidX = BuildConfig.useAndroidX;
String appTyp = BuildConfig.appTyp
String appKey = BuildConfig.appKey
这里在获取gradle.properties里面的值的时候有几个地方要注意:
在app下的build.gradle里面配置参数的时候要注意参数类型要与gradle.properties对应,否则报错。
比如这里的appKey、appType、alihotfixFlag、isuseAndroidX这四个都是字符串String型,但是alihotfixFlag在app的build.gradle文件里面的处理方式完全不一样。这里要注意
在python的打包构建中,对于替换gradle.properties文件里面的内容有以下几点要注意:
1、gradle.properties文件里面的变量的值不能设置为中文。gradle.properties在中文编码会出现乱码而且很难解决。
2、在构建脚本里面,针对key=“value"的键值对,我们要用’value=”{0}"’.format(value),注意“0”的花括弧{}外面还要引号"".
3、针对key=value的键值对,我们用’value={0}’.format(value),“0”的花括弧{}外面没有引号"".
总结
在python的format()格式化中有这么一个细节:
‘iCode="{0}"’.format(“111”)得到的icode是一个带""的字符串:icode=“111”;
‘{0}’.format(“111”)得到的是这样的一个对象iCode=111;
也就是说:
——当我们需要key-“value"形式的时候就用’”{0}"’.format(“xxxx”)格式化;
——当我们需要key-value形式的时候就用’{0}’.format(“xxxx格式化”)
补充:
当我们在app----build.gradle里面配置多平台打包的设置时,我们·通常会有这样的配置文件:
***Test {
dimension "app"
applicationId "com.ant.test"
buildConfigField 'String', "softwareNo", '"5"'
buildConfigField 'Integer', "versionCode", '55'
// 修改 AndroidManifest.xml 里渠道变量
manifestPlaceholders = [CHANNEL_VALUE: "Test",
app_icon : "@mipmap/icon",
// 此方式可直接在 manifest 中通过 ${icon} 进行占位引用;
// 或者在main同级中创建不同渠道后创建 res 资源文件
icon : "@mipmap/icon",
]
}
***OnLine {
dimension "app"
applicationId "com.ant.online"
buildConfigField 'String', "softwareNo", '"8"'
buildConfigField 'Integer', "versionCode", '55'
// 修改 AndroidManifest.xml 里渠道变量
manifestPlaceholders = [CHANNEL_VALUE: "OnLine",
app_icon : "@mipmap/icon",
// 此方式可直接在 manifest 中通过 ${icon} 进行占位引用;
// 或者在main同级中创建不同渠道后创建 res 资源文件
icon : "@mipmap/icon",
]
}
配置里面有一个软件版本的参数“softwareNo”需要注意,它用于控制不同平台的app版本升级用。
“versionCode”参数则是用于配置不同平台下的版本。需要注意的是,他是个Integer类型的数据,因此前面的数据类型那里,是Integer,然后value值那里,则是单引号模式:‘55’,这点跟String类型的参数不一样。
然后可以直接在代码里面调用softwareNo/versionCode参数,不用做如下配置:
buildTypes {
release {
......
}
debug{
......
}
}
通常情况下,如果我们没有做多平台区别升级的话,我们用一个参数就可以了,将其配置在gradle.properties里面,然后再在app----build.gradle里面做如下配置即可:
android {
buildTypes {
release {
......
buildConfigField 'String', "softwareNo", "\"${softwareNo}\""
}
debug{
......
buildConfigField 'String', "softwareNo", "\"${softwareNo}\""
}
}
}
然后经过编译之后,就可以直接在代码里面引用 "softwareNo"这个参数了。
甚至就连上面那样的信息我们都可以不用配置,直接引用app----build.gradle里面的这个参数“versionCode”即可。
但是在多平台区别升级的时候,做了上面的配置(“***Test”、“***OnLine”…),那么我们就不需要在gradle.properties里面配置"softwareNo"这个参数了,直接引用
“Test/OnLine---->buildConfigField对应的字段“softwareNo”
即可。