Android studio 自动化构建打包

关于gradle下Android{}的配置字段说明如下:

defaultConfig{}默认配置,是PriductFlavor类型,它共享给其他ProductFlavor使用

sourceSets{}源文件目录设置,是AndroidSourceSet类型

buildtypes{} buildtype类型

sigingConfigs{}签名配置,signingConfig类型

productFlavors{} 产品风格配置,ProductFlavor类型

testOptions{} 测试配置 testOptions类型

aaptOptions{}  aapt配置  AaptOptions类型

lintOtions{} lint配置 lintOptons类型

dexOptions{} dex配置,DexOptions类型

compileOptions{} 编译配置,CompileOptions类型

packagingOptions{} PackagingOptions类型

jacoco{} jacocoExtension类型 用于设定jacoco版本

splits{} Splits类型

脚本构建工作如下

关于gradle配置编译APK相关签名如下;

signingConfigs {

        release {

            storeFile file('E:\Gsafty\keystoreName.keystore') //绝对路径

            storePassword "12345678"

            keyAlias "alias"

            keyPassword "12345678"

        }

    }

构建类型(开发过程中会不断的提交测试debug包到测试人员去测试)

如下代码仅做参考:

buildTypes {

        release {

            minifyEnabled false

            shrinkResources false

            zipAlignEnabled false

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

        }

        debug {

            minifyEnabled false

            shrinkResources false

            zipAlignEnabled false

        }

        custom {

            minifyEnabled false

            shrinkResources false

            zipAlignEnabled false

        }

        sourceSets {

            main {

                jni.srcDirs = []

            }

        }

    }

多渠道打包构建不同渠道的多尔类型APK

这里不同的渠道会根据构建类型生产对应的apk,其对应关系为渠道种类*构建编译类型数等于编译出的APK数。

/*多渠道包*/

    productFlavors{

        tencent{

            applicationId "com.domin.armn"

            versionCode "1.0"

            versionName "1.2.0"

            manifestPlaceholders = [appName: "tencent"]

        }

        baidu{

            applicationId "com.domin.armn"

            versionCode "1.0"

            versionName "1.2.0"

            manifestPlaceholders = [appName: "baidu"]

        }

    }

自定义生产APK包名称

例如:module——flavor-version-time-buildtye.apk

在app下的build.gradle跟目录下声明如下。

//获取当前时间

def getCurrentTime() {

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

}

在Android{}目录下声明如下:

/*apk重命名*/

    android.applicationVariants.all { variant ->

        variant.outputs.each { output ->

            def outputFile = output.outputFile

            if (outputFile != null && outputFile.name.endsWith('.apk')) {

                def buildType = variant.buildType.name

                //这里修改apk文件名,格式为 module_flavor-version-time-buildtype.apk

                def fileName = "Gsafety_${variant.productFlavors[0].name}-V${defaultConfig.versionName}-${getCurrentTime()}-${buildType}.apk"

                output.outputFile = new File(outputFile.parent, fileName)

            }

        }

    }

进阶配置项

以上所有的配置尚且不能够完全满足自动化编译,乃然需要用户手动输入命令去进行编译APK包,这当然不是我们最想要的结果

gradle执行相关命令如下:

注:在使用编译命令之前请确保gradle已经加入环境变量,如果没加入可以通过./gradlew代替gradle(只能在项目更目录下使用)

1编译所有productFlavor及对应所有buildType的apk

$gradle assemble //仅仅执行项目打包所必须的任务集

$gradle build  //执行项目打包所必须的任务及,以及执行自动化测试,所以会较慢

如果缺失某参数,则会把该参数的所有配置都进行编译,即如果运行gradle assembleFlavor,则会编译出flavor所有buildType的apk

        例如:

$gradle assemble

$gradle assembleflavorRelease

$gradle assembleflavorDebug

注:gradle支持命令缩写,上面两个命令也可以写成如下格式

$gradle a

$gradle ass

$gradle aR

$gradle assflavorR

$gradle aD

$gradle assflavorD

在项目跟目录下创建一个指定的文件夹(用于编译跑脚本用),例如.config,然后在该目录下分别创建.bat文件(win7上批处理后缀文件)和签名文件

批处理文件如下build.bat

注意:这里可能会在cmd窗口出现中文乱码,这是由于便于问题,不会影响编译。

快速编译打包apk脚本

echo 打包开始

sleep 1

执行打包命令前,需要先定位到项目更目录

cd

执行打包命令

gradle a

echo -e  打包完成

桌面右上角弹出通知

notify-send build.sh 打包完成

创建签名文件sign.txt

签名文件之所以放在外边这里是为了更好的保护签名文件,尽量少的给其他人知道《安全考虑》

android {

    signingConfigs {

        release {

            storeFile file('E:\Gsafty\keystoreName.keystore') //绝对路径

            storePassword "12345678"

            keyAlias "alias"

            keyPassword "12345678"

        }

    }

}

将签名文件应用到app的buid.gradle文件下的Android{}

//加载签名信息

    File configFile = file('../.config/sign.txt')

    if (configFile.exists()) {

        def signGradlePath = configFile.newReader().readLine().trim()

        println 'lucher, path:' + signGradlePath

        if (file(signGradlePath).exists()) {

            apply from: signGradlePath

        }

    }

最后就是给开发人员的福利,在window机器上直接点击.bat文件执行批处理命令,即可在项目build目录下的apk目录下的到对应的apk包。

你可能感兴趣的:(Android studio 自动化构建打包)