android开发中常常会碰到开发环境与生产环境接口地址使用不同域名的情况、甚至要求debug包与release包不同包名,其实这些都可以通过gradle来帮我们完成,再也不用手动改代码,拒绝麻烦与出错,了解gralde的用法,有助于提升生产力。这里仅记录自己开发中碰到的问题及解决方式
结合使用场景与实际操作
- 动态改变接口地址
- release与debug版本不同包名
- debug使用release版本正式签名
- apk打包自动命名
一、比如release版本要求api域名为:https://www.release.*,而debug版本为:https://www.test.*。</br>我们这里介绍的是通过在Manifest文件中添加变量,同时在gradle中打包时动态的去更改属性的值,应用启动的时候去读取从而动态的改变当前版本的域名
- 通过gradle修改AndroidManifest.xm meta-data值
<!--AndroidManifest.xml-->
<!--编译时域名动态切换-->
<application>
<meta-data android:value="${app_version_key}"
android:name="app_version"/>...</application>
- app下的gradle中使用manifestPlaceholders来动态替换属性值,格式如下;
release {
manifestPlaceholders = [
app_version_key: "release"
]
}
debug {
manifestPlaceholders = [
app_version_key: "test"
]
}
3.由于清单文件中我们的meta-data节点写在application节点根目录下,这里我们在application中去获取该属性的值(其他方式请自行google)
try {
ApplicationInfo info = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String host = info.metaData.getString("app_version");
if (host.equals("test")) {//测试版
HttpApis.host = "https://www.release.*";
} else {//正式版
HttpApis.host = "https://www.test.*";
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
通过上述操作我们已经可以实现打包时,release包与debug包域名分开。上述同样可用在第三方sdk如极光推送、测试版与正式版分开推送,可使用manifestPlaceholders 动态的改变对应的属性值
二、有时候为了测试方便,我们常将正式版与测试版分两个包名打包,从而实现同台手机可以同时安装、拒绝不断的安装卸载操作
1、修改app下的gradle文件,需要注意的一点是在配置了productFlavors后,defaultConfig中的applicationId便会失效
android{
defaultConfig {
//applicationId "com.david.smarthome"
...
flavorDimensions "versionCode"
}
productFlavors {
appdebug {
applicationId 'com.david.smarthome_test'
}
apprelease {
applicationId 'com.david.smarthome'
}
}
}
2、Android Studio会自动根据build.gradle 生成对应的BuildVariants。
对应Release与Debug即可组合成2*2 个版本的包。使用图形界面安装时可以通过Build Variants选择当前要build到手机的版本
3、Signed Apk时同样有2*2种维度的不同版本可供打包
自此我们已经完成多包名打包的配置
三、由于Android Studio 打Debug包时默认使用 签名为Debug版本,即:debug.keystore,而当我们接入的第三方SDK如微信等要求提交Release版本的签名(release.jks)。这个时候最方便的方式便是让打Debug包的时候直接使用我们正式版的签名
修改app.gradle,添加signingConfigs,同时在debug中指向该签名文件
android {
signingConfigs {
signconfig {
keyAlias 'smarthome'
keyPassword '123123'
storeFile file('/Users/david/AndroidStudioProjects/SmartHome/smarthome.jks')
storePassword '123123
}
}
debug {
...
signingConfig signingConfigs.signconfig
}
}
以上两部即可实现我们的效果,Debug包已经使用的是我们正式版的签名文件
四、定义打包命名规则,结合时间日期,免去手动重命名易错,没规律的问题
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android{
applicationVariants.all { variant ->
if (variant.buildType.name.equals('release')) {
variant.outputs.all { output ->
def buildName = "com.david.smarthome"
def type = variant.buildType.name
def releaseApkName = buildName + '_' + type + "_" + versionName + '_' + releaseTime() + '.apk'
outputFileName = releaseApkName
}
} else {
variant.outputs.all { output ->
def buildName = "com.david.smarthome"
def releaseApkName = buildName + '_' + "test" + "_" + versionName + '_' + releaseTime() + '.apk'
outputFileName = releaseApkName
}
}
}
}