3
A
回答
5
我不認爲Eclipse本身可以做到這一點,但我會想象你可以編寫一個腳本來解析清單文件並更新數字。您可以將其設置爲預構建步驟,因此每次Eclipse編譯您的代碼時,它都會更改編號。
我唯一擔心的是,你可能會達到相當大的數字,這取決於你的開發過程如何迭代。此外,這會讓您冒着忘記更新版本字符串的風險,並且會提示用戶從版本1.0升級到版本1.0。
0
這裏我幾乎通用 Java應用程序更新版本號和版本名稱
幾乎通用的,因爲文件的解析是不是100%的保證(正常工作與格式良好的XML清單,並應在最OK情況)
選擇/先決條件:
- 的versionName應該是major.minor.point(根據Android文檔建議)
- versionName可以保留,重置爲1.0.0或增加(其單個部分和尾部部分設置爲0)
- versionCode將被替換通過UNIX時間
代碼:
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;
}
}
相關問題
- 1. ASP.Net版本號/內部版本號
- 2. 瞭解內部版本號在Android的
- 3. 新版本的Xcode內部版本號
- 4. 內部版本VS版本號
- 5. 版本內部版本號與TortoiseSNV
- 6. Xcode版本和內部版本號
- 7. 內部版本號/指紋
- 8. Xcode的內部版本號
- 9. TFS 2015內部版本號
- 10. BIOS內部版本號和標識號?
- 11. 將Octopack nuget版本號更改爲teamcity的內部版本號
- 12. MonoTouch的自動增量內部版本號版本號爲
- 13. TeamCity內部版本號與Ant版本號任務
- 14. 參考代碼中的內部版本號或版本號
- 15. Maven,刪除部分版本並替換內部版本號
- 16. 無法從Android清單文件獲取版本號字符串
- 17. 搖籃戰爭清單版本號錯誤的發佈版本
- 18. Android sdk版本在gradle和清單
- 19. 錯誤在Android清單(SDK版本)
- 20. Android中的minSDK版本清單問題
- 21. System.Web.AspNetHostingPermission巡航控制內部版本號
- 22. python查找mac os內部版本號
- 23. 覆蓋Hudson內部版本號
- 24. 自動增加內部版本號
- 25. iTunes Connect的內部版本號重置
- 26. Inno setup的每頁內部版本號
- 27. SQL Azure中的內部版本號
- 28. Concourse CI和內部版本號
- 29. tfs內部版本號 - 入門
- 30. TFS內部版本號格式
沒有理由的腳本無法更新版本字符串太:)你知道如何讓Eclipse來運行一個腳本?我計劃通過設置它來避免大數字,只有在將它推送到設備/仿真器時才能運行。 – smith324 2010-09-09 17:05:58
它當然可以,但我不知道你是否願意控制版本字符串,因爲它暴露給用戶。您可以在項目設置中設置構建步驟。我現在沒有在我面前,但基本上有以下步驟:a)構建時,b)清潔項目時,可以添加任意數量的步驟。每一步都可以是執行的任意命令。 – EboMike 2010-09-09 17:19:17