移植および前処理psto

しかし、親愛なる皆さん、どれだけ多くの人が、1組のソースから2つの独立したバージョンのアプリケーションを、精神的な強さの不必要なストレスなしに組み立てるかを考える必要はありませんでした。 手を挙げたすべての人に、私はこう言います。ああ、どうすればこの問題について頭を痛めなければならないのでしょう。 さて、または以下のレシピを使用できます。



長くて退屈で気まぐれな紹介


アプリケーションのバナーやクリックを使用したこれらのすべての動きがまだ完全に最新ではなく、クリーンな人に加わろうとしている場合は、問題の性質について簡単に説明します。 Googleの非ヒューマノイド(Appleの非ヒューマノイドをお許しください)、最も直接的なEclipseをIDEとして採用しただけでなく、慎重に回避しました(そして今日まで無視します!)ソースおよびリソースの前処理としてのプロジェクトアセンブリのこのような重要な段階。 そして彼は必要です! そして、OOPの愛好家は私のように苦労して私を呪いますが、インポートおよびパッケージディレクティブのデッドコードセクションを作成するのは非現実的です-ここで保存できるのはプリプロセッサだけです。 深い悲しみに、3つ目はすべてをパッケージに結び付けました。 その結果、不快な状況が発生します。マニフェスト内のパッケージの名前を変更する場合は、すべてのソースコードのどこでも変更する必要があります。 また、クラスRを再生成する必要もあります。何らかの理由で、何もせずにはできませんでした。 パッケージの名前を変更しないと、アプリケーションは以前のアプリケーションをデバイス内の同じアセンブリ名に完全に置き換えます。これは非常に重大な迷惑です-有料版の幸運な所有者は、うっかり無料版に「アップグレード」する可能性があります。



こっち



それは魂の叫びでした、そしてこの記事では、最も予算的な方法で特定の問題を解決しようとします:アプリケーションオプションを切り替える非常に簡単な方法を取得し、プロジェクト構造に大きな変更を加えることなく、すべてを「そのまま」開発環境に残します。 同時に、プロジェクト資料には最小限の冗長性が必要です。 一般的に、古典が言ったように、「私たちにはすべてがあり、それのために何もありません。」



NetBeans Mobility PackでMIDPゲームを開発している人は、1つのプロジェクトで複数の構成を操作するための最高のツールを覚えている必要があります。 MPの1つのコンポーネントは、 Apache Antオートメーションツールの一部であるアンテナプリプロセッサです。 ここではAntについては説明しません。私は一般的にAntを初めて使用するので、この巨大な自動化ツールに正確な定義を与えることさえできません。 私はアンテナを網羅的に説明するつもりはありません-私たちの問題を解決するために知っておく必要があるすべてを以下に示します。残りはこれらのアプリケーションのウェブサイトで見つけることができます。



一般に、アンテナはモバイルアプリケーションプロジェクトで動作するように作成されました。 つまり、プリプロセッサに加えて、私たちが必要としないものがかなりたくさんあります。 あなたはそれらに注意を払っていない、主なことはそれから私たちが必要なことをするということです。



始めましょう。


以下で説明するすべての一般原則は次のとおりです。構成したプリプロセッサは、アプリケーションのソースコードを変更し、対応するディレクティブで示されている場所にコメントを配置し、値を置き換えます。 つまり、構成ごとに、個別のコードを作成できます。 また、AndroidManifest.xmlの一部の値が変更され、プロジェクト内のxmlファイルの条件付き処理の可能性が暗示されています。 すべてのアクションはAntタスクによって実行されるため、Eclipseを使用せずにプロジェクトをコンパイルできるbuild.xml Antスクリプトにアクションを組み込むことができます。 しかし、これはあなた次第です。



1. ここから、「Antの現在のリリース」セクションからAnt ダウンロードし、コンピューターにインストールします

2. ここからアンテナダウンロードします 。 必要なものは、「antenna-bin-1.2.1-beta.jar」のようなものです。 とりあえず 、このファイルの名前をantenna.jarに変更してください 。その使用方法を以下に示します。

3. ここから XmlTask​​( xmltask.jar )をダウンロードし、今のところは脇に置きます。



次に、プロジェクトを準備する必要があります。



4.最も一般的なプロジェクトを作成します。 ru.habr.helloなどのアセンブリを呼び出します。プロジェクトはHelloPortingで 、ActivityをMainと呼びます。







次の構造を持つプロジェクトができました。







次に、プロジェクトを前処理に適合させます。



5.プロジェクトフォルダーにtoolsフォルダーを作成し、以前にロードしたantenna.jarxmltask.jarをそこに配置します。

6.プロジェクトフォルダーで、次の内容のpreprocess.xmlファイルを作成します。



<?xml version="1.0" encoding="Utf-8"?> <project name="Preprocess source" default="lite" basedir="."> <property file="preprocess.properties" /> <property name="wtk.home" value="." /> <property name="source.path" value="src" /> <taskdef resource="antenna.properties" classpath="tools\antenna.jar" /> <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" classpath="tools\xmltask.jar" /> <target name="full"> <echo>Preprocessing FULL VERSION</echo> <wtkpreprocess verbose="false" version="2" srcdir="${source.path}" destdir="${source.path}" symbols="distr=full" /> <xmltask source="AndroidManifest.xml" dest="AndroidManifest.xml"> <attr path="manifest" attr="package" value="${androidmanifest.package.full}" /> <attr path="manifest/application" attr="android:label" value="${androidmanifest.application.label.full}" /> <attr path="manifest/application/activity" attr="android:label" value="${androidmanifest.application.label.full}" /> </xmltask> </target> <target name="lite"> <echo>Preprocessing LITE VERSION</echo> <wtkpreprocess verbose="false" version="2" srcdir="${source.path}" destdir="${source.path}" symbols="distr=lite" /> <xmltask source="AndroidManifest.xml" dest="AndroidManifest.xml"> <attr path="manifest" attr="package" value="${androidmanifest.package.lite}" /> <attr path="manifest/application" attr="android:label" value="${androidmanifest.application.label.lite}" /> <attr path="manifest/application/activity" attr="android:label" value="${androidmanifest.application.label.lite}" /> </xmltask> </target> </project>
      
      







7. preprocess.xmlの横に、次の内容のpreprocess.propertiesファイルを作成します。



# Full version properties

androidmanifest.package.full=ru.habr.hello.full

androidmanifest.application.label.full=@string/app_name



# Lite version properties

androidmanifest.package.lite=ru.habr.hello.lite

androidmanifest.application.label.lite=@string/app_name_lite









8. メインクラスは次のようになります。



 package ru.habr.hello; import android.app.Activity; import android.os.Bundle; import android.util.Log; //#expand import ru.habr.hello.%distr%.*; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //#if distr == "lite" Log.d("app", "Lite version"); //#elif distr == "full" Log.d("app", "Full version"); //#else Log.d("app", "Whatelse version"); //#endif } }
      
      







9.新しいアセンブリru.habr.hello.fullを作成し、その中に次の内容のHelloPorting.javaクラスを作成します。



 package ru.habr.hello.full; import ru.habr.hello.*; public class HelloPorting extends Main { }
      
      







10.新しいアセンブリru.habr.hello.liteを作成し、その中に次の内容のクラスHelloPorting.javaを作成します。



 package ru.habr.hello.lite; import ru.habr.hello.*; public class HelloPorting extends Main { }
      
      







11. AndroidManifest.xmlmanifest / application / activityノードで、 android:name属性を「 .HelloPorting 」に変更します







12. Eclipseのres \ valuesでstrings.xmlファイルを開き、 app_name_liteという名前のHelloPorting LITE行を追加します。



プロジェクトの準備が完了し、すべてがどのように機能するかを確認できます。



プロジェクトフォルダーで、コマンドラインから次のコマンドを実行します。



 ant -f preprocess.xml lite
      
      





または



 ant -f preprocess.xml full
      
      





その後、アプリケーションをコンパイルして実行します。 すべてが正しければ、アプリセクションのLogCatに、構築されたプロジェクト構成を通知する行が表示されます。



次は何ですか。


アクションの結果、「双頭」プロジェクトを取得しました。その構成を構築する準備は数秒で完了します。プリプロセッサがソーステキストを調べてそれらをわずかに変更するのとまったく同じくらいです。 各ファイルは単一のコピーに保存されるため、ソースファイルの異なるバージョンの相互の対応を制御する必要はありません。 プリプロセッサディレクティブを使用して、機能の違いのほとんどをソースコードで直接記述できます。



ただし、いくつかの新機能を検討する必要があります。

ここで、resフォルダーおよびクラスRのリソースを使用する各クラスで、すべてのインポートディレクティブの後に行を追加する必要があります。



 //#expand import ru.habr.hello.%distr%.*;
      
      





前処理の過程で、特定の構成に関連するインポート行をそれ自体の下に置き換えます。 また、マクロを削除するときに考慮する必要があるもの。

ru.habr.hello.fullおよびru.habr.hello.liteアセンブリHelloPorting.javaクラスは、システムへの "トリック"であり、 ru.habr.helloアセンブリからMainクラスを継承するため、可能な限り空のままにしておく必要があります。それらを変更と同期させる必要がありました。 ただし、この構成に固有のコードを実装する場合、意図した目的を果たすことができます。 たとえば、 Mainクラスには空または抽象のcreateScreenメソッドがあります。このメソッドはアセンブリru.habr.hello.liteの後継でバナー付きの画面を実装でき、 ru.habr.hello.fullでは単なる画面です。



おわりに


当然、これは理想的なソリューションではありません。 そして、理想にさえ近づきません。 数え切れないほどのさまざまなJavaツールを探し回って、誰かが座ってEclipseやNetBeansのプラグインを作成することを夢見ていた...夢は有害ではありませんが、もしも..



ご清聴ありがとうございました。 提案、追加、および批判を歓迎します(不健康ですら)。



All Articles