有时候,我们会希望能把APK文件名上带上打包日期,打包时svn的版本号,应用版本号等。当然这些也可以手动添加,但是手动的话也未免太不优雅了,而且可能会出错。

利用Gradle,我们可以让打包出来的apk自动的带上一些列信息。

默认读者已经对gradle有一定的了解,有buildtypes,productFlavors的概念。不了解的可以看看上一篇或者去网上搜索来补充一下。

Gradle是基于groovy的自动化构建工具,在build.gradle中我们可以用一些脚本,函数来控制编译的过程。本文所实现的功能,就是用gradle来控制编译完成后输出文件的文件名来实现的。

首先来个简单的例子,文件名上加上日期。

android {

    compileSdkVersion 22
buildToolsVersion '23.0.1' defaultConfig { minSdkVersion 11
targetSdkVersion 22
versionCode 14
versionName "1.7"
// dex突破65535的限制
multiDexEnabled true
// 默认是umeng的渠道
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "test"]
}
buildTypes {
release { minifyEnabled true zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
def fileName = "myapp_v${defaultConfig.versionName}_${releaseTime()}.apk"
output.outputFile = new File(outputFile.parent, fileName) }
}
}
}
}
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
 

重点在buildTypes->release->applicationVariants里面的

def fileName = "myapp_v${defaultConfig.versionName}_${releaseTime()}.apk"

这句话,defaultConfig是在上面设置的一些参数,releaseTime()函数是在最下面定义的获取当前时间的函数。按照这个格式,输出的文件名应该是:myapp_v1.7_2015-22-22.apk

写完这个后,执行:

./gradlew assemble_Release

就可以输出指定文件名格式的APK了。

通过以上步骤,我们可以体会到gradle的灵活性。

下面就是这篇文章的重点了,在你的apk名字中加上svn版本号。这样做的好处的测试的时候可以更好的定位bug等,还算是蛮有用的。只是不知道为什么百度根本检索不到类似的文章,去google才找到一些资料。也不知道是因为国内的人不爱分享呢,还是百度太菜呢,哈哈。

加SVN版本号和上面的加入时间原理基本相同,就是要引入一个第三方的库,这个库可以获取svn的信息。

首先在projece 的build.gralde中的dependencies中添加svnkit这个依赖:

dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.8.11'
}

我们就是利用这个库来在编译的时候获取svn的信息的。

然后在module的build.gradle最上方添加

import org.tmatesoft.svn.core.wc.*

这样就把svnkit这个库引入过来了。

再添加一个获取svn版本号的方法,类似一获取时间的方法。

def getSvnRevision() {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
SVNClientManager clientManager = SVNClientManager.newInstance(options);
SVNStatusClient statusClient = clientManager.getStatusClient();
SVNStatus status = statusClient.doStatus(projectDir, false);
SVNRevision revision = status.getCommittedRevision();
return revision.getNumber();
}

这里面用到的都是svnkit的一些方法了,有兴趣的可以自己多了解一下。

整体build文件如下:

// project build.gradle

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.8.11'
}
} allprojects {
repositories {
jcenter()
}
}
//module build.gradle
import org.tmatesoft.svn.core.wc.* apply plugin: 'com.android.application' def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
} def getSvnRevision() {
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
SVNClientManager clientManager = SVNClientManager.newInstance(options);
SVNStatusClient statusClient = clientManager.getStatusClient();
SVNStatus status = statusClient.doStatus(projectDir, false);
SVNRevision revision = status.getCommittedRevision();
return revision.getNumber();
} android { compileSdkVersion 22
buildToolsVersion '23.0.1' defaultConfig {
minSdkVersion 11
targetSdkVersion 22
//登录注册评论点赞
versionCode 14
versionName "1.7"
// dex突破65535的限制
multiDexEnabled true
// 默认是umeng的渠道
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "test"]
} buildTypes {
release { minifyEnabled true zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
//这里修改文件名
def fileName = "myapp_v${defaultConfig.versionName}_${releaseTime()}_${getSvnRevision()}.apk"
output.outputFile = new File(outputFile.parent, fileName) }
}
} productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
yingyongbao {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yingyongbao"]
} } } dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.umeng.analytics:analytics:latest.integration'
compile 'com.android.support:appcompat-v7:22.2.0' }

最后执行:

./gradlew assembleRelease

这样,就可以打包出名字格式为:myapp_v1.7_20xx-xx-xx_1234.apk的APK文件了

Android Gradle实用技巧——APK文件名中加上SVN版本号,日期等的更多相关文章

  1. Android Gradle实用技巧——多渠道打包

    友盟有很多不错的功能,例如渠道统计等. 想要做渠道统计,有一个要求就是要在manifest文件中添加各个渠道的配置.只有一两个渠道还好说,但是渠道多了的话,手动修改然后打包简直是噩梦. 幸好现在And ...

  2. Android Studio 打包自定义apk文件名

    使用Android Studio打包的时候,我们有时候需要自定义apk的文件名,在此记录一下. 在app的build.gradle中,根节点下使用关键词def声明一个全局变量,用于获取打包的时间,格式 ...

  3. android 编程小技巧(持续中)

    first:     Intent跳转一般存用于Activity类,可是若要在非activity类里跳转的话,解决方法是在startActivity(intent)前加mContext即上下文,终于为 ...

  4. 利用 Android Gradle 瘦身 apk

    http://devyang.me/blog/2014/11/11/li-yong-android-gradleshou-shen-apk/ apk瘦身一般有两条线, 去除无用的代码,例如引用一个比较 ...

  5. 自己主动化的在程序中显示SVN版本号

    有时候会有这种情况,策划拿着应用过来提一个bug,但我们却不好确定策划的手机上装的应用相应的是那个代码版本号. 为了解决问题.我们希望能在应用上显示出当前应用所相应的代码版本号,即svn版本号. 构想 ...

  6. Android开发有用技巧:推断当前系统语言版本号

    Locale locale = getResources().getConfiguration().locale; String language = locale.getLanguage(); 以上 ...

  7. 在VS项目中使用SVN版本号作为编译版本号

    在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分.版本号的规则也有许多种,在此不讨论具体的编码规范.对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时, ...

  8. 开发日记:在VS项目中使用SVN版本号作为编译版本号

    在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分.版本号的规则也有许多种,在此不讨论具体的编码规范.对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时, ...

  9. Android Gradle defaultConfig详解及实用技巧

    实际项目中,都会应用Android Gradle Plugin,根据实际中的项目模块的职责,可以具体应用如下四种插件类型. 1,apply plugin: 'com.android.applicati ...

随机推荐

  1. CSS控制文本超出指定宽度后用省略号代替,CSS控制文本不换行

    CSS控制文本超出指定宽度后用省略号代替,CSS控制文本不换行. 一般的文字截断(适用于内联与块): .text-overflow {     display:block;/*内联对象需加*/     ...

  2. hdu2955 Robberies  01背包+概率

    link:http://acm.hdu.edu.cn/showproblem.php?pid=2955 首先,这个题目的背包容量不能是概率.1.精度不清楚.2.把概率相加有什么意义呢?所以,转换一下, ...

  3. PHP避免刷新页面重复提交

    PHP避免刷新页面重复提交 2013-07-09 15:27 匿名 | 浏览 3567 次 编程语言 情景:从html提交数据到x.php 在x.php中$_POST数据写库并且显示,当x.php刷新 ...

  4. Android 中解析 JSON

    有什么不懂的可以去官网去看看:www.json.org 在google android中也有关于解析JSON的类库:JsonReader,但是只能在3.0以后的版本中才可以用,在这里我们用google ...

  5. TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏

    TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...

  6. Scrum 项目2.0

    阅读教材第8章,8.1~8.3节 P157~168,了解获取用户需求的办法,每个组可以选择一二加以应用. 8.4节P168-171 查阅NABCDA模型的具体说明. 2.SCRUM 流程的步骤 1 完 ...

  7. 多网卡 指定网卡到指定IP

    route add -net 1.2.3.0/24 gw 网关 route add -host 目标IP dev eth1route add -host 目标IP gw 网关

  8. breakpoints

    https://blogs.msdn.microsoft.com/visualstudioalm/2013/10/07/breakpoints-in-visual-studio-2013/ Using ...

  9. gprof使用介绍

    gprof 1.1      简介 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口处插入计数器用于收集 ...

  10. struts2标签整理

    在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题,   一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文件:   Java代码   ...