幸いなことに、Googleは利用可能なIDEに関係なく機能するビルドシステムも提供しています。 これは、Androidアプリケーションで動作するように任意のエディターを構成できることを意味します。 個人的には、NetBeans IDEでJavaコードを作成することを好み、このためにJavaコードを構成する方法について話したいと思います。 nbandroidなどのプラグインがありますが、愛好家によって時折開発されるため、NetBeansの柔軟性を活用し、エディターから直接公式のビルドシステムを使用することは理にかなっています。
新しいプロジェクトを作成する
残念ながら、新しいプロジェクトを作成するときは、Eclipseでできる以上のことを行う必要がありますが、これを行う必要があるのは一度だけです。 プロジェクトの作成は、3つのステップで行われます。
- コマンドラインからのアセンブリ用ファイルの作成。
- IDEでプロジェクトを作成します。
- 追加のコマンドを追加(好みに合わせて)。
アセンブリ用のファイルの作成
まず、コマンドラインから新しいプロジェクトを作成する必要があります。 フォルダー
<Android-SDK>/tools
既に
PATH
あるという前提から進めます。 プロジェクトは次のコマンドで作成されます。
android create project -n < > -t android-< API> -p < > -k < > -a < >
念のため、APIレベルはプロジェクトのコンパイルに使用するものであると説明します。 つまり、プロジェクト全体がAPIレベル10向けに設計されているが、レベルが15以上のデバイスでのみ使用される機能がある場合は、正確に15を設定する必要があります。 ところで、
AndroidManifest.xml
では、この15は表示されず、最低限必要なAPIレベルは10のみです。
プロジェクトがAndroid 4.0.3(これはレベル15)用に作成され、KillerAppと呼ばれるとします。 次に、次を入力する必要があります。
android create project -n KillerApp -t android-15 -p KillerApp -k com.damageinc.killerapp -a MainActivity
このコマンドの後、必要なすべてのファイルがプロジェクトフォルダーに見つかりました。構成ファイル、そして最も重要なのはビルドファイルです。 これでコマンドラインでの作業が完了し、今後は表示されなくなります。 今ではIDEで思い起こさせることが残っています。
IDEでプロジェクトを作成する
- NetBeansで新しいプロジェクトを作成する画面には、 Java Free-Form Projectアイテムが必要です。このアイテムを使用して、IDEでアセンブリファイルを取得する場所を説明します。
- 次に、プロジェクトフォルダを選択する必要があります。 NetBeans自体がビルドファイルを検索し、プロジェクトの名前を判断するため、フォルダーを選択した後、次の画面に安全に移動できます。
- そして、プロジェクトをアセンブルするときにIDEが起動するものを認識できるように、ビルドタスクを正しく登録する必要があります。 debugによりシステム上にビルドします。 少し奇妙に見えますが、この名前の理由は非常に単純です。このタスクは、デバッグ用のアセンブリを作成し、対応する証明書で署名します。 したがって、 リリースタスクがありますが、私たちはまだそれを達成しています。 このケースでプロジェクトを開始するとは、アセンブリとインストールを意味します。つまり、アセンブリ後にインストールタスクを実行することを意味します。 標準システムにはない
launch
タスクもありますが、私たちは自分でそれを行います。 クリーニングは、予想通り、 きれいで、別のテストプロジェクトを通じてAndroidでテストする必要があるため、そのフィールドの内容を安全に消去できます。
- 次の画面では、
R.java
ファイルがこのフォルダーにあるため、gen
フォルダーをソースフォルダーに追加する必要があります。
- 次に、コードヒントをセットアップします。 まず、ソースフォルダーフォルダーの分離をオフにすることが重要です。そうしないと、IDEは
R
ファイルが別のフォルダーにあるため、プログラムのコードで言及すべきではないと判断します。 また、ライブラリのリストに正しいAndroidプラットフォームを追加する必要があります。この場合は<Android-SDK>/platforms/android-15/android.jar
です。
- 最後に、最後のステップである
bin/classes
フォルダーを追加して、コンパイルされたコードを探す場所をIDEが認識できるようにします。 原則として、この手順は不要であり、安全に気にすることはできません。 ただし、完全を期すために、NetBeansで、どのファイルが最近変更され、まだコンパイルされていないかを示すようにします。
追加のコマンドを追加する
実際、最後のステップの後は、これ以上何もできません。 プロジェクトが作成され、すでに正常に進行しています。 しかし、あなたはさらに進んで、多くのアメニティを作ることができます。 プロジェクトフォルダーに
custom_rules.xml
ファイルを配置し、
custom_rules.xml
ます
必要なアリのタスク
<project name="CustomRules"> <target name="release-and-save" depends="release"> <xpath input="AndroidManifest.xml" expression="/manifest/@android:versionName" output="manifest.versionName" default="test"/> <xpath input="AndroidManifest.xml" expression="/manifest/@android:versionCode" output="manifest.versionCode" default="test"/> <copy file="${out.final.file}" tofile="releases/${ant.project.name}-release${manifest.versionCode}-${manifest.versionName}.apk" overwrite="true"/> <copy file="${obfuscate.absolute.dir}/mapping.txt" tofile="releases/mapping-release${manifest.versionCode}.txt" overwrite="true"/> </target> <target name="rebuild-resources" depends="-set-debug-mode, -build-setup, -code-gen" /> <target name="-find-main-activity"> <xpath input="AndroidManifest.xml" expression="/manifest/@package" output="project.app.package" default="test"/> <xpath input="AndroidManifest.xml" expression="/manifest/application/activity[intent-filter/category/@android:name = 'android.intent.category.LAUNCHER'][1]/@android:name" output="project.app.mainactivity" default="test"/> <if> <condition> <matches pattern="\..+|[^\.].*\..*[^\.]" string="${project.app.mainactivity}"/> </condition> <then> <property name="project.app.mainactivity.qualified" value="${project.app.mainactivity}"/> </then> <else> <property name="project.app.mainactivity.qualified" value=".${project.app.mainactivity}"/> </else> </if> <property name="project.app.launcharg" value="-a android.intent.action.MAIN -n ${project.app.package}/${project.app.mainactivity.qualified}"/> </target> <target name="launch" depends="-find-main-activity"> <exec executable="adb"> <arg line="shell am start"/> <arg line="${project.app.launcharg}"/> </exec> </target> </project>
これらの3つのタスクにより、非常に便利なことができます。
rebuild-resources
使用すると、
R
ファイルを生成できます(Eclipseでは、多くの場合、どこかで消えたり、時間どおりに更新されません)。
launch
はアプリケーションを起動する機会を提供し、
release-and-save
は最終バージョンをビルドするときにProGuardメソッドマップとともに適切な名前で別のフォルダーに保存されるようにします。 また、このような行を追加して、ビルド後に通知が再生されるようにします。
<target name="-post-build"> <sound> <success source="C:\Windows\Media\Windows Notify.wav"/> </sound> </target>
もちろん、この特定のサウンドオプションはWindowsにのみ適しています;他のOSでは、別のファイルを選択する必要があります。 今では、 これらのタスクをNetBeansのコンテキストメニューに追加します 。 [ビルドと実行]タブのプロジェクトプロパティで、最後に
launch
タスクを使用して[プロジェクトの実行]アイテムを既に確定しました。 コンテキストメニューのユーザー要素に、実行したばかりの残りのタスクを追加しました。
プロジェクトのコンテキストメニューには、必要なコマンドが多数あります。 エミュレーターを起動するか、スマートフォンを接続し、Runを実行して、すべてがどのように収集して起動するかを確認できます。 最後の仕上げを行い、最終バージョンをビルドするときに難読化を有効にして、
project.properties
ファイルの行のコメントを外します 。
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
また、
ant.properties
には、最終アセンブリに署名するための行を
ant.properties
価値があります 。
key.store = < >
key.alias = < >
これでプロジェクトの準備が整いました。
Androidでのビルドシステムの仕組み
実際、Androidにはすでに2つのビルドシステムがあります。1つはantに基づいており、もう1つはGradleに基づいています。 この特定のケースでは、antシステムを使用します。 Gradleを備えたシステムは、Eclipse- Android Studioに代わる新しいエディターと並行して開発されています。 このビルドシステムは、別の記事に役立つと思います。
antに戻ると、次のファイルがプロジェクトフォルダーにあります。
- ant.properties
- build.xml
- local.properties
- proguard-project.txt
- project.properties
ここで最も重要なファイルは、もちろん
build.xml
です。 実際、これはメインシステムの小さな尾にすぎず、プロパティ拡張子を持つファイルからプロパティをロードし、SDK自体にあるメインシステムを呼び出すだけです。
local.properties
は、SDKを含むフォルダーの場所という1つのプロパティのみが含まれます。 このファイルは 、個々のマシンに固有の設定が含まれているため、バージョン管理システムの例外のリストに含める必要があります。 たとえば、Windowsでは、このファイルには次の行が含まれます。
sdk.dir=C:\\Android-SDK
実際、このファイルの変数の内容を使用して
ANDROID_HOME
環境
ANDROID_HOME
を作成し、ファイルをゴミ箱に安全に送信できます。 とりわけ、この後NetBeansを再起動することを忘れないでください。
すでに
ant.properties
満たし
ant.properties
いるため、キーストアの場所などの補助変数がそこに保存されます。
project.properties
ファイルもあります。 プロジェクトの作成で説明した手順の後、プロジェクトの対象となるAndroid APIのレベル、およびProGuard構成ファイルの検索場所に関する行のみがあります。 プロジェクトにライブラリを追加すると、それらに関する行が表示されます。
最後に、
proguard-project.txt
ファイルには、その名前が示すとおり、ProGuardの指示が含まれています。 最初は空ですが、SDKフォルダーには事前に記録された構成があるため、ProGuardがアイドル状態になるわけではありません(ProGuardについてコメントを外した行を覚えていますか?) たとえば、私は個人的に、とりわけ、行を追加するのが好きです
-renamesourcefileattribute MyProject
-keepattributes SourceFile,LineNumberTable
さらに、プロジェクト内のどのコード行がドロップまたは例外を引き起こすかについての正確なデータがあるため、エラーレポートの収集に役立ちます。
また、
build.xml
は
custom_rules.xml
ファイルをロードします(存在する場合)。必要なすべてのタスクを追加します。 もう一度タスクを見てみる価値があります。
<target name="rebuild-resources" depends="-set-debug-mode, -build-setup, -code-gen" />
これらの行は、SDKビルドシステムから単純に取得されます。 残念ながら、それらは別のタスクで取り出されないので、自分でやらなければなりませんでした。 他の2つのタスクを見るとさらに興味深いです。
<target name="release-and-save" depends="release"> <xpath input="AndroidManifest.xml" expression="/manifest/@android:versionName" output="manifest.versionName" default="test"/> <xpath input="AndroidManifest.xml" expression="/manifest/@android:versionCode" output="manifest.versionCode" default="test"/> <copy file="${out.final.file}" tofile="releases/${ant.project.name}-release${manifest.versionCode}-${manifest.versionName}.apk" overwrite="true"/> <copy file="${obfuscate.absolute.dir}/mapping.txt" tofile="releases/mapping-release${manifest.versionCode}.txt" overwrite="true"/> </target>
XPathを使用して、ここでバージョンパラメータを取得し、それらを使用してファイル名を生成します。 通常のアリにはXPathのサポートはありませんが、どこから来たのですか? Googleは、Android SDKに独自のツールを追加して、アプリケーションの操作をより便利にしました。 それらのツールの多くは、SDKから特定のファイルを実行することになりますが、
xpath
など、アセンブリファイルの作成を容易にするものもあります。 たとえば、もう1つの便利なツールは
if
。これは、プログラミング言語の対応する構成が行うこととまったく同じことを行います。条件に応じてタスクを実行します。
2番目のタスクも
xpath
使用しますが、今回はタスクがもう少し複雑です:
<target name="-find-main-activity"> <xpath input="AndroidManifest.xml" expression="/manifest/@package" output="project.app.package" default="test"/> <xpath input="AndroidManifest.xml" expression="/manifest/application/activity[intent-filter/category/@android:name = 'android.intent.category.LAUNCHER'][1]/@android:name" output="project.app.mainactivity" default="test"/> <if> <condition> <matches pattern="\..+|[^\.].*\..*[^\.]" string="${project.app.mainactivity}"/> </condition> <then> <property name="project.app.mainactivity.qualified" value="${project.app.mainactivity}"/> </then> <else> <property name="project.app.mainactivity.qualified" value=".${project.app.mainactivity}"/> </else> </if> <property name="project.app.launcharg" value="-a android.intent.action.MAIN -n ${project.app.package}/${project.app.mainactivity.qualified}"/> </target> <target name="launch" depends="-find-main-activity"> <exec executable="adb"> <arg line="shell am start"/> <arg line="${project.app.launcharg}"/> </exec> </target>
インテントフィルターでカテゴリ
android.intent.category.LAUNCHER
を定義するアクティビティを見つける必要があります。これが、メニューに表示されるアクティビティをAndroidが定義する方法です。 いくつかある可能性がありますが(これはまれですが)、タスクはそれらの最初を取ります。
別の障害があります。 アクティビティは、
AndroidManifest.xml
フルネームのエントリによって宣言されるか、アクティビティがメインパッケージにある場合は、前にドットが付いたクラスの名前によってのみ宣言されます。 少なくともそれはドキュメントが言っていることです。 唯一の問題は、Eclipseやその他のツールを使用すると、ポイントを省略して、メインパッケージにあるアクティビティの名前を簡単に記述できることです。 Androidはそのような配慮に苦しんでいますが、アプリケーションを起動するチームはもういません。 十分でない場合は、ポイントを追加する必要があります。 ここで、先ほど述べた
if
タスクと正規表現が役立ちます。
また、音を再現する非常に簡単な作業でした。 SDKのビルドファイルからひっくり返る6つのフックのいずれかを使用しました。
- -ビルド前
- -プリコンパイル
- -ポストコンパイル
- -ポストパッケージ
- -ポストビルド
- -プレクリーン
フックは、プログラムのビルド段階を反映します。ライブラリのコンパイル、コードの生成(RenderScript、aidl、R、BuildConfig)、プロジェクトのコンパイル、APKのパッキング、署名、 zipalignです。 したがって、これらすべてのアクションが始まる前に
-pre-build
が呼び出され、プロジェクト自体をコンパイル
-pre-compile
直前に
-pre-compile
が呼び出され、コンパイルとパッケージングの間で
-post-build
パッケージ化の後、署名前に
-post-build
は最後に呼び出されます。
-pre-clean
が呼び出されたとき、名前から明らかだと思います。
結論の代わりに
今日は、最も重要なこと、つまりプロジェクトの作成に注目しました。 実際、この後、プロジェクトは非常に機能しているので、座ってコードを書くことができます。 ただし、プロジェクトにライブラリを追加し、デバッグし、テストを作成する必要があります。 これらのアクションはすべて、NetBeansでもうまく機能します。 これを行う方法については、記事の次の部分で説明します。