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签名配置
    • debuggabletrue时可调试代码
    • 打包输出文件, variant.flavorName渠道名称, variant.versionName 版本名称

注意事项: 如果你的项目是多模块话的,或者自己新建了模块库,那么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下的渠道包

刚刚申请了一个公众号,以后准备推送一些好的文章,欢迎你的投稿和关注。
公众号

posted @ 2018-10-24 15:20  jxiaow  阅读(162)  评论(0编辑  收藏  举报