2010-09-09 94 views
3

我想知道是否有可能在每次構建或運行Android應用程序時,Eclipse都會自動增加Manifest內部的版本號。Android清單內部版本號

有沒有人做過這樣的事情?

回答

5

我不認爲Eclipse本身可以做到這一點,但我會想象你可以編寫一個腳本來解析清單文件並更新數字。您可以將其設置爲預構建步驟,因此每次Eclipse編譯您的代碼時,它都會更改編號。

我唯一擔心的是,你可能會達到相當大的數字,這取決於你的開發過程如何迭代。此外,這會讓您冒着忘記更新版本字符串的風險,並且會提示用戶從版本1.0升級到版本1.0。

+1

沒有理由的腳本無法更新版本字符串太:)你知道如何讓Eclipse來運行一個腳本?我計劃通過設置它來避免大數字,只有在將它推送到設備/仿真器時才能運行。 – smith324 2010-09-09 17:05:58

+0

它當然可以,但我不知道你是否願意控制版本字符串,因爲它暴露給用戶。您可以在項目設置中設置構建步驟。我現在沒有在我面前,但基本上有以下步驟:a)構建時,b)清潔項目時,可以添加任意數量的步驟。每一步都可以是執行的任意命令。 – EboMike 2010-09-09 17:19:17

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; 
    } 
}