2012-09-14 66 views
25

到目前为止,我一直专注于我的应用程序的编程,并且很少关注如何使构建过程变得更加智能。因此,我一直在做非常手动的操作(“愚蠢的方式”),包括在AndroidManifest.xml中手动更新android:versionCodeandroid:versionName如何在构建过程中自动修改Manifest中的versionName?

我现在想自动(即在构建或在出口):

  1. git取含建设和版本代码的最新标签/支。
  2. 解析它们,以便我可以将它们分配给AndroidManifest.xml中的相应字段。
  3. 相应地修改AndroidManifest.xml。
  4. 继续进行正常的构建过程(Eclipse的ADT +,没有任何蚂蚁),因为如果我这样做1-2-3的手...

我发现关于“pre-build一步”几个线索,建设者和build.xml,但我不知道在哪里可以找到那些以及从哪里开始。

任何提示或指示我在哪里可以找到有关该主题的更多信息? (一步一步的教程将是理想的)

更新1:我发现this thread在暗示我:

  1. 在项目上单击右键,Properties > Builders
  2. 添加建设者指向项目的Ant构建文件。
  3. 令,建设者的Java建设者

精细之前被调用,但其中是该项目的Ant构建文件?我在哪里找到它?

更新2:显然,有可能export the entire project into an Ant file。但我不确定那是我想要的。必须预先构建步骤始终包含一个Ant build file

更新3:正在建立一个Ant文件,only for the pre-build step,正确的做法?

+4

不错...我也期待答案.. – prakash

+0

易一块,看看manifestVersionCode和manifestVersionName [这里](HTTP:// Maven的Android的插件-m2site.googlecode.com/svn/manifest-update-mojo。HTML)。 – yorkw

回答

18

下面是我使用动态分配版本代码和版本名称到AndroidManifest.xml。它仅在使用ant构建时才有效,因此您必须先安装它。然后转到命令行中的项目目录并执行“android update project -p。”,它将创建用于使用ant构建的必要文件,如local.properties和build.xml。

然后打开的build.xml并将此内:

<target name="-pre-build" depends="-custom-git-version,-custom-manifest-version"> 
    </target> 

    <!-- Packages the application. --> 
    <target name="-post-build"> 
    <antcall target="-custom-restore-manifest"/> 

    <property name="suffix" value="${git.commits}-${git.version}.apk" /> 

    <exec executable="sed" inputstring="${out.final.file}" outputproperty="out.final.renamedfile"> 
     <arg value="s/\.apk/-${suffix}/" /> 
    </exec> 

    <copy file="${out.final.file}" tofile="${out.final.renamedfile}" /> 
    <echo>Final file copied to: ${out.final.renamedfile}</echo> 
    </target> 

    <!-- Custom targets --> 
    <target name="-custom-git-version"> 
    <exec executable="sh" outputproperty="git.commits"> 
     <arg value="-c" /> 
     <arg value="git log --pretty=format:'' | wc -l" /> 
    </exec> 
    <echo>git.commits: ${git.commits}</echo> 
    <exec executable="git" outputproperty="git.version"> 
     <arg value="describe" /> 
     <arg value="--tags" /> 
     <arg value="--long" /> 
    </exec> 
    <echo>git.version: ${git.version}</echo> 
    </target> 

    <target name="-custom-manifest-version"> 
    <echo>Creating backup of AndroidManifest.xml</echo> 
    <copy file="AndroidManifest.xml" tofile="AndroidManifest.xml.antbak" preservelastmodified="true" /> 

    <replaceregexp 
     file="AndroidManifest.xml" 
     match='android:versionCode="(\d+)"' 
     replace='android:versionCode="${git.commits}"' /> 

    <replaceregexp 
     file="AndroidManifest.xml" 
    match='android:versionName="(\d+\.\d+)\.\d+"' 
    replace='android:versionName="\1.${git.commits}"' /> 
    </target> 

    <target name="-custom-restore-manifest"> 
    <echo>Restoring backup of AndroidManifest.xml</echo> 
    <move file="AndroidManifest.xml.antbak" 
      tofile="AndroidManifest.xml" 
      preservelastmodified="true" 
      overwrite="true" /> 
    </target> 

的这个输出是不正是你想要的,但它是一个开始 - 随意修改:)结果像“yourapp - APK

使用此你会与执行来构建应用程序” 蚂蚁干净调试“或‘蚂蚁干净发布’,这取决于你想要什么你也可以创造。” 个ant.properties“文件与此内容:

key.store=keystore_file 
key.store.password=some_password 
key.alias=some_alias 
key.alias.password=some_other_password 

,使您的应用程序的自动签名。

你也应该阅读:如果使用Maven http://developer.android.com/tools/building/building-cmdline.html

+0

谢谢+1。我现在需要找点时间来测试这个解决方案......我会在接受它的时候接受它。 –

+0

感谢您的代码。它也适用于我的情况,并对我的目的进行了一些小修改。 – Aki

+0

这是一个很好的答案,我希望我可以多花点时间 – yano

1

我设法实现这一目标的途径:建立>执行shell(我们需要一些PHP代码,以接收来自DB一些信息)和字符串替换过程发生在PHP中:

#!/usr/bin/php 
<?php 
    $filename = $WORKSPACE."/src/com/me/myapp/MyActivity.java"; 
    $file = @file_get_contents($filename); 
    if($file) { 
     $repl = preg_replace("OriginalString", "NewString", $file); 
     file_put_contents($filename, $repl); 
     echo "\n\nReplaced some stuff in $filename"; 
    } 
?> 
+2

不知道为什么3 downvotes ... – Ferdau

+0

我的猜测是,你已经显示了PHP的例子,这是不是用于构建android应用程序 –

+2

如果它完成工作,你使用的工具应该没关系。您的解决方案可能是其他解决方案之一。 Upvoted。 –

2

你应该考虑建设maven-android。一旦你的项目建设干净,使用version-update插件来自动增加你的版本号。

使用maven-android编写构建脚本不能被描述为简单 - 但收益是值得的,你应该考虑这个方法。

此外,这tutorial可能会派上用场(我在这里使用说明我自己的技术的一个变种版本)

EDIT(2014):

考虑迁移到Android Studio和使用摇篮。请参阅:How to autoincrement versionCode in Android Gradle

+0

+1为您的答案和链接,但我倾向于远离那些官方支持的工具,因为主流鼓励Google支持我们的开发人员。我会考虑maven-android,如果我找不到其他方式来保持我当前的Eclipse + ADT设置。 –

+0

谢谢,我正在使用Maven和Jenkins自动化我的Android应用程序版本,这篇文章指出我正确的方向进行自动版本化 – dleerob

+0

不客气。我的答案可能在2012年有效。但这是2014年,你可能想考虑迁移到Android Studio和Gradle。东西像版本增量烘焙到Gradle和真正易于使用。 –

3

您正在设置预构建步骤的正确轨道,但ant构建文件是您将从头开始创建的。 Eclipse有一些外部使用的ant脚本来处理自动化的编译,打包和其他东西,但是你想创建一个单独的脚本来完成你想要的额外步骤。

所以,你将不得不学习一些关于ant脚本来完成这件事。您发现的某些链接为您提供了如何创建简单的ant文件的基本概念。要补充的,一些你可能会需要使用ant任务是:

Exec - 你需要这个来执行你的命令的Git,得到您的版本信息。它有一个名为resultProperty的参数,您可以使用它将命令的输出存储到蚂蚁可以访问的属性中。 (或者你可以将命令输出到一个文件,并且ant可以访问该文件)。

ReplaceRegExp - 您将需要这个替换您放置在AndroidManifest.xml中的令牌(也许是@ VERSIONCODE @和@ VERSIONNAME @)值最终应该与exec所返回的值一起去。

您可能还需要在开始时执行一个exec任务,以将您的AndroidManifest.xml文件恢复到原始状态(使用令牌),因此无需手动清理即可重复使用。我会提供更多有关在这些可执行任务中运行所需的git命令的信息,但是我担心我的所有经验都是在Subversion中进行的,所以您必须填补这些空白。

+0

感谢+1。我现在需要找点时间来测试这个解决方案......我会在接受它的时候接受它。 –

相关问题