我想知道每次构建或运行Android应用程序时是否有可能让Eclipse自动增加Manifest
内的构建版本号。
有没有人做过这样的事情?
答案 0 :(得分:5)
我不认为Eclipse本身可以做到,但我想你可以编写一个解析清单文件并更新数字的脚本。您可以将其设置为预构建步骤,因此每次Eclipse编译代码时,它都会更改数字。
我唯一关心的是你可以达到相当大的数字,这取决于你的开发过程的迭代程度。此外,这会让您忘记更新版本字符串,并且系统会提示用户从版本1.0升级到版本1.0。
答案 1 :(得分:0)
此处我的几乎通用的 Java应用更新版本代码和版本名称
几乎是通用的,因为文件解析不是100%保证(对于格式良好的xml清单工作正常,在大多数情况下应该没问题)
选择/先决条件:
代码:
package com.mycompany.tools;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IncrementVersion
{
enum INCREMENT
{
MAJOR, // increment 1rst component of version Code (i.e. 'major') add trailing '.0.0'
MINOR, // preserve major, increment 2nd component of version Code (i.e. 'minor'), add trailing '.0'
POINT, // preserver major, minor, increment 3rd component of version Code (i.e. 'point')
NONE, // do not change versionName, only change version code (to current Unix times)
RESET // RESET -> reset verseionNAme to 1.0.0
}
// update this to select which version name part to update
static final INCREMENT increment = INCREMENT.NONE;
static final String projectName = "com.mycompany.myproject";
// OR static final String projectName = "com.mycompany"; -> match all my projects :-)
public static void main(String[] args)
{
File directory = new File("");
for (File projectDirecotry : directory.listFiles())
{
if (projectDirecotry.getName().startsWith(projectName))
{
exec(projectDirecotry);
}
}
}
private static void exec(File projectDirectory)
{
File androidManifestFile = new File(projectDirectory, "AndroidManifest.xml");
if (androidManifestFile.exists())
{
writeFile(androidManifestFile, readFile(androidManifestFile));
}
}
private static void writeFile(File androidManifestFile, String newContent)
{
BufferedWriter bw = null;
try
{
bw = new BufferedWriter(new FileWriter(androidManifestFile));
bw.write(newContent);
} catch (Throwable th)
{
th.printStackTrace();
} finally
{
if (bw != null)
{
try
{
bw.close();
} catch (Throwable th)
{
}
}
}
}
private static String readFile(File androidManifestFile)
{
StringBuilder sb = new StringBuilder();
BufferedReader br = null;
try
{
br = new BufferedReader(new FileReader(androidManifestFile));
String line;
while ((line = br.readLine()) != null)
{
sb.append(parse(line)).append('\n');
// System.out.println(line);
}
} catch (Throwable th)
{
th.printStackTrace();
} finally
{
if (br != null)
{
try
{
br.close();
} catch (Throwable th)
{
}
}
}
return sb.toString();
}
// public static final DateFormat dateTimeFormat = new SimpleDateFormat("yyyyMMddHHmm", Locale.ROOT);
public static long getUnixTime()
{
return System.currentTimeMillis() / 1000L;
}
private static String parse(String line)
{
{
// android:versionCode="1"
// use 201408221404 instead
String versionCodePrefix = "android:versionCode=\"";
int indexOfVersionCodePrefix = line.indexOf(versionCodePrefix);
if (indexOfVersionCodePrefix != -1)
{
indexOfVersionCodePrefix += versionCodePrefix.length();
versionCodePrefix = line.substring(0, indexOfVersionCodePrefix);
String versionCode = line.substring(indexOfVersionCodePrefix, line.length());
int indexOfVersionCodeSuffix = versionCode.indexOf('"');
if (indexOfVersionCodeSuffix != -1)
{
String versionCodeSuffix = versionCode.substring(indexOfVersionCodeSuffix);
// versionCode = versionCode.substring(0, indexOfVersionCodeSuffix);
// return versionCodePrefix + (Integer.parseInt(versionCode) + 1) + versionCodeSuffix;
// 1409302337
return versionCodePrefix + getUnixTime() + versionCodeSuffix;
}
}
}
{
if (increment != INCREMENT.NONE)
{
// android:versionName="1.0.0" >
String versionNamePrefix = "android:versionName=\"";
int indexOfVersionNamePrefix = line.indexOf(versionNamePrefix);
if (indexOfVersionNamePrefix != -1)
{
indexOfVersionNamePrefix += versionNamePrefix.length();
versionNamePrefix = line.substring(0, indexOfVersionNamePrefix);
String versionName = line.substring(indexOfVersionNamePrefix, line.length());
int indexOfVersionCodeSuffix = versionName.indexOf('"');
if (indexOfVersionCodeSuffix != -1)
{
String versionNameSuffix = versionName.substring(indexOfVersionCodeSuffix);
versionName = versionName.substring(0, indexOfVersionCodeSuffix);
Pattern pattern = Pattern.compile("([^\\.])*\\.([^\\.])*\\.([^\\.])*");
Matcher m = pattern.matcher(versionName);
if (m.matches())
{
int major = Integer.parseInt(m.group(1));
int minor = Integer.parseInt(m.group(2));
int point = Integer.parseInt(m.group(3));
switch (increment)
{
case MAJOR:
major += 1;
minor = 0;
point = 0;
break;
case MINOR:
minor += 1;
point = 0;
break;
case POINT:
point += 1;
break;
case RESET:
major = 1;
minor = 0;
point = 0;
break;
default:
break;
}
return versionNamePrefix + major + '.' + minor + '.' + point + versionNameSuffix;
}
}
}
}
}
return line;
}
}