7

この質問は主観的なものかもしれませんが、Stackoverflow が質問するのに最適な場所だと思います。

問題のドメインは「高度な Android プログラミング」です。単一の Android プロジェクトをセットアップする方法、ライブラリ プロジェクトを使用する方法、または ANT を使用して通常のプロジェクトをビルドする方法についての情報は必要ありません。

Jenkins / Ant / Proguard によってビルドされた通常の Android プロジェクト (IDE は IntelliJ を選択しますが、それは重要ではありません) を実行中のアプリと仮定します。このビルドの結果は、Play ストアに配置する最終的な APK です。

このアプリが無料版と有料版として必要だと想像してみてください。今のところ問題ありません。すべての共有コードをライブラリ プロジェクトに入れ、2 つの子プロジェクトを作成します。

ここで、Amazon もターゲットにしたいと考えて、プレス リリース バージョンなどを作成したいとします。そのため、コードは分岐し始め、まだ多くのものを共有していますが、特定の部分はターゲットとする市場などに固有のものです。

C# には、「IF PLAY_STORE ...」のような「条件付きコンパイル ステートメント」があります。Java / Android に似たものはありますか。また、それらは ANT とビルド プロセスで適切に機能しますか。

しかし、私は条件付きコンパイルに限定されていません。「市場ごとに 1 つのプロジェクト」というアプローチは別のものです。これらのさまざまな「ビルド構成」を持続可能な方法でどのように管理しているかを把握しようとしています。つまり、2 つのフレーバー (無料と有料) で 3 つの市場をターゲットにして、15 のプロジェクトで機能します。私がほのめかしていることを理解していただければ幸いです。コードはすべてのアプリで非常によく似ていますが、上記の例では 90 個の異なる APK があります。これらの数を使用すると、「このビルドにのみ必要なソース コードに手動でコメントする」などの作業はもはや必要ありません。

したがって、これらの問題ドメインに関するヒント、ツール、検索ワード、経験 (たとえば、MAVEN、それは私を助けてくれるでしょうか、または build.xml を生成する ANT + スクリプトの方が良いでしょうか)。もう 1 つの例として、すべてのターゲット市場向けの「実際の」Android プロジェクトがある場合、これにより、ほとんど何でも行うことができます。もちろん、マイナス面として、最下位レベルに新しいページを追加する場合 (たとえば、インプリント ページ)、ページを追加するために 90 Manifest.xml に移動する必要があります...

これについて助けてくれてありがとう、クリス

PS: このトピックに関して見つけたいくつかのリンクを下部に追加します。回答がないときに誰かがこの質問に出くわした場合、これは「最初にこれを読む」セクションになる可能性があります。

http://www.asyncdev.net/2011/02/android-dev-prod-builds/

http://www.slf4j.org/ (「JAR を入れて IMPL を提供する」方法に関連)

(SLF4J は、別の JAR を追加するだけで、依存関係を減らし、展開中に構成を提供するための優れたアプローチです。このようなものを使用することは、独自のプロジェクトではやり過ぎかもしれませんが、1 つの方法です。たとえば、ライセンス書き込みインターフェイスとSLF4J のようなコードを少し追加し、ビルド中に Lib フォルダーに PressRelease.jar または Productive.jar を提供して、アプリの動作を変更します...)

4

2 に答える 2

1

複雑なプロジェクトには常に複数の適切なソリューションがあるため、この質問は意見に基づくものです。

前文

Linderdaum Puzzle HDを展開するために使用したいくつかの原則を説明しようと思います。ゲームには有料版と無料版があり、コードだけでなく UI やゲーム コンテンツも異なります。

このゲームは、2 つのプラットフォームと複数のストア (すべて異なる承認メカニズムを使用) 向けにリリースされています。

アンドロイド:

  1. Google Play (2: 無料+有料)
  2. AndroidPit (2: 無料+有料)
  3. SlideMe(1:無料)
  4. サムスンストア(1:無料)

ブラックベリー OS 10

  1. BlackBerry World (1:有料)

ウィンドウズ

  1. このバージョンは、PC での開発とテストに使用します (1: 有料)。

これにより、8 つの異なる配布パッケージが得られます。

環境

私たちの生産ツールチェーンは と に基づいていgitますTeamCity。特別なツール (Maven、Gradle など) は使用されません。

解決

ワークフローの終点は TeamCity プロジェクト ページで、8 つの配布パッケージに対応するすべてのビルド構成と、デバッグ用のいくつかの追加ビルド (つまり、追加のチェックとログを含む) があります。任意のパッケージは、ワンクリックでどこからでも Web インターフェースを介して構築できます。

すべてのパッケージにはgit(一部のパッケージで共有されている) ブランチ名がありTeamCity、どこからソースをプルするかがわかります。現在、次のブランチがあります。

  remotes/origin/master
  remotes/origin/release300-blackberry
  remotes/origin/release300-master
  remotes/origin/release300-paid_apps
  remotes/origin/release300-paid_apps_androidpit

ここでrelease300は、ゲームのバージョンを表します。これらのアーカイブ ブランチが多数あります。これらは開発ブランチや機能ブランチではありません。特定のゲーム パッケージの変更を保持するためだけに使用されていました。paid_appsつまり、より多くのゲーム コンテンツがあり、AndroidPitpaid_apps_androidpitライセンス ライブラリが含まれています。

開発は、masterマスターにマージされたフィーチャー ブランチ内およびフィーチャー ブランチ内で行われます。次に、マージ プロセスが実行されます。マージの方向は次のとおりです (これらの方向のみ):

master -> release300-master -> release300-paid_apps -> release300-paid_apps_androidpit
        \
         \-> release300-blackberry

つまり、release300-paid_apps_androidpit基本的には と同じ内容ですがrelease300-paid_apps、いくつかの新機能 (ライセンス ライブラリなど) が追加されています。またrelease300-blackberry、画面の縦横比が 1:1 という珍しいデバイスをターゲットにする必要があり、特別なデザインの UI を備えているため、完全に分離されています。したがって、これらの 5 つのブランチは、8 つのディストリビューション パックを構築するために使用されます。

これらのリリース ブランチからの変更を master にマージすることはありません。バグ修正は同じ方向に伝播されます。

すべてのパッケージには独自のスクリプト ファイルがあります。つまり、Google Play 用の無料アプリケーションのビルドは、BuildAndroid.pyブランチで Python スクリプトを呼び出すのと同じくらい簡単release300-masterです。

他のすべてのパッケージにも同じ考え方が適用されます。単一行の TeamCity コマンドライン ビルド ランナーのみを使用します。

于 2013-08-13T16:53:37.093 に答える
0

ant制御できない理由で立ち往生している場合は、フィルターとトークンの使用を検討してください。.java各タイプの構成またはビジネス ロジックに対応するテンプレートからファイルを生成できます。公式の例は次のとおりです。

<copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
  <filterset begintoken="%" endtoken="*">
    <filter token="DATE" value="${TODAY}"/>
  </filterset>
</copy>

@DATE*これにより、 のテキストが${build.dir}/version.txt現在の日付に置き換えられ、結果が にコピーされ${dist.dir}/version.txtます。これは、いくつかのスマートな分岐とともに、半分まともなプリプロセッサを提供できます。欠点は、もちろん、本当に遅いことです (ant一般的には、これはなおさらです)。

Gradleにはこの機能が組み込まれているため(製品フレーバー)、Gradleをお勧めできるようにしたいのですが、残念ながら、活発に開発されている間は深刻な選択肢ではありません. 数か月後かもしれませんが、今ではありません。

于 2013-08-15T19:07:52.227 に答える