English 中文(简体)
如何在日光中自动加固安装数量 Android 项目( 优先便携式溶液)
原标题:How to auto-increment build number of Android project in Eclipse (prefer portable solution)

让 IDE 自动递增构建数字是一个长期讨论的议题。 我总是惊讶地看到,

The highest scored question and answer (by quite a bit) for this topic are here: https://stackoverflow.com/a/8156809/150016 My problem is that the solution depends on .net and I d prefer to avoid a .net dependency for Eclipse solution. I also want to avoid any dependency on VCS.

因此,我正在寻找一种可以移动的和像Eclipse-sish一样的解决方案。我认为最好的候选人是蚂蚁解决方案(我将张贴该解决方案)或类似于上述相关答案中的点网应用程序的爪哇应用程序。

(我之所以没有补充这个问题的答案,是因为这个问题有一个公认的答案,而且已经是一个很长的职位。 如果主持人希望我删除这个问题,并补充我对上述问题的答复。 )

我希望一些相对简单的东西, 但我不认为任何解决这个问题的办法 真的很简单。

最佳回答

你试过马文化你的机器人工程吗?

如果您使用 < a href=> "http://code.google.com/p/maven-android-pletin/" rel="noreferrer" > "maven-android-pletin" , 您可以用 pom. xml s "version" 标签跟踪您的项目构建 。

在 pom.xml 中, 您可以使用 < a href=" http://code.google.com/ p/autincrement- versions- maven- plutin/" rel=" noreferrer" > "versions- maven- plutin" 来递增构建版本。

为了反映您 AndroidManifest.xml 的递增构建号。 您可以在您的 pom 文件中使用 < a href=" http://code.google.com/ p/ maven-android-plugin/wiki/ Synchronising Version with Gmaven" rel= “ noreferrer" > Synchronizing 版本技术 。

这样一来, 您可以在应用程序每次构建时运行“ versions- maven- plutin ”, 自动加速项目和机器人项目构建编号。 解决方案也可以以与蚂蚁解决方案相同的方式被移动 。

我希望这也能解决你所提到的问题(以及我所理解的),如果缺少什么,请纠正我。

问题回答

在工程属性对话框中,在构建器下,您可以在构建 Apk 之前配置要运行的脚本。

在属性对话框中,从左边的列表中选择构建器。单击 New 添加新的脚本。在弹出对话框中,选择程序。在接下来的对话框中,将您喜欢的名称字段中的构建器程序调用为您喜欢的创建器程序。在位置字段中设置脚本路径。在工作目录字段中给它一个工作目录。请注意,您可以在这些字段中指定变量(例如,我们使用 ${building_project:/libs/ update_version.sh/code>来引用项目lib目录中的脚本)。

您会想要在其它建筑商之前运行它, 所以使用 Up 按钮将其移动到列表的顶部 。

在对话框的“构建选项”标签上(在名称字段下右侧向上方),您可以为想要运行此程序时选择选项。

我假设了 Linux、 Unix 或 MacOS 。 在这些系统中, 您可以使用 grep 或它的变体来获取当前版本的 Code, 递增它, 然后对文件进行相应的修改 。 或者, 您可以在 Android Manifest. xml 文件中写入一个 Ruby、 Python、 Perl 等脚本来替换版本的 Code 。 我想 Windows 上有等效的工具, 但我并不非常熟悉这个环境 。

这是一个使用蚂蚁的解决方案。我必须承认,获得蚂蚁的设置有点麻烦,但它似乎是一个被广泛使用和强大的依附于埃克利普斯的办法,因此我相信,从其他方面来看,这对我来说是有价值的。

蚂蚁是建造没有日光片的Android SDK 应用程序的首选解决办法(如 < a href="http:// developmenter.android.com/guide/developing/building/index.html" rel= "nofollow noreferrer" > 这里所描述的),但不属于ADT的一部分,所以如果你只是使用日光片,你可能不会拥有它。

因此,第一步是从这里下载和安装 Ant

下一步在您的路径中添加 Ant, 并确保您的路径也指向 JDK( 而不是 JRE ) 。 在 Windows 上, 我发现我还必须创建 JAVA_ HOME 并指向 JDK 的根 。

我们只需要自动加速步骤的 Ant Ant, 其用意不是要取代Eclipse, 并将其用于整个建筑, 但我们只需要朝这个方向迈出几步, 以确保 Ant 起作用。 所以, 转到您的工程和类型 的根

> android update project --path .

这为您的工程创造了一个建筑.xml。 一旦我完成了,我就可以完成

> ant release

Ant 构建了我的项目。如果你想继续朝这个方向前进,我发现此篇文章 很有用。

接下来,我编辑了我的项目新建筑.xml, 并添加了以下任务(它可以去任何地方, 只是不能在另一个任务/目标中间)

 <target name="update.buildnum">
      <buildnumber/>
      <!-- this task creates (and increments) Ant property  build.number  which I use below -->
      <echo>Current build number:${build.number}</echo>         
      <echoxml file="res/values/buildnum.xml">
                <resources>
                    <string name="buildnum">${build.number}</string>
                </resources>                    
      </echoxml>
 </target>

上面使用的自动插入任务, 是一个名为 build. number in your Projects root 的文件中的构建数字( 它会创建这个数字) 。 以上任务的其余部分将当前构建数字设置为资源字符串, 以便您的应用程序可以用此代码检索 :

String build = context.getString( com.your.app.R.string. buildnum );
int appBuild = ( int ) Integer.parseInt( build ); 

有些人会更喜欢在AndroidManifest.xml. 包含此任务的一个答案, 但需要第3党Ant任务(xmltask), 我有点犹豫, 无法在每栋建筑上有第3党任务来修改我的列表( 它现在相当大)。 如果您决定使用该任务, 那么相应的Android代码来获取构建号将是 :

String packageName = ctx.getPackageName();
PackageInfo pInfo = ctx.getPackageManager().getPackageInfo( packageName, 0);
int appVer = pInfo.versionCode;

最后,你每次做一个建筑时, 需要让日圆来运行这个蚂蚁任务。

转到您的工程属性, 找到“ 构建器”, 并单击按钮添加一个新的构建器。 这里有很多选项, 但只需指定几个选项 。

  • Give the builder some name by setting the Name: field.
  • Select the Buildfile:. I used the browse workspace option to select it, and then it filled the field with "${workspace_loc:/appname/build.xml}"
  • Select targets from a list on the targets tab. In my case I had to remove the help task (the default task in the build.mxl generated above), and then add the build.number task. I suggest you only set a target for Manual Build:.

我移动了新的建筑商 成为建设的第一步。

此解决方案的一个问题是, 每次你让 Eclipse 部署( 运行) 您的应用程序时, 它都被认为是一个新的手工构建, 即使项目没有改变 。 因此, 如果您在多个设备中应用您的应用程序, 每个设备将有一个不同的构建, 有自己的构建编号。 有一点可以缓解这个问题, 谷歌说未来的 ADT 将允许在一个操作中进行变换部署 。

(以上)用Ant 1.8.4、Eclipse Indigo SR2 (3.7.2)、ADT 20 预览2和SDK 工具 20在 Win7 32bit上进行了试验。

我的解决方案基于使用 Ant( 没有 XML Task )

<property name="version.file" value="version.properties"/>
<property name="manifest.file" value="AndroidManifest.xml"/>
<!--build.slot: 0.1.2.3.4.5-->
<property name="build.slot" value="2"/>

<target name="all">
    <antcall target="increment.build"/>
    <antcall target="update.manifest"/>
</target>

<target name="increment.build">
    <propertyfile file="${version.file}">
        <entry key="build.no" type="int" default="0" operation="+" value="1" />
    </propertyfile>
</target>

<scriptdef name="setBuildNo" language="javascript">
    <attribute name="verName" />
    <attribute name="buildNo" />
    <attribute name="buildSlot" />
    <attribute name="property" />
    <![CDATA[
        var verNums = attributes.get("vername").split(".");
        var buildNo = attributes.get("buildno");
        var buildSlot = attributes.get("buildslot");
        if (!(buildSlot > 1 && buildSlot < 10))
            buildSlot = 2;
        var newVer = "";
        for (var i = 0; i < Math.min(verNums.length, buildSlot); i++)
            newVer += (verNums[i].trim() || "0") + ".";
        for (var i = verNums.length; i < buildSlot; i++)
            newVer += "0" + ".";
        project.setProperty(attributes.get("property"), newVer + buildNo);
    ]]>
</scriptdef>

<target name="debug">
    <setBuildNo verName="1" buildNo="999" property="a"/>
    <setBuildNo verName="2." buildNo="999" property="b"/>
    <setBuildNo verName="3.3" buildNo="999" property="c"/>
    <setBuildNo verName="4.4." buildNo="999" property="d"/>
    <setBuildNo verName="5.5.5" buildNo="999" property="e"/>
    <setBuildNo verName="6.6.6." buildNo="999" property="f"/>
    <setBuildNo verName="7.7.7.7" buildNo="999" property="g"/>

    <echo>1 =&gt; ${a}</echo>
    <echo>2. =&gt; ${b}</echo>
    <echo>3.3 =&gt; ${c}</echo>
    <echo>4.4. =&gt; ${d}</echo>
    <echo>5.5.5 =&gt; ${e}</echo>
    <echo>6.6.6. =&gt; ${f}</echo>
    <echo>7.7.7.7 =&gt; ${g}</echo>

</target>

<target name="update.manifest">

    <fail message="File not found: &quot;${manifest.file}&quot;" status="1">
        <condition>
            <not>
                <available file="${manifest.file}" />
            </not>
        </condition>
    </fail>

    <!-- Reads build version -->
    <loadproperties srcfile="${version.file}">
        <filterchain>
            <linecontains>
                <contains value="build.no="/>
            </linecontains>
        </filterchain>
    </loadproperties>

    <!-- Reads versionName from AndroidManifest -->
    <xmlproperty file="${manifest.file}" collapseAttributes="true"/>
    <fail unless="manifest.android:versionName" message="Attribute &quot;android:versionName&quot; undefined into &quot;${manifest.file}&quot;" status="1"/>
    <property name="version.name" value="${manifest.android:versionName}"/>

    <!-- Create a new version -->
    <setBuildNo verName="${version.name}" buildNo="${build.no}" buildSlot="${build.slot}" property="new.version.name"/>

    <!-- Replaces using regexp -->
    <replaceregexp
        file="${manifest.file}"
        match="android:versionName.*=.*&quot;.*${version.name}.*&quot;"
        replace="android:versionName=&quot;${new.version.name}&quot;"/>

    <!-- Replaces for check and generates a exception (if not found version) -->
    <replace
        file="${manifest.file}"
        token="android:versionName=&quot;${new.version.name}&quot;"
        value="android:versionName=&quot;${new.version.name}&quot;"
        failOnNoReplacements="true"/>

    <!--<echo>${version.file}</echo>
    <echo>${manifest.file}</echo>-->
    <echo>Auto Increment Build: ${version.name} =&gt; ${new.version.name}</echo>

</target>

Using

ant [-Dmanifest.file=<file>] [-Dversion.file=<file>] [-Dbuild.slot=<number>]
    -Dmanifest.file - path and filename AndroidManifest.xml. Default: AndroidManifest.xml in a folder with build.xml
    -Dversion.file - path and file name in which to store the number Build version. Default: version.properties folder with build.xml
    -Dbuild.slot - position of build number in version array. Default: 2, ie X.X.build.

Auto Increment Build in Eclipse

Project | Properties | Builders | New | Ant Build
    Main
        Build file
            <path>/build.xml
        Arguments
            -Dmanifest.file=${workspace_loc://AndroidManifest.xml} -Dversion.file=${workspace_loc://version.properties}
    Refresh
        [x] Refresh resources upon completion
        (*) Specify resources
            [Specify resources] 
                <Project>
                    [x] AndroidManifest.xml
    Build Options
        [x] Specify working set of relevant resources
            [Specify resources] 
                <Project>
                    [x] res
                    [x] src
                    [x] AndroidManifest.xml

我的解决方案使用其他答案( XML Task 和 Groovy ) 中找到的一些代码自动递增构建数字。 我还包括一条规则, 即进行 git 承诺和标记, 将构建数字连接到版本控制中的特定点上, 可用于跟踪错误 。

 <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/>


  <path id="groovy.classpath">
    <fileset dir="/Users/deepwinter1/.gvm/groovy/current/lib/">
      <include name="*.jar"/>
    </fileset>
  </path>

  <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy">
    <classpath refid="groovy.classpath"/>
  </taskdef>

  <target name="update.build.number">
    <xmltask source="AndroidManifest.xml">
      <copy path="manifest/@android:versionCode" property="buildNum"/>
    </xmltask>
    <groovy>
      buildNum = Integer.valueOf(properties["buildNum"])
      properties["buildNum"] = buildNum + 1
    </groovy>
    <xmltask source="AndroidManifest.xml" dest="AndroidManifest.xml">
      <replace path="manifest/@android:versionCode"
        withText="${buildNum}"/>
    </xmltask>
    <antcall target="commit.and.tag.build">
      <param name="buildNum" value="${buildNum}"/>
    </antcall>
  </target>

  <target name="commit.and.tag.build">
    <exec executable="git">
      <arg value="commit"/>
      <arg value="-a"/>
      <arg value="-m"/>
      <arg value="Build Number ${buildNum}"/>
    </exec>
    <exec executable="git">
      <arg value="tag"/>
      <arg value="b${buildNum}"/>
    </exec>
  </target>

a "bit" better workaround answer you can find here... https://stackoverflow.com/a/8156809/304270

微小 c# 工具, 它将在每次新建新建筑之前执行, 并增加列表文件中的适当值 。





相关问题
In Eclipse, why doesn t "Show In" appear for non-Java files?

If I have a *java file open, I can right click on the source, scroll down to "Show In (Alt-Shift-W)", and select Navigator. If I have an *xml, *jsp, or pretty much anything besides a Java source ...

Eclipse: Hover broken in debug perspective

Since upgrading Eclipse (Galileo build 20090920-1017), hover in debug no longer displays a variable s value. Instead, hover behaves as if I were in normal Java perspective: alt text http://...

Eclipse smart quotes - like in Textmate

Happy Friday — Does anyone know if eclipse has the notion of smart quotes like Textmate. The way it works is to select some words and quote them by simply hitting the " key? I m a newbie here so be ...

Indentation guide for the eclipse editor

Is there a setting or plugin for eclipse that can show indentation guides in the editor? Something like the Codekana plugin for visual studio (not so fancy is also OK). Important that it works with ...

Adding jar from Eclipse plugin runtime tab

I want to add .jar files for plugin from the Runtime tab of manifest file. When I use the Add... button, I can see only sub-directories of the plugin project. So if I want to add same .jar file to ...

How to copy multiple projects into single folder in eclipse

I have two projects, Project1 and Project2. Now i want to copy this projects into eclipse workspace but i want these projects to be in a single folder like below. Eclipse Workspace -> Project -> ...

Java: Finding out what is using all the memory

I have a java application that runs out of memory, but I have no idea which code is allocating the memory. Is there an application with which I can check this? I use Eclipse.