Android Gradle 经常使用使用场景实现方式的总结

Gradle 做为一款灵活多变的构建插件,与 Android Studio 的结合,可以解决过去使用 Eclipse 开发 App 时所遇到的诸多问题。同时,基于 Groove 这样一款 DSL 语言的脚本特性,记住各类语法显然又是一件比较困难的事情。html

事实上,Gradle 插件的经常使用使用场景并非不少,也不须要死记硬背,或者彻底学会 Groove 的全部使用方式。这里将 Android 开发中较为经常使用的 Gradle 使用场景总结出来,用于未来须要的时候有个参考。android

多渠道打包

举一个最多见的多渠道使用场景,友盟统计,看看最基本的 Gradle 多渠道打包方式的用法。git

修改 Manifest 文件中友盟统计的渠道名为引用变量(变量名自取):程序员

<meta-data android:name="${UMENG_CHANNEL_VALUE}" android:value="Channel_ID" />复制代码

而后在 build.gradle 文件 productFlavors 配置项中添加渠道名,并统一设置到上面提到的变量名:github

android {
    productFlavors {
        xiaomi {}
        yingyongbao {}
    }

    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}复制代码

执行打包 Task 的命令语句便可:安全

./gradle assembleRelease复制代码

或者有针对性的只打特定渠道包,如:bash

./gradle assembleXiaomiRelease复制代码

备注:在 Gradle projects 窗口中可以查看全部可执行的 Tasks 列表。这种原生态打包方式适合渠道名比较少的使用场景。当渠道多达数十个甚至上百个时,打包时间就会比较长,推荐其余打包方案,如:服务器

自定义输出 APK 文件名

能够修改打包输出的 apk 文件名,添加时间戳、编译类型、版本信息等关键字,是 apk 文件更具识别性,如:

apply plugin: 'com.android.application'

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android {
    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(output.outputFile.parent, rootProject.getName()
                    + "-" + buildType.name
                    + "-" + releaseTime()
                    + "-v" + defaultConfig.versionName
                    + "-" + defaultConfig.versionCode
                    + ".apk");
        }
    }
}复制代码

这里将项目名称添加到 apk 文件名中,也可使用 applicationId 等,结果以下:

YFSample-release-2017-09-12-v1.0-1.apk复制代码

Debug 和 Release 相同签名

android {
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean", "DEBUG_MODE", "true"
            signingConfig signingConfigs.config
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "boolean", "DEBUG_MODE", "false"
            signingConfig signingConfigs.config
        }
    }
}复制代码

这一步操做能够经过图形化界面操做,更方便一些。右键项目,点击 Open Module Settings,打开 Project Structure 窗口,在 Build Types 选项卡中设置。

隐藏签名信息

签名信息做为项目里最为私密的一部份内容,若是直接暴露在 build.gradle 文件中,显然不够安全。尤为是须要上传到 GitHub 等托管平台时。

比较稳当的作法是,在项目根目录下新建一个专门用来存储签名信息的文件,而且将其添加到 ignore 文件配置当中。具体操做过程以下:

第一步,新建一个 keystore.properties 文件:

ReleaseKeyPassword=sampleKeyPwd
ReleaseKeyAlias=sampleAlias
ReleaseStorePassword=sampleStorePwd
ReleaseStoreFile=../sample.jks复制代码

第二步,在 build.gradle 文件的最外层引入签名信息:

allprojects {
    afterEvaluate { project ->
        def propsFile = rootProject.file('keystore.properties')
        def configName = 'config'

        if (propsFile.exists() && android.signingConfigs.hasProperty(configName)) {
            def props = new Properties()
            props.load(new FileInputStream(propsFile))
            android.signingConfigs[configName].storeFile = file(props['ReleaseStoreFile'])
            android.signingConfigs[configName].storePassword = props['ReleaseStorePassword']
            android.signingConfigs[configName].keyAlias = props['ReleaseKeyAlias']
            android.signingConfigs[configName].keyPassword = props['ReleaseKeyPassword']
        }
    }
}复制代码

如此便可。其中第二步还有一种缩减版的写法,也能够直接使用:

def keystorePropertiesFile = rootProject.file("keystore.properties");
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    signingConfigs {
        config {
            storeFile file(keystoreProperties['ReleaseStoreFile'])
            storePassword keystoreProperties['ReleaseStorePassword']
            keyAlias keystoreProperties['ReleaseKeyAlias']
            keyPassword keystoreProperties['ReleaseKeyPassword']
        }
    }
}复制代码

固然,隐藏签名信息的方式还有不少。好比配置在本地环境变量中,或者 build.gradle 文件中,或者编译时从命令行中动态读取输入内容等,设置不一样,读取方式有所不一样。

日志开关

在 app/build.gradle 文件中分别定义 debug 和 release 不一样编译模式的控制变量,变量名可自由更改:

buildTypes {
    debug {
        buildConfigField "boolean", "DEBUG_MODE", "true"
    }
    release {
        buildConfigField "boolean", "DEBUG_MODE", "false"
    }
}复制代码

从新编译后,自动生成的 BuildConfig 类中包含上面定义的 DEBUG_MODE 属性,便可使用。

Log 日志开关更多解决方案,可参考:Android 中可以做为 Log 开关的一些操做以及安全性浅谈

环境分离

开发中测试服务器和生产服务器的同时使用也是很常见的场景之一,如何在一台设备中同时安装配置测试环境的 debug 包和生产环境的 release 包,也是须要面对的问题。不妨参考个人这篇文章:

Android 利用 Gradle 实现 app 的环境分离

参考连接

学习有关 Android、Gradle 和 Groove 更多详细信息,除了访问 Gradle 官方网站,推荐你阅读这些文章:

END

关于我:亦枫,博客地址:yifeng.studio/,新浪微博:IT亦枫

微信扫描二维码,欢迎关注个人我的公众号:安卓笔记侠

不只分享个人原创技术文章,还有程序员的职场遐想

相关文章
相关标签/搜索