Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在生成期间自动修改清单中的versionName?_Android_Eclipse_Adt - Fatal编程技术网

Android 如何在生成期间自动修改清单中的versionName?

Android 如何在生成期间自动修改清单中的versionName?,android,eclipse,adt,Android,Eclipse,Adt,到目前为止,我一直专注于应用程序的编程,很少关注如何使构建过程更智能。因此,我几乎一直在手工操作(“愚蠢的方式”),包括手动更新AndroidManifest.xml中的android:versionCode和android:versionName 我现在想自动(即在构建或导出时): 从git获取包含构建和版本代码的最新标记/分支 解析它们,以便将它们分配到AndroidManifest.xml中的相应字段 相应地修改AndroidManifest.xml 继续正常的构建过程(Eclipse+A

到目前为止,我一直专注于应用程序的编程,很少关注如何使构建过程更智能。因此,我几乎一直在手工操作(“愚蠢的方式”),包括手动更新AndroidManifest.xml中的
android:versionCode
android:versionName

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

  • git
    获取包含构建和版本代码的最新标记/分支
  • 解析它们,以便将它们分配到AndroidManifest.xml中的相应字段
  • 相应地修改AndroidManifest.xml
  • 继续正常的构建过程(Eclipse+ADT,没有任何Ant),就像我手工完成了1-2-3一样
  • 我发现了一些关于“步骤”的线索,包括建筑商和建筑商,但我不知道在哪里可以找到这些线索,也不知道从哪里开始

    关于我在哪里可以找到更多关于这个主题的信息,有什么建议吗?(最好是一个循序渐进的教程)

    更新1:我发现我建议:

  • 右键单击项目,
    Properties>Builders
  • 添加指向项目的Ant构建文件的构建器
  • 命令在Java生成器之前调用该生成器
  • 很好,但是项目的构建文件在哪里?我在哪里找到它

    更新2:显然,这是可能的。但我不确定这是我想要的。预构建步骤必须始终包含一个


    更新3:正在构建Ant文件,这是正确的方法吗?

    我实现这一点的方法:构建>执行shell(我们需要一些php代码来从数据库接收一些信息),字符串替换在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";
        }
    ?>
    
    #/usr/bin/php
    
    <代码> >你应该考虑使用。一旦你的项目建设干净,使用插件自动增加你的版本号

    用Maven Android编写一个构建脚本并不能被描述为简单——但是回报是值得的,你应该考虑这条途径。< /P> 此外,这可能会派上用场(我在自己的构建中使用了这里描述的技术的变体)

    编辑(2014年):


    考虑迁移到Android Studio并使用Gradle。请参阅:

    设置预构建步骤的方法是正确的,但是ant构建文件是您自己从头开始创建的。Eclipse有一些外部使用的ant脚本,用于处理自动编译、打包和其他操作,但是您需要创建一个单独的ant脚本来执行这些额外的步骤

    所以,为了完成这项工作,您必须学习一些关于ant脚本的知识。您找到的一些链接为您提供了创建简单ant文件的基本思路。除此之外,您可能还需要使用以下ant任务:

    -执行获取版本信息的git命令时需要使用此命令。它有一个名为resultProperty的参数,可用于将命令的输出存储到ant可以访问的属性中。(或者,您可以将命令输出到一个文件,ant可以访问该文件。)

    -您将需要使用exec返回的值替换您在AndroidManifest.xml中放置的标记(可能是@VERSIONCODE@和@VERSIONNAME@),这些标记最终应该放在值所在的位置


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

    以下是我用来动态地将versionCode和versionName分配给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>
    
    启用应用程序的自动签名


    您还应该阅读以下内容:

    nice。。。我也在期待答案。如果使用Maven,请查看manifestVersionCode和manifestVersionName。+1了解您的答案和链接,但我倾向于远离那些没有官方支持的工具,因为主流软件鼓励谷歌认可并推给美国开发者。我会考虑Maven Android,如果我找不到其他方法来保持我当前的Eclipse + ADT设置。谢谢,我使用Maven和詹金斯来自动化我的Android应用程序的构建,这篇文章指出了我在自动版本控制的正确方向上是受欢迎的。我的答案可能在2012年有效。但这是2014,您可能需要考虑迁移到Android Studio和Gradle。像版本增量这样的东西烘焙到Gradle中,非常容易使用。谢谢+1。我现在需要找些时间来测试这个解决方案。。。我会接受当我得到它的工作。谢谢+1。我现在需要找些时间来测试这个解决方案。。。我会接受当我得到它的工作。谢谢你的代码。这是一个非常好的答案,我希望我能多投几次票。我猜你已经展示了PHP示例,它不是用来构建android应用程序的。你使用的工具如果能完成任务应该无关紧要。在许多其他问题中,你的解决方案是可能的。向上投票。
    key.store=keystore_file
    key.store.password=some_password
    key.alias=some_alias
    key.alias.password=some_other_password