android清单内部版本号

时间:2010-09-09 02:52:43

标签: android eclipse android-manifest

我想知道每次构建或运行Android应用程序时是否有可能让Eclipse自动增加Manifest内的构建版本号。

有没有人做过这样的事情?

2 个答案:

答案 0 :(得分:5)

我不认为Eclipse本身可以做到,但我想你可以编写一个解析清单文件并更新数字的脚本。您可以将其设置为预构建步骤,因此每次Eclipse编译代码时,它都会更改数字。

我唯一关心的是你可以达到相当大的数字,这取决于你的开发过程的迭代程度。此外,这会让您忘记更新版本字符串,并且系统会提示用户从版本1.0升级到版本1.0。

答案 1 :(得分:0)

此处我的几乎通用的 Java应用更新版本代码和版本名称

几乎是通用的,因为文件解析不是100%保证(对于格式良好的xml清单工作正常,在大多数情况下应该没问题)

选择/先决条件:

  • versionName应为 major.minor.point (由Android doc提供建议)
  • versionName可以保留,重置为1.0.0或递增(其中一个部分和尾随部分设置为0)
  • versionCode将替换为 Unix Time

代码:

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