【Gradle】Android Gradleマルチチャネル構築

4190 ワード

Android Gradleマルチチャネル構築
マルチチャネル構築の基本原理
Android Gradleでは、Build Variantという概念を定義しています.Build Variant=Build TYPe+Product Flavorです.Build Typeはreleaseやdebugなど、私たちが構築したタイプです.Product Flavorは、Baidu、Googleなど、私たちが構築したチャネルです.これらを合わせるとbaiduRelease、baiduDebug、googleRelease、googleDebugです.これらの組み合わせのコンポーネントが生産されています.Product Flavorは、私たちのマルチチャネル構築の基礎です.以下に、ProductFlavorを追加します.
android{
    productFlavors{
        google{}
        baidu{}
    }
}

以上のリリースチャネル構成により、Android Gradleは多くのTaskを生成します.ここで、assembleの先頭にあるのは、部品生成物(apk)の生成を担当する.他にもcompileシリーズ、installシリーズなどがあります.生成されたTaskに加えて、各ProductFlavorには独自のSourceSetがあり、独自のdependencies依存もあります.
Flurryマルチチャネルと同盟マルチチャネル構築
Flurry自体にはチャネルの概念がなく、アプリケーションがあるので、アプリケーションをチャネルとすることができます.
android{
    productFlavors{
        google{
            buildConfigField 'String','FLURRY_KEY','"ABADFASSDFAS"'
        }
        baidu{
            buildConfigField 'String','FLURRY_KEY','"JKKJKHKJHIHIUY"'
        }
    }
}

これにより各チャネルのBuildConfigクラスにFLURRY_という名前が付けられますKEYの定数定義、その値は私達がチャネルの中でbuildConfigFieldを使って指定した値で、各チャネルは異なって、私達はコードの中でこの定数を使うことを指定するだけで、このように各チャネルの統計分析はやり遂げることができます.
Flurry.init(this,FLURRY_KEY);

友盟自体にはルートの概念がある.しかし、コードで指定されているのではなく、AndroidManifestです.xmlで構成されているものは、meta-dataラベルを構成することによって設定されます.

マルチチャネル構築のカスタマイズ
マルチチャネルのカスタマイズは、Android GradleプラグインのProductFlavorの構成であり、ProductFlavorを構成することで各チャネルを柔軟に制御する目的を達成します.
applicaitonId
チャネルの設定に使用するパッケージ名
consumerProguardFiles
Androidライブラリプロジェクトにのみ役立ちます.ライブラリプロジェクトをパブリッシュしてaarパッケージを生成すると、consumerProguardFiles構成を使用する混同ファイルのリストもaarにパッケージ化され、このaarパッケージを参照して混同を有効にすると、aarパッケージの混同ファイルを自動的に使用してaarパッケージのコードを混同し、aarパッケージを混同する必要がなくなります.
android{
    productFlavors{
        google{
            consumeProguardFiles 'proguard-rules.pro','proguard-android.txt'
        }
    }
}

この方法に加えて、consumerProguardFilesメソッドは常に追加され、以前の混同ファイルを空にすることはありませんが、consumerProguardFilesプロパティ構成の方法は、毎回新しい混同ファイルリストであり、以前の構成は先に空になります.
manifestPlaceholders
multiDexEnabled
複数のdexを有効にするための構成で、主に65535メソッドの問題を突破するために使用されます.
proguardFiles
使用するファイルのリストを混同
signingConfig
署名構成
testApplicationId
テストパッケージに適したパッケージ名
testFunctionalTestとtestHandleProfiling
testFunctionalTestは機能テストかどうか、testHandleProfilingは分析機能を有効にするかどうか
testInstrumentationRunner
実行テストを構成するために使用するInstrumentation Runnerのクラス名は、全パスのクラス名であり、androidでなければならない.app.Instrumentationのサブクラスは、一般的にandroidを使用します.test.InstrumentationTestRunnerは、もちろんカスタマイズも可能です.
testInstrumentationRunnerArguments
前のプロパティと組み合わせてInstrumentation Runnerで使用するパラメータを構成し、最終的にはadb shell am instrumentというコマンドを使用します.
versionCodeとversionName
チャネルのバージョン番号とバージョン名を設定します.
useJack
ジャックとJillという新しい、高性能なコンパイラが有効になっているかどうかをマークします.
dimension
dimensionはProductFlavorのプロパティで、ProdoctFlavorの次元として文字列を受け入れます.ProductFlavorをグループ化すると簡単に理解できますが、dimensionが受け入れるパラメータは私たちのグループのグループ名、つまり次元名です.次元名は勝手に指定できません.使用する前に宣言する必要があります.
flavorDimensionは私たちが使っているandroid{}の中の方法で、productFlavors{}と平レベルで、必ずflavorDimensionを使って次元を宣言してからProductFlavorで使用することができます.
複数の次元を同時に指定しますが、これらの次元は順序があり、優先度があり、最初のパラメータの優先度が最も大きく、実際には2番目である必要があります.
android{
    flavorDimensions "abi","version"
}

次元を宣言すると、次のように使用できます.
android{
    flavorDimensions "abi","version"

    productFlavors{
        free{
            dimension 'version'
        }
        paid{
            dimension 'version'
        }
        x86{
            dimension 'abi'
        }
        arm{
            dimension 'abi'
        }
    }
}

マルチチャネル構築の効率化
参考美団案
apkのMETA-INFディレクトリに空のファイルを追加して再署名しない原理を利用する
1、Android Gradleで基本パック(親パック)を作る
2、このパッケージに基づいて一つコピーし、ファイル名は製品、梱包時間、バージョン、ルートなどを区別できるようにする
3、コピーしたapkを修正し、そのMETA-INFディレクトリの下に空のファイルを追加するが、空のファイルのファイル名には意味があり、チャネルを区別できる名前を含まなければならない.
4、手順2、3を繰り返し、必要なすべてのチャネルパッケージapkを生成する