最近做的项目牵扯到多版本开发,app要分两个版本,两个版本功能基本相同,但是访问的url不同,显示的功能有些许不同,同时需要在一个手机能够同时安装,于是便研究了一下Gradle的配置:
一.BuildConfig全局变量的定义:
android在运行时默认会有一个常量的BuildConfig,默认有个常量DEBUG,在buildtypes为debug和release时分别为true和false我们可以利用这个变量来设置是否打印日志等功能。
如果想要添加额外的变量我们可以在buildTypes或者productFlavors中添加:
buildConfigField("boolean", "SHOWLOG", "false")//不在打印Log
二.manifest中变量的动态配置:
有时候我们需要在清单文件中根据不同的版本使用不同的资源,设置APP不同的名称,这时就能够使用manifestPlaceholders来存储一些会变动的常量:
在清单文件中使用也很简单,前面加$然后替换就行了。manifestPlaceholders = [ 'APPLICATION_ID' : "${APPLICATIONID_YUNYING}", 'BAIDUMAP_AK' : "${BAIDMAP_KEY_YUNYING}", 'APPLICATION_NAME': "${APPNAME_YUNYING}", 'APP_ICON' : "@drawable/push", ]
<application android:name=".base.App" android:allowBackup="true" android:icon="${APP_ICON}" android:label="${APPLICATION_NAME}" android:persistent="true" android:screenOrientation="portrait" android:supportsRtl="true" android:theme="@style/AppTheme" tools:replace="android:label,android:icon">
三.buildtype和productflavors的设置
为了减小apk的大小我一般会在debug的时候支持x86架构的cpu发布版只支持armeabi-v7a
buildTypes {
release {
buildConfigField("boolean", "SHOWLOG", "false")//不在打印Log
shrinkResources false
signingConfig signingConfigs.config
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi-v7a'//,'x86' ,'armeabi', 'x86_64', 'arm64-v8a'
}
}
debug {
buildConfigField("boolean", "SHOWLOG", "true")//调试状态打印Log
shrinkResources false
signingConfig signingConfigs.config
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi-v7a', 'x86' //,'armeabi', 'x86_64', 'arm64-v8a'
}
}
}
而不同的版本中的productflavors我一般会添加不同的动态常量
四.打包时签名的设置
因为我添加了百度地图,我想在编译调试状态也添加签名文件,于是我在debug编译时也添加了签名文件的配置
signingConfigs {
config {
storePassword '123456'
keyAlias 'test'
keyPassword '123456'
storeFile file('/Users/z2wenfa/Downloads/test.jks')
}
}
五.打包时apk名称的自定义:
根据不同的版本自定义不同的apk名称
applicationVariants.all { variant ->
variant.outputs.each { output ->
// 获取渠道
def flavor = variant.productFlavors[0]
def flavorName
if (flavor == null) {
flavorName = "defaultName"
} else {
flavorName = flavor.name
}
def appname
if (flavorName.equals("yunying")) {
appname = APP_LOGIN_SHOW_NAME_YUYING
} else {
appname = APP_LOGIN_SHOW_NAME_YEWUYUAN
}
def outputFile = output.outputFile
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
fileName =
"${appname}-${variant.buildType.name}-v${variant.versionName}.apk";
println fileName
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
六.gradle中的def 定义变量的使用
自定义几个变量 之后到其他设置处使用 例如添加几个版本号的设置,减少耦合,版本变化只需要修改变量就行了,减少误操作
def APPVERSIONCODE = 9; //小版本号
def APPMIDDLEVERSION = 0//中版本号
def APPGENERATION = 1 //大版本号
七.通过productflavors进行多版本开发,多版本使用不同资源文件
既然要开发不同的版本那么代码和需要使用的资源就会不同,我们需要在src下与main同级建立几个文件夹来进行开发,根据不同的版本编写不同的代码,
当我们需要开发指定版本时我们只需要点击修改当前的开发版本就行