AndroidのGradleテクニック4.1独自のカスタムタスクの作成

3582 ワード

4.1独自のカスタムタスクの作成
に質問
自分のタスクでGradle構築プロセスをカスタマイズしたいと思っています.

Gradleコンストラクションファイルにタスク要素を追加します.Androidプラグインが提供する追加のプロパティを使用すると、開発が容易になります.
ディスカッション
Gradle DSLは、独自のカスタムタスクを定義するためのタスクブロックをサポートします.APIには、コピー、パッケージング、実行などの既存のタスクが多数含まれており、プロパティを設定するだけで使用できます.
たとえば、レプリケーション・タスクにはfromプロパティとintoプロパティが含まれ、fromブロックは指定したファイル名モードを除外するように構成できます.すべてのAPKを新しいフォルダ(署名されていないフォルダや位置合わせされていないフォルダを除く)にコピーするには、例4-1のタスクをモジュール構築に追加します.
例4-1.APKを別のフォルダにコピー
task copyApks(type: Copy) {
from("$buildDir/outputs/apk") {
exclude '**/*unsigned.apk', '**/*unaligned.apk'
}
into '../apks'
}
buildDirプロパティはデフォルトの構築ディレクトリ(app/build)を参照し、ドル記号はGroovy文字列に注入するために使用されます(二重引用符を使用します).コピータスクのドキュメントには、除外ブロックがAntスタイルのディレクトリ名をサポートしていることが表示されます.これは、**がすべての子孫ディレクトリに一致することを意味します.
既存のGradleタスクを簡単に構成したくない場合は、Gradleの構成と実行フェーズの違いを理解する必要があります.構成フェーズでは、Gradleはそれらの依存性に基づいてDAGを構築する.次に、必要なタスクとその依存関係を実行します.すべてのタスクが以前に構成されていました
すべてが実行されます.
Gradleは4-1のような宣言的なタスクが好きで、あなたは何をしたいかを指定しますが、どのようにするかではありません.ただし、コマンドを実行する必要がある場合は、GradleタスクにdoLastブロックを追加します.
ここでは、レシピ3.2から、例4〜2に示すタスクを繰り返す.
例4-2.使用可能な変数を印刷するカスタムタスク
task printVariantNames() {
doLast {
android.applicationVariants.all { variant ->
println variant.name
}
}
}
タスクdoLastブロックの前または後に実行されるアクションは、構成時に実行されます.doLastブロックのコード自体は実行時に実行されます.
Androidプラグインにはandroidプロパティが追加され、すべてのbuildType/flavorの組み合わせを返すアプリケーションVariantsプロパティが順次追加されます.この場合、コンソールに印刷されます.
ApplicationVariantsプロパティはcom.android.アプリケーションプラグインにのみ適用されます.AndroidライブラリにはlibraryVariantsプロパティが用意されています.testVariantsプロパティは両方で使用できます.
すべてのデバッグスタイルを単一のデバイスにインストールするには、例4~3のタスクを使用します.
例4-3.すべてのデバッグスタイルを単一のデバイスにインストール
task installDebugFlavors() {
android.applicationVariants.all { v ->
if (v.name.endsWith('Debug')) {
String name = v.name.capitalize()
dependsOn "install$name"
}
}
}
この場合、dependsOnメソッドは、実行ではなく構成プロセスの一部であることを示します.各バリエーション名(friendlyDebugなど)は大文字(FriendlyDebug)で、対応するインストールタスク(インストールFriendlyDebug)をinstallDebugFlavorsタスクの依存項目として追加します.
その結果、構成中、installArrogantDebug、install FriendlyDebug、およびinstallObsequiousDebugは、いずれも依存としてinstallDebugFlavorsに追加されます.したがって、コマンドラインでinstallDebugFlavorsを実行するには、すべての3つのflavorインストールが必要です.
例4-4.すべてのデバッグflavorをインストール
./gradlew instDebFl
:app:preBuild UP-TO-DATE
:app:preArrogantDebugBuild UP-TO-DATE
:app:checkArrogantDebugManifest
// ... lots of tasks ...
:app:assembleArrogantDebug UP-TO-DATE
:app:installArrogantDebug
Installing APK 'app-arrogant-debug.apk' on 'Nexus_5_API_23(AVD) - 6.0'
Installed on 1 device.
:app:checkFriendlyDebugManifest
// ... lots of tasks ...
:app:assembleFriendlyDebug UP-TO-DATE
:app:installFriendlyDebug
Installing APK 'app-friendly-debug.apk' on 'Nexus_5_API_23(AVD) - 6.0'
Installed on 1 device.
:app:checkObsequiousDebugManifest
// ... lots of tasks ...
:app:assembleObsequiousDebug UP-TO-DATE
:app:installObsequiousDebug
Installing APK 'app-obsequious-debug.apk' on 'Nexus_5_API_23(AVD) - 6.0'
Installed on 1 device.
:app:installDebugFlavors
BUILD SUCCESSFUL

自分のカスタムタスクを作成するには、少なくともGroovyの知識が必要であることがわかります.そのため,広範な議論は本書の範囲を少し超えているが,いくつかの良いGroovyリソースがある.本書では他のGroovy概念を定義している.
拡張ADPタイムアウト
また、構築プロセスは比較的速いが、導入プロセスはそうではない可能性があります.AndroidタグはadbOptionsタグをサポートし、プロセスがタイムアウト制限に達する前に許容される時間量を増加させる(例4〜5).
実施例4〜5.ADBタイムアウト期間の変更
android {
adbOptions {
timeOutInMs = 30 * 1000
}}
}}
これにより、タイムアウト制限が30秒に延長されます.ShellCommandUnresponsiveExceptionが失敗した場合は、この値を調整します.