Android开发中我们一般通过手工修改AndroidManifest.xml文件中android:versionCode和android:versionName字段来定义应用版本号和版本名。如下图红圈区域所示:
在实际的开发中,功能或代码等更新而要频繁地修改对应的版本号、版本名,难免会因为忘记手工修改,导致新版本仍然沿用了老的版本信息,造成自动升级失败等尴尬场面,也不便于追踪产品和排查问题。本文通过实践,提供一种在Eclipse开发环境下自动生成应用版本信息的方法,已在svn1.8和git 1.9中验证可行。
略去布满荆棘的实验过程,直接分享我的胜利果实。下面向大家介绍这种方法的使用步骤和注意事项:
1、 核心脚本文件make_ver_name.sh
Linux Shell脚本方式实现,主要负责完成功能有:获取主版本号(可自定义修改)、获取svn当前版本号(或git当前顺序提交号)、获取系统当前日期时刻信息、自动替换AndroidManifest.xml中versionName字段。此脚本并没有更改versionCode,有兴趣的朋友可以修脚本如法炮制一下。
使用前,请确保AndroidManifest.xml文件中versionName所在行以‘>’结尾。如下图红圈:
make_ver_name.sh脚本文件的完整代码如下:(注意事项:在svn中使用前,要删除第9行首 #号(取消注释),在第12行首添加 #号注释掉12行这条语句。)
# make_ver_name.sh
# This script must run in GitBash or linux shell console.
# Author: Jingle.du 2016-03-11
# main version can manually define
mainv='v0.14'
# svn use this follow script:
# repv=`svnversion |sed 's/^.*://' |sed 's/[A-Z]*$//'`
# git use this follow script:
repv=`git rev-list --all --count`
dt=$(date +%Y%m%d_%H%M%S)
# echo $mainv
# echo $repv
# echo $dt
# repv='12all'
if [ -z $repv ]; then
# it's not number and not null.
repv=$repv'x'
fi
# echo $repv
RET=`expr match $repv "[0-9]*$"`
# echo $RET' number character.'
if [ ${RET} -gt "0" ]; then
declare -i iv=$repv
# echo $?
# echo "It is a Number!"
else
echo "Version failed to get! Please check the correct svn or git."
exit 1;
fi
let iv+=1
repv=$iv
echo $repv
mainv=$mainv'.'$repv'_'$dt
# echo $mainv
sed -i s/versionName=".*"/versionName="\"$mainv\" \>"/ AndroidManifest.xml
cat AndroidManifest.xml |grep versionName
2、辅助的脚本文件ver.bat
在Windows系统中不能直接执行上面的Linux Shell脚本,这里需要借助msysgit目录下的sh.exe来帮我们完成,为方便后面Eclipse中的设置,我们再写一个辅助的脚本文件ver.bat。完整代码如下:
REM sh "E:\FW1_MOBILE_SVN\VideoPlayer\make_ver_name.sh"
sh make_ver_name.sh
上面两个脚本的下载地址:http://download.csdn.net/detail/dj0379/9468744
3、 安装git/svn环境:
msysGit-fullinstall-1.8.4-preview20130916.exe
TortoiseSVN-1.9.3.27038-win32-svn-1.9.3.msi
这里需要说明一下:svn中我们也要借助msysgit里的sh.exe执行脚本文件,所以记得安装msysGit。另外由于msysGit中自带的svn版本可能过低,而脚本中用到的命令需要svn 1.8以上版本才支持;在安装完成后,请将<Subversion安装目录>\bin下的svnversion.exe拷贝到msysgit\bin目录下,替换原有的旧版本。
4、 部署脚本:
把 两个脚本 make_ver_name.sh 和 ver.bat 拷贝到具体 Android 应用的工程根目录(即和 AndroidManifest.xml 在同一目录),如下图所示:
5、 正确配置Eclipse:
在Eclipse中选择:项目属性(Alt+Enter)→构建器→新建(N)...,如下图红圈:
出现“选择配置类型”对话框,选择:程序 →确定
在“编辑配置”对话框中,输入自定义的构建器“名称(N):”为auto_update_version;
点击“位置”栏下“浏览工作空间(P)...”按钮,在当前Android工程目录下选中ver.bat脚本;
点击“工作目录”栏下“浏览工作空间(P)...”按钮,选择当前Android工程根目录;
如下图所示:
先别急着点确定!选择“刷新”页签,勾选“完成时刷新资源(U)”,选中“特定资源(S)”,点击“指定资源(R)...”按钮,如下图所示:
在“编辑工作集”对话框中,注意:只勾选当前Android项目下的AndroidManifest.xml文件,然后点击确定按钮。
还是别急着点确定!选择“构建选项(B)”页签:
“分配控制台”选项用于让用户可以在Eclipse的Console窗口和脚本进行交互。勾选此项,脚本执行时会在Console窗口打印出执行时的日志信息,便于排查构建过程中脚本发生的错误。建议你在不确定脚本是否能正常工作前先勾选,在确保脚本能正确运行后再去掉此选项。
只勾选 “在自动构建期间(U)”,其他一定不要勾!
注意:确定前,别忘记点击“指定资源...”按钮,设定哪些文件发生变化时要重新运行此脚本。
指定资源工作集时,一定不要勾AndroidManifest.xml。因为每次脚本执行完都会修改这个文件;如果勾选意味着:只要AndroidManifest.xml有改变,就需要再执行一回脚本,脚本执行就又会改变这个文件,周而复始出现死循环。那这里的应该指定哪些资源才对呢?一个原则:Android工程构建路径中有涉及到的源代码、资源文件,那些有改动就需要重新编译或打包的文件和文件夹(包括一些用户库文件)。当然每个项目细节多少有不同,具体也可以反复尝试修改勾选来确定。一般要勾选的一定有src、res、assets文件夹和.classpath、.project、project.properties几个文件。勾选这个工作集,是为了在这些文件有改变时才激发增量编译同时执行自定义的构建器中的脚本。其实这里漏勾一两个也没事,我们可以通过Clean Build来强制构建器执行脚本。
这样才算真正定义完构建器,可以点击“确定”按钮了。如果需要修改这个构建器,可以再到“项目属性(Alt+Enter)”对话框里,选中auto_update_version,点击“编辑(E)...”按钮来完成。
6、 测试脚本:
右键点击当前Android项目 →运行方式(R) → Android Application,使用git的朋友很可能会碰到“无法启动此程序,因为计算机中丢失libiconv-2.dll”的错误,如下图所示:
很明显这是因为脚本中调用git命令时找不到libiconv-2.dll这个动态库导致。
检查Windows系统的用户环境变量如下图:
打开<msysgit安装目录>\bin,我机器上是在D:\msysgit\msysgit\bin目录下,直接复制此目录下的libiconv2.dll为libiconv-2.dll,如下图所示:
再次回到Eclipse中,右键点击当前Android项目 →运行方式(R) → Android Application,或者项目菜单 → 清理(N...) → 清理下面所选项目 → 勾选当前Android项目 → 确定。
如果通过编译不报错,打开AndroidManifest.xml文件,检查versionName字段,不难发现版本名已经正确生成了。格式及含义如下图:
如果编译后Console窗口输出日志类似下图所示,请检查make_ver_name.sh脚本中第9行和第12行代码对应git或svn是否修改正确,参见本文“1、核心脚本文件make_ver_name.sh”部分的注意事项。
本文参考:
6、sed实例精解
7、sed正则表达式
10、 如何在shell中处理异常