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包。

你的有足够的实力,你的原则和底线才会被人尊重

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容