Groovyをモジュールレベルでビルドする



導入
  • このシリーズは、Androidの開発の基本に捧げられる予定です.私に参加し、いくつかのクールなものを構築し、理解しようとしましょう.このポストはなぜビルドファイルがどのようにしてどのように振る舞うかを理解することになります.あなたのような私たちのビルドファイルのより具体的な部分を探しているなら、私の次のポストを待ってください.一旦それが行われるならば、私はリンクを去ります.

  • Gradleは何ですか?
    Gradleはビルドオートメーションツールです.Gradleのおかげで、Androidファイル、クラス、リソース、その他すべてがコンパイルされ、エミュレータやハードウェアデバイス上で動作することができます.Gradleはビルドしたファイルとプラグインのパワーを通してこのすべての善を行います.
    Groovyとは
  • GroovyはJavaとスムーズに統合するプログラミング言語です.Groovyは、Javaとより表現力があり、JavaコードをPythonのように見えます.Groovyの起源は、Pythonドキュメントを見ている作者から来ていて、Javaがその表現力に欠けていると理解しています.GroovyはGradleのビルドファイルで使用するプログラミング言語です.
  • compileSdkVersion 30は、我々のアプリケーションに影響を与えるだけでなく、Gradleに特有の何かではなく、Android SDKバージョンのようなファイルをビルドすることを意味します.
  • 現在、我々が何が起こっているかについてのゆるい理解を持っているので、Module level build filesファイルからコードに飛び込むことができます.
  • plugins {
        id 'com.android.application'
    }
    
    android {
        compileSdkVersion 30
    
        defaultConfig {
            applicationId "com.example.criminalintent"
            minSdkVersion 23
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            println(getDelegate())
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    
    dependencies {
    
        implementation 'androidx.appcompat:appcompat:1.3.0'
        implementation 'com.google.android.material:material:1.3.0'
        implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
        implementation 'androidx.recyclerview:recyclerview:1.2.1'
        testImplementation 'junit:junit:4.+'
        androidTestImplementation 'androidx.test.ext:junit:1.1.2'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
    
    }
    
    

    何が起こっているのか
  • 私たちが語らなければならない最初のことは、JSONのように見えますが、実際にはGradleのドメイン固有言語(DSL)のメソッド呼び出しの束です.

  • DSLは何ですか?
  • それは特定のドメインで実行するために特化したプログラミング言語です.現在Gradleに関連するDSLは何ですか?Gradleはビルドファイルのコードに独自の特殊な方法を与え、KotlinかGroovyのどちらかで(我々はGroovyを選んだ).

  • レッツトークプラグイン
    我々が動かす前に、
  • は、プラグインが何であるかについて話します.プラグインはGradleの仕事の単位です.Gradleはコンパイルコードやリンクファイルのようなことをすることができます.自動的に我々に提供されるAndroidプラグインは、gradleがハードウェアデバイス上で我々のファイルをコンパイルして、リンクして、走らせることができることです.そのプラグインがなければ我々は正しくアプリ
  • を実行することはできませんでした

    プラグイン構文についてのクイックメモ
  • 私たちが下で見るプラグインコードはファイルの残りのコードとは非常に異なっていることを指摘します.プラグインコードブロックは特別で、build.gradle(ドメイン固有の言語)と呼ばれます.プラグインを宣言するときには、この特別な構文を使用して、gradleとusを使ってプラグインが使用されているかをすばやく判断できます.私は十分に強調することはできません、構文はコードの残りの部分に似ていますが、それはありません!
    この点から、プラグインコードブロックをplugin DSLと呼びます.
  • plugins {
        id 'com.android.application'
    }
    
  • プラグインの種類は異なりますが、プラグインDSLで定義されたプラグインはplugin DSLと呼ばれています.バイナリプラグインには一意のIDが定義されています.このidなしではgradleはどのプラグインを参照しているかを知りません.

  • グルービー・ウォーニング.
  • これはGroovyでGroovyを得ることです.Androidに新しい場合は、このセクションを避けることができます.プラグインファイルDSLを引いたビルドファイルの隠し構文について話します.この構文はGroovyのDSLにGroovyによって提供されています.Gradle DSL(単にGroovyの特定の形である)に慣れていないなら、私たちは単にプロパティを宣言していると信じることを簡単に誤解することができます.
  • android {
        compileSdkVersion 30
        println(getDelegate())
        defaultConfig {
            applicationId "com.example.criminalintent"
            minSdkVersion 23
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            println(getDelegate())
        }
    
    }
    
  • 通常このようなことを見ると、ビルドシステムのプロパティを定義していると思います.しかし、Groovyの構文のおかげで、実際には、それぞれの内部コードブロックで変化する特定のオブジェクトへのメソッド呼び出しの束を作っています.あなたがこれらの不可解なオブジェクトが何であるかについて見たいならば、各々のコード・ブロック(通知PrintLn(GetDirectory ())がプラグインDSLで働かない)で、呼び出しはBinary pluginです.印刷コードはもっとグルーヴィーなので、ドキュメントを読んで、自由に言語で快適になる感じ.Gradleログファイルを見ると、奇妙なオブジェクトがコンソールに印刷されていることがわかります.それらのオブジェクトはprintln(getDelegate())オブジェクトです.

  • 代表は何ですか.
  • デリゲートは、直前のスコープで見つからないメソッド呼び出しとプロパティを見つけるために使用されるサードパーティオブジェクトです.Groovyのクロージャがさらに重要であるので、現在、委任オブジェクトは重要です.

  • 閉鎖とは
    Gloovyのクロージャの
  • では、引数を取ることができ、値を返し、変数として割り当てるコードのオープン匿名ブロックがあります.長い話短い、その機能.もう一つの重要な注意点は、各クロージャがデリゲートオブジェクトを持っていることです.Groovyは、クロージャのローカルスコープにない変数とメソッド参照を調べるために使用します.何度かその文を読んでください、それはGradle DSLの重要なステップです.

  • これはどういう意味ですか.
  • 現在、我々は委任オブジェクトと何が閉鎖であるかをしっかり理解しているので、我々はdelegateの隠された構文について話を始めることができます.それのように見えないにもかかわらず、その構文は実際にgroovyメソッド呼び出しです、そして、メソッドはパラメタとして閉鎖をとります.したがって、android{ }android{ }になり、Android {}ブロック内で宣言されたすべては、参照のクロージャのデリゲートオブジェクトに見えるメソッド呼び出しです.この構造体に続く{{ } }がすぐに続くすべての文.Hereは、より完全にこの考えを越える関連です.さて、この代表的なオブジェクトはどこから来ますか、そして、なぜそれはAndroidについてそんなに知っていますか?それはandroid(closure){}の中で定義するバイナリプラグインを通して私たちに提供されます.私たちも、Androidのプラグインを削除し、ビルドファイルの同期によってこれを証明することができます.あなたは、州、plugin DSL、これは2つのことを証明するエラーに気づくでしょう:1)Androidの{ }は、実際にメソッドと2)Androidのプラグインはすべてを可能にするものです.

  • 行く前に
  • 私は、私たちのビルドファイルで何が起こるかについて、速くて、簡単で、消化できるブログ柱を作るために、最善を尽くしました.しかし、私はまだアンドロイドに新しいです、そして、私は私が多分若干のものを逃したということを知っています.Groovyクロージャ、デリゲートオブジェクト、Gradleドキュメントのドキュメントを読んでください.

  • 参考文献
    Groovy closures
    Build files
    Gradle build language
    Gradle and Groovy

    Android and Groovy


    結論
  • 私のこのブログの記事を読むためにあなたの時間を取ってくれてありがとう.あなたが質問または懸念があるならば、下でコメントしてください、さもなければ、私に連絡してください.