SubversionおよびGitリビジョンからのAndroidアプリケーションバージョンの生成

ユーザーが問題に遭遇した場合、使用しているソフトウェアのバージョンを常に正確に知りたいと思うでしょう。 バージョン管理システムとソフトウェアバージョンの自動番号付けを使用する場合、そのような情報をユーザーに提供できます。必要に応じて、単に行を指示するように依頼できます。



アンドロイドプロジェクトの番号付け方法については、 ここここで説明します 。 両方の記事は、「svn info」を使用してプロジェクトのバージョンを取得する例を検討しました。最初の記事では、著者はSvnAntの欠如について不満を述べ、2番目の記事では、著者は「svn info」の使用に関連する問題に気づきました。 問題は、「svn info」が作業コピーの改訂に関する不正確な情報を提供することです。



以下は、この問題をかなり簡単な方法で解決する例です。

UPD:git用のスクリプトを追加しました。



問題



一番下の行は、「svn info」コマンドが、指定されたディレクトリの要素の最後のコミットリビジョンを発行することです。

例:

$ svn info Revision: 32
      
      





この場合:

 $ svn info ./src/ru/bsrgin/myproject/MyActivity.java Revision: 45 $ svn -r 32 -v log Changed paths: D /some-folder $ svn -r 45 -v log Changed paths: M /src/ru/bsrgin/myproject/MyActivity.java
      
      





上記の両方の記事の著者は、ユーティリティの出力を通常のプロパティファイルとして解釈します。

つまり Revision:32タイプの行が存在することにより、Build Andスクリプトのパラメーターとしてデータを解釈できます。 したがって、「svn -R info」を実行して出力ファイルで最新のリビジョンを探すと、タスクはさらに複雑になります。



リクエスト「svn -r HEAD info」は、作業コピーではなくサーバー上のリビジョン番号を示しますが、これも間違っています。 主な条件が満たされていません-現在のソフトウェアバージョンの生成。 引数BASE、COMMITTED、およびPREVも質問への回答を提供しません-どのバージョンのファイルからプロジェクトが構築されますか?



解決策



この記事で説明されているソフトウェアバージョンを取得する方法を放棄する準備はすでに整っていましたが、やがて別のユーティリティ「svnversion」を思い出しました。 このユーティリティによって出力されるデータの形式は次のとおりです。

 4123:4168 mixed revision working copy 4168M modified working copy 4123S switched working copy 4123P partial working copy, from a sparse checkout 4123:4168MS mixed revision, modified, switched working copy
      
      





つまり 作業コピーで「svnversion」を実行すると、次の結果が表示されます。

 $ svnversion 32:46
      
      





また、ファイルを変更する場合は、次のようにします。

 $ svnversion 32:46M
      
      





実際、ユーティリティはアプリケーションのバージョンに含めたい有用な情報を提供しますが、データ出力形式は適切ではありません。 Build Antスクリプトの構文を少し処理する必要がありました...



以下に、作業バージョンのSubversionまたはGitをプロジェクトに追加する方法の手順を示します。



アクションのシーケンス



プロジェクトのルートにsvn-revision.build.xmlファイルを作成します。 以下の内容を貼り付けます:

 <project default="svn-revision"> <target name="svn-revision"> <!--  `svnversion -n`  ,      .  : 4123:4168 mixed revision working copy 4168M modified working copy 4123S switched working copy 4123P partial working copy, from a sparse checkout 4123:4168MS mixed revision, modified, switched working copy --> <exec executable="svnversion" output="svnversion.output"> <arg line="-n"/> </exec> <loadresource property="svnversion.Revision"> <file file="svnversion.output"/> </loadresource> <echo>Revision: ${svnversion.Revision}</echo> <!--     Manifest       VersionName --> <replaceregexp file="AndroidManifest.xml" match='android:versionName="([^".]+\.[^".]+)(\.[^"]*)?"' replace='android:versionName="\1.${svnversion.Revision}"' /> <!--    --> <delete file="svnversion.output"/> </target> </project>
      
      





AndroidManifest.xmlsvn-revision.build.xmlと同じディレクトリにあると理解されています。 そうでない場合は、22行目を変更します。 また、アプリケーションのバージョンが1.2または1.2.3のように見えることも理解されています。 そうでない場合は、23行目を変更します。



次に、 .externalToolBuilders / AddSvnRevisionToVersion.launchファイルを作成し、次の行を追加します。

 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType"> <booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/> <booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/> <booleanAttribute key="org.eclipse.debug.core.ATTR_REFRESH_RECURSIVE" value="false"/> <stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${project}"/> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> <listEntry value="${project_loc}/svn-revision.build.xml"/> </listAttribute> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listEntry value="1"/> </listAttribute> <booleanAttribute key="org.eclipse.debug.core.capture_output" value="false"/> <booleanAttribute key="org.eclipse.debug.ui.ATTR_CONSOLE_OUTPUT_ON" value="false"/> <booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/> <stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/> <booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="ANDROID-APP"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${project_loc}/svn-revision.build.xml"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,"/> <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/> </launchConfiguration>
      
      





ANDROID-APPの代わりに、プロジェクトの名前を挿入します( .projectファイルの<name>タグの値を参照)。 次に、 .projectファイルを変更します- <buildCommand>タグの後に、以下のスクリプト追加します。

 <buildCommand> <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> <triggers>full,incremental,</triggers> <arguments> <dictionary> <key>LaunchConfigHandle</key> <value><project>/.externalToolBuilders/AddSvnRevisionToVersion.launch</value> </dictionary> </arguments> </buildCommand>
      
      





その結果、最初のタスクはAndroidManifest.xmlファイルを変更するプロセスを追加します。 ファイルはビルドが起動されるたびに更新され、プロセスはリリースパッケージがビルドされるたびに起動されます。 リリースパッケージのアセンブリが自動化されているか、Eclipseを使用しない場合は、コレクターを設定してsvn-revision.build.xmlを実行する必要があります。



Git



SCV gitの使用時に同様の結果を得るには、 svn-revision.build.xmlファイルを以下のgit-revision.build.xmlに置き換えます。

 <project default="git-revision"> <target name="git-revision"> <!--  'git describe'  ,      . . http://habrahabr.ru/blogs/android_development/132017/#comment_4385225 --> <exec executable="git" output="gitdescribe.output"> <arg line="describe --always --dirty=+ --abbrev=5"/> </exec> <loadresource property="git.Revision"> <file file="gitdescribe.output"/> </loadresource> <echo>Revision: ${git.Revision}</echo> <!--     Manifest       VersionName --> <replaceregexp file="AndroidManifest.xml" match='android:versionName="([^".]+\.[^".]+)(\.[^"]*)?"' replace='android:versionName="\1.${git.Revision}"' /> <!--    --> <delete file="gitdescribe.output"/> </target> </project>
      
      





したがって、 AddSvnRevisionToVersion.launchおよび.projectファイルを修正することを忘れないでください。



プログラムでversionNameを取得する



これで、ソフトウェアバージョンを取得するために、次の方法を使用できます。

 public static getApplicationVersion() { try { return getInstance().getApplicationContext().getPackageManager() .getPackageInfo(getPackageName(), 0).versionName; } catch (NameNotFoundException e) { return "App not installed!"; } }
      
      





その結果、私のプロジェクトでは、行1.0.32を取得しました:46M (subversion)および1.0.58c57 + (git)。



All Articles