Android使用Gradle自动化打包

转载请注明出处: http://blog.csdn.net/a992036795/article/details/52095036

假如我们使用了友盟sdk或者别的sdk,我们需要在androidMainifest 填写一个渠道号,来帮助我们统计。也就说app发布之后需要每个应用市场对应着唯一的渠道号。如果我们不使用自动化打包的话,就非常的麻烦,需要自己去改Mainifest.xml中的渠道号。还好,我们可以使用gradle来帮我们完成这个过程。
我目前的一个项目使用了友盟统计,我需要在AndroidMainifest.xml中写入渠道号

 <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

我使用${UMENG_CHANNEL_VALUE} 来代替渠道号,最终中使用gradle会将它替换成真正的渠道号。
我们在app 的build.gradle文件中android{}中,这样写:

  productFlavors {
        wandoujia {
        }
        qihu360 {
        }
        baidu {
        }
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    }

这样在打包之后他就会使用 wandoujia ,qihu360,baidu来替换UMENG_CHANNEL_VALUE 完成渠道号的填写
然后我们在命令行输入 gradle assemble 来完成打包。
如果不出问题,它将会在app/build/outputs/apk 文件夹下生成打包好的文件 类似 app-wandoujia-realease.apk 这种apk文件。

当然如果我们希望在 apk文件命中加入 版本信息,和时间信息的话,我们可以更改这个apk的文件名,我们只需在 android{} 中加入:

android.applicationVariants.all { variant ->
        def file = variant.outputs[0].outputFile
        variant.outputs[0].outputFile = new File(file.parent,
                file.name.replace(".apk", "-" + defaultConfig.versionName +"-"+releaseTime()+ ".apk"))

    }

其中releaseTime()是自己定义的一个函数:

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

这样我们继续运行打包命令,就会在build/outputs/apk/得到 如 app-wandoujia-debug-1.0.0-2016-08-02.apk这样的文件。
如果不使用命令行,也可以使用android studio 右边的快捷方式
这里写图片描述
根据需要单机即可,如果想只打包release版,就点击 assembleRelease

最终会根据不同的渠道生成渠道包:
这里写图片描述

这样就完成了自动化打包。

接下来我们说话一下 签名的配置,以及一些打包的选项。
我们配置签名的话,可以在android{ signingConfigs{} } 中进行配置,例如:

android {
    signingConfigs {
        release {
            keyAlias 'xxxx'
            keyPassword 'xxxx'
            storeFile file('/xxxx.jks')
            storePassword 'xxx'
        }
        debug {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('/debug.keystore')
            storePassword 'android'
        }
    }

然后在android{ buildTypes{}} 中写:

 release {
            minifyEnabled false
            buildConfigField("boolean", "LOG_DEBUG", "false")
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig = signingConfigs.release
        }
        debug {
            buildConfigField("boolean", "LOG_DEBUG", "true")
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig = signingConfigs.debug
        }

他们分别用来打包release版和debug版
其中有一些选项可以设置:
minifyEnabled 这个选项决定是否混淆
proguardFiles 这个指定了混淆的配置文件路径,默认是app目录下的 proguard-rules.pro
shrinkResources 可以移除无用资源
….

buildConfigField 这个属性可以在 java代码包名地下的 BuildConfig中加入字段
这句代码 buildConfigField(“boolean”, “LOG_DEBUG”, “true”)作用是在BuildConfig
中加入了一个域 public static final boolean LOG_DEBUG = true;
这样我们就可以在 java代码中判断,是否为debug版本了。
这里写图片描述

最后我附上我的配置:

apply plugin: 'com.android.application'
apply plugin: 'android-apt'
android {
    signingConfigs {
        release {
            keyAlias 'xxx'
            keyPassword 'xxxxxx'
            storeFile file('/xxx.jks')
            storePassword 'xxxxx'
        }
        debug {
            keyAlias 'androiddebugkey'
            keyPassword 'android'
            storeFile file('/debug.keystore')
            storePassword 'android'
        }
    }
    compileSdkVersion 23
    buildToolsVersion "23.0.3"
    defaultConfig {
        applicationId "xxxxxx"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            buildConfigField("boolean", "LOG_DEBUG", "false")
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig = signingConfigs.release
        }
        debug {
            buildConfigField("boolean", "LOG_DEBUG", "true")
            minifyEnabled false

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig = signingConfigs.debug
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
            java.srcDirs = ['src/main/java', 'src/main/java-gen']
        }
    }
    productFlavors {
        wandoujia {
        }
        qihu360 {
        }
        baidu {
        }
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    }
    android.applicationVariants.all { variant ->
        def file = variant.outputs[0].outputFile
        variant.outputs[0].outputFile = new File(file.parent,
                file.name.replace(".apk", "-" + defaultConfig.versionName +"-"+releaseTime()+ ".apk"))

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

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值