Android Studio 相关操作的疑难杂症 (签名、多渠道打包、多种编译类型)
Android Studio 相关操作的疑难杂症 (签名、多渠道打包、多种编译类型)
本文地址:https://blog.csdn.net/xiaowu_zhu/article/details/83344557
在app
下的build.gradle
中添加一些配置信息可以减少打包步骤,提高效率。下面是我总结在开发中经常遇到的一些需求和解决方式。
打不同的渠道包
在 android studio 中可以在 app
下的build.gradle
中配置一些属性,就可以打不同的包:
flavorDimensions "default" //这个在as 3.0上必须配置
productFlavors {
bdx { //bdx(名字可自定义) 此处代表百度渠道
// buildConfigField 这个字段在编译时会在BuildConfig目录下生成一个成员变量
// 'String' 代表字段的类型
// 'appOrigin' 代表字段的名称
// ‘“bdx”’ 代表值
// 字段类型 包含一些常用类型,如:String、boolean、 int 等等
// 字段名称可以根据你的业务需求自定义
// 值自定义
buildConfigField 'String', 'appOrigin', '"bdx"'
}
wdj {
buildConfigField 'String', 'appOrigin', '"wdj"'
}
//..... 此处省略类似以上的代码
}
修改编译类型打不同类型的包
在平时开发中会遇到一种情况,需要正式线和测试线各打一个包,并且根据打的包不同,一些字段值也不一样,比如 访问服务器的url
。可以在app
下的build.gradle
中配置相关属性。然后在as运行时可以指定运行的编译属性,具体操作:as左边栏 -->Build Variants --> 然后给module配置编译类型
//获取打包时间
static def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
//buildType 编译时的编译类型,常见的是debug和release两种
def releaseTime =
buildTypes {
//普通编译时会走这个配置
debug {
buildConfigField 'String', 'BASE_URL', "${TEST_BASE_URL}" // 开发url
minifyEnabled false //是否开启代码混淆
shrinkResources false //是否进行资源压缩,移除无用的资源文件
signingConfig signingConfigs.debug //签名配置
//打包后的输出文件路径和文件名
applicationVariants.all { variant ->
variant.outputs.all {
if (variant.buildType.name == 'debug') { //如果是这个类型才输出文件
//variant.versionName 代表版本号
//releaseTime 自定义的一个时间
outputFileName="xxx_debug_v${variant.versionName}_${releaseTime()}.apk"
}
}
}
}
//开发人员用于正式线
debugLineProduct {
buildConfigField 'String', 'BASE_URL', "${PRODUCT_BASE_URL}" //test 正式线url
// 开启混淆
minifyEnabled false
// 移除无用的资源文件,依赖于minifyEnabled,必须和minifyEnabled一起用。
shrinkResources false
//混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//签名配置
signingConfig signingConfigs.debug
//是否支持debug
debuggable true
//打包后的输出文件路径和文件名
applicationVariants.all { variant ->
variant.outputs.all {
if ('debugLineProduct' == variant.buildType.name) {
outputFileName ="xx_debug_${variant.flavorName}
_v${variant.versionName}_${releaseTime()}.apk"
}
}
}
}
//测试人员 用于测试线,有签名
releaseLineTest {
buildConfigField 'String', 'BASE_URL', "${TEST_BASE_URL}"//test 测试线url
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.all {
if ('releaseLineTest' == variant.buildType.name) {
outputFileName="xxx_test_${variant.flavorName}
_v${variant.versionName}_${releaseTime()}.apk"
}
}
}
}
//正式线版本
release {
buildConfigField 'String', 'BASE_URL', "${PRODUCT_BASE_URL}" //正式线url
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.all {
if ('release' == variant.buildType.name) {
outputFileName = "test_${variant.flavorName}_v${variant.versionName}
_${releaseTime()}.apk"
}
}
}
}
}
通过上面的配置文件中,可以知道:
- 可以在
build.gradle
下的buildTypes
中配置多个buildType
, 这就有利于在不同的环境中打出不同的包 - 以
debugLineProduct
编译类型来讲:- 这是我自己定义的一个buildType, 他的作用就是编译时生成一个正式线的
url
上的测试包,供开发人员,调试代码的包; buildConfigField
这个字段在编译时会在BuildConfig.java
文件中找到,它代表的是BuildConfig
类中的一个成员变量;String
代表的是字段的类型,类型有好几种和java的常用类型一致;BASE_URL
字段名,这是我自定义的一个服务器的url
;"${TEST_BASE_URL}"
值,这个值我是定义在了gradle.properties
中。minifyEnabled
,shrinkResources
这个是进行apk包优化使用,一个是开启代码混淆,一个是删除无用的资源文件。通常都是在开发调试中为false 加速代码的编译,签名时才为true。proguardFiles
代码混淆规则文件signingConfig
签名配置debuggable
为true
时可调试代码- 打包输出文件,
variant.flavorName
渠道名称,variant.versionName
版本名称
- 这是我自己定义的一个buildType, 他的作用就是编译时生成一个正式线的
注意事项: 如果你的项目是多模块话的,或者自己新建了模块库,那么buildTypes
需要在所有的module中配置
签名文件配置
可以在build.gradle
中配置签名信息,这样打包时就可以自动引入签名,key
的信息我定义在了gradle.properties
中。
//签名文件配置
signingConfigs {
//debug模式
debug {
// No debug config
}
//release 模式
release {
keyAlias "${KEY_ALIAS}"
keyPassword "${KEY_PASSWORD}"
storeFile rootProject.file("${KEY_STORE_FILE}")
storePassword "${KEY_STORE_PASSWORD}"
}
}
gradle.properties
这是一个比较特殊的properties
,特殊之处在于我们可以直接在build.gradle
中引用,而不像其他一些properties
需要自己写脚本语言才可以引用。
# 签名相关
KEY_STORE_FILE=
KEY_STORE_PASSWORD=
KEY_ALIAS=
KEY_PASSWORD=
# 服务器地址
TEST_BASE_URL=""
PRODUCT_BASE_URL=""
# 友盟相关
UMENG_MESSAGE_SECRET=
UMENG_CHANNEL=
UMENG_APP_KEY_TEST=
UMENG_APPKEY=
以上就是一些常用配置,打包时可以在命令行通过
gradlew assemble渠道名编译类型(渠道名和编译类型可省略,在省略时会打出所有渠道下的所有编译类型的包)
打出不同的包,如:
gradlew assemblebdxDebug //打出百度debug下的渠道包
刚刚申请了一个公众号,以后准备推送一些好的文章,欢迎你的投稿和关注。