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