参考:
Android Gradle (3) - FlavorDimensions
フレーバー寸法と製品フレーバー - Android gradle - プログラマー募集
多次元パッケージングの概要
FlavorDimensions は、その言葉の文字通りの理解から「フレーバー ディメンション」として知られており、「プロダクト フレーバー (つまり、productFlavors)」と組み合わせて使用する必要があります。
FlavorDimensions を使用すると、後続の productFlavors が使用するディメンションが定義されます。例を挙げてみましょう
android{
// 其他参数
flavorDimensions ("sec", "channel")
// 创建产品风味
productFlavors {
// 安全维度 - 是否加固
reinforced {
dimension "sec"
}
normal {
dimension "sec"
}
// 渠道维度
baidu {
dimension "channel"
}
xiaomi{
dimension "channel"
}
}
上記のコードを使用すると、secとchannel の2 つの次元が定義されます。1 つのパラメーター、1 つの次元。
productFlavors では、各ディメンションのプロダクト フレーバー タイプを調整します。
秒には強化と通常が含まれます
チャンネルにはxiaomiとbaiduが含まれます
以下のような図として視覚化できます。
2 つの フレーバーディメンションと 2 つのプロダクトフレーバーで、合計 4 つの製品フレーバーを取得できます
3 つのパラメータを 3 次元空間座標系とみなすことができる場合、ここでの図は単なる視覚化にすぎません。
APKがSDKを参照する場合のフレーバーデザイン
apk
インポートコードは上記と同じです
SDK
android{
// 其他参数
flavorDimensions ("channel")
// 创建产品风味
productFlavors {
// 渠道维度
baidu {
dimension "channel"
}
xiaomi{
dimension "channel"
}
}
複数のフレーバーが参照される場合、簡単に一致させるために、flavorDimensions の定義は同じ定義を持つ必要があります。そうしないと、エラーが報告されます。
チャンネルごとにコードを紹介
/**
* 测试加固引入
* */
reinforcedImplementation fileTree(dir: '../securitysdk/libs', include: ['*.jar', '*.aar'])
reinforcedImplementation project(':securitysdk')
/**
* 普通引入
* */
normalImplementation project(path: ':sdk2third')
以下の文は出典です
フレーバー寸法と製品フレーバー - Android gradle - プログラマー募集
とても詳しいので直接移動しました
四、製品風味
productFlavors
以下の各項目の最終形式は productFlavor
、つまり、上で述べた「v1」、「v2」... です。
1. productFlavorの存在形態
各構成は最終的にクラス、属性、またはメソッドにマップされることがわかっています。productFlavor も例外ではなく、 としてマップされ com.android.build.gradle.internal.dsl.ProductFlavor
、継承構造は次のとおりです。
DSL/プロダクトフレーバー
ベースフレーバー
デフォルトの製品フレーバー
BaseConfigImpl
製品の風味
BaseConfig
次元認識
コア製品フレーバー
名前付き
2. productFlavor の属性の意味
冗長すぎるコードの使用を避けるために、最初に規則を作成しましょう。
android {
productFlavors{
zincPower{
// 我们下面的 “使用方法” 代码都是基于这一块,除非特殊说明。
}
}
}
- タイプ: 文字列
- 説明: アプリケーションの ID。
defaultConfig
ここで 上書きされますapplicationId
。これにより、さまざまな apk パッケージを再生できるようになります。
- 手順:
zincPower {
// applicationId 应用的包名,会覆盖 defaultConfig 中的 applicationId
// applicationId 会替换 AndroidManifest.xml 中的 manifest 标签下 package 的 value
applicationId "com.zinc.power"
......省略其他配置
}
- タイプ: 文字列
- 説明: これは applicationId 文字列に追加されて、最終的なパッケージ名を形成します。これにより、1 つのコード セットに対して複数のパッケージ名の効果を実現することもできます。
- 手順:
zincPower {
applicationIdSuffix '.debug'
}
- タイプ: リスト<ファイル>
- 説明: この属性は、
library
aar 形式でインポートしたライブラリ、または直接作成したライブラリを含む、作成したライブラリにのみ適用されます。その役割は、ライブラリのコンパイル時に難読化ルールを担当することです。メイン アプリのモジュールで各ライブラリの難読化ルールを管理する必要はなく、各ライブラリの難読化ルール ファイルを直接使用します。 - 手順:
zincPower {
consumerProguardFiles 'consumer-rules.pro'
......省略其他配置
}
// 因为该属性是一个 List<File> 类型,如果需要多个文件配置,则如下所示
zincPower {
consumerProguardFiles 'consumer-rules.pro','zincPower-rules.pro'
......省略其他配置
}
- タイプ: 文字列
- 説明: フレーバーのディメンション。現在のフレーバーが属するディメンションを指定します。フレーバーには 1 つのディメンションが必要であり、1 つのディメンションのみに関連付けることができます。 それ以外の場合は、次のエラーが報告されます
ERROR: Flavor 'v1' has no flavor dimension.
- 手順:
zincPower {
// 关联纬度
dimension 'version'
......省略其他配置
}
- タイプ: 外部NativeBuildOptions
- 説明: ここでは、ndk コンパイル プロセスのいくつかのパラメーターを設定します。cmake と ndkBuild の 2 つのパラメーターに分かれています。
- 手順:
zincPower {
externalNativeBuild {
ndkBuild {
// Passes an optional argument to ndk-build.
arguments "NDK_MODULE_PATH+=../../third_party/modules"
}
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang"
// Sets a flag to enable format macro constants for the C compiler.
cFlags "-D__STDC_FORMAT_MACROS"
// Sets optional flags for the C++ compiler.
cppFlags "-fexceptions", "-frtti"
// Specifies the library and executable targets from your CMake project
// that Gradle should build.
targets "libexample-one", "my-executible-demo"
}
}
}
- タイプ: JavaCompileOptions
- 説明:
annotationProcessor
使用時に必要なパラメーターなど、コンパイル時に Java の一部のパラメーターを構成します。 - 手順:
zincPower {
javaCompileOptions {
annotationProcessorOptions{
arguments = []
classNames ''
....
}
}
......省略其他配置
}
JavaCompileOptions で構成できる特定のパラメータについては、ポータルに入ってください。
- タイプ: マップ<文字列、オブジェクト>
- 説明:
AndroidManifest.xml
で置き換えられるパラメータを構成します。このパラメータを使用して、さまざまなフレーバーのロゴとアプリ名、および Youmeng のパラメーターを構成し、さまざまなフレーバーの差別化された構成を実現できます。 - 手順:
差別化されたロゴとアプリ名を構成すると、 gradle で次の段落を使用できます。
android {
flavorDimensions('abi', 'version')
productFlavors {
// 省略其他的风味配置
x86 {
dimension 'abi'
// 配置不同的包名,达到能两个风味能共存
applicationId 'com.zinc.bear'
manifestPlaceholders = [
logo : "@drawable/logo_bear",
appName : "bear",
]
// 配置签名
signingConfig signingConfigs.jiangpengyong
}
armV7 {
dimension 'abi'
// 配置不同的包名,达到能两个风味能共存
applicationId 'com.zinc.shark'
manifestPlaceholders = [
logo : "@drawable/logo_shark",
appName : "shark",
]
// 配置签名
signingConfig signingConfigs.xiaopenyou
}
}
}
ロゴリソースマップ
次に、 AndroidManifest.xml
それを使用します ${你配置的变量名}
<application
android:allowBackup="true"
android:icon="${logo}"
android:label="${appName}"
android:roundIcon="${logo}"
android:supportsRtl="true"
android:theme="@style/AppTheme">
......
最後に、個別に実行すると、次の効果が確認できます。
- タイプ: リスト<文字列>
- 説明: インポートされたライブラリ内のフレーバーの不一致を処理します。
- 手順:
例:
ライブラリをインポートする x86 フレーバーがあり、同じフレーバー ディメンションがライブラリに存在しますが、同じ製品フレーバーを持たないため、一致しません。この場合、このパラメーターが必要です。コードは以下のように表示されます:
アプリの下の build.gradle
android {
// 其他配置
flavorDimensions('abi')
// 创建产品风味
productFlavors {
x86 {
dimension 'abi'
matchingFallbacks = ['pro']
}
}
dependencies {
// 引入 flavor_x86 library
x86Implementation project(':flavor_x86')
}
flavor_x86 の下の build.gradle
android {
// 存在相同的风味维度
flavorDimensions('abi')
// 没有相同的产品风味,需要使用 matchingFallbacks 选择需要的产品风味
productFlavors {
pro {
dimension 'abi'
}
free{
dimension 'abi'
}
}
}
私の友人がgithub にデモを公開しています。役立つと思われる場合は、スターを付けてください。
64K参照制限問題公式ドキュメント ポータル
- タイプ: ブール値
- 説明: 下請けを有効にするかどうか。Android のメソッド インデックス値は 2 バイト、4 桁の 16 進値、つまり [0, 0xffff] であるため、メソッドの最大数は 65536 です。超過すると外注が必要となるため、このパラメータを有効にする必要があります。
- 言及する価値があります。defaultConfig で有効にするだけなので、すべてのフレーバーを記述する必要がなく、冗長性が減ります。
長くなりすぎないように、使用方法については Xiaopenyou による別のブログ投稿を参照してください: defaultConfig - Android Gradle のセクション 3.8
- タイプ: ファイル
- 説明: 必要なクラスをメイン パッケージにパッケージ化します
classs.dex
。ポイント 2.9 では、multi-dex パッケージ処理の使用を共有しましたが、場合によっては、このプロパティを使用できるように、いくつかのメイン クラスをメイン パッケージにパッケージ化する必要があることがあります。 - 手順:
zincPower {
multiDexKeepFile file('multidex-config.txt')
...
}
multidex-config.txtの記述は以下の通りで、各ファイルは1行です
com/example/MyClass.class
com/example/TestClass.class
- タイプ: ファイル
- 説明: 必要なクラスをメインパッケージに詰め込みます。ポイント 2.10 と同じ機能を持ちます。違いは書き方にあります。
- 手順:
zincPower {
multiDexKeepFile file('multidex-config.pro')
...
}
multidex-config.proでの記述方法は以下の通りです
// 将会保留所有的在com.example package的类
-keep class com.example.** { *; }
- タイプ: NdkOptions
- 説明: abi フィルタリングに使用されます
- 使用方法:
次のように設定すると、コンパイルされた APK パッケージにはarmeabi-v7a
「X86」などの他のアーキテクチャのみが含まれます。
zincPower {
// ndk中,目前只有 abiFilter 一个属性,所以 ndk 目前来说只用于 abi 的过滤
ndk {
abiFilter 'armeabi-v7a'
}
...
}
NdkOptions の特定の構成可能なパラメータについては、公式ドキュメント Portalを参照してください。
- タイプ: リスト<ファイル>
minifyEnabled
説明: 難読化ルール ファイルを構成します。このパラメータは、 true に設定されている場合にのみ 使用されます。ファイルでは、どのファイルが最適化および難読化されないかを宣言する必要があります。- 言及する価値があります。バックエンド コードが難読化されているため、クラス名とメソッド名が変更され、リフレクションが失敗します。そのため、難読化されていないことを宣言する必要があります。(ここでは、このパラメーターを使用するシナリオを示します。アプリケーションが正常であるが、難読化を有効にすると、不可解なバグが表示される場合は、そのバグが難読化によって引き起こされているかどうかを考えてください。 )
- 手順:
zincPower {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
- タイプ: SigningConfig
SigningConfig の 構成可能なパラメータポータル
- 説明: 署名構成を構成します。apk パッケージは、インストールする前に署名する必要があります。直接実行する場合は、システムのデフォルトの署名証明書を使用します。リリース パッケージをリリースする場合は、個人または企業の署名を使用する必要があります。
- 手順:
(1) 図に示すように、最初にプロジェクトのルート ディレクトリに keystore.properties ファイルを作成し、そのファイルに対応する設定を書き込む必要があります (2) アプリケーション レベルの build.gradle で次のコードを使用します
。
// 引入我们在(1)中创建的配置
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
compileSdkVersion 28
buildToolsVersion "29.0.1"
defaultConfig {
// 省略一些配置...
}
signingConfigs {
xiaopenyou {
// 使用 keystoreProperties 获取对应的参数
keyAlias keystoreProperties['keyAlias2']
keyPassword keystoreProperties['keyPassword2']
storeFile file(keystoreProperties['storeFile2'])
storePassword keystoreProperties['storePassword2']
}
// ...其他签名配置
}
buildTypes {
// 省略一些配置...
}
flavorDimensions('abi', 'version')
// 创建产品风味
productFlavors {
// 省略一些配置...
armV7 {
// 省略一些配置...
signingConfig signingConfigs.xiaopenyou
}
}
}
- タイプ: VectorDrawablesOptions
- 説明: ベクトル図のパラメータを設定します。
- 使用方法: VectorDrawablesOptions に は と の
2 つのパラメータしかありません 。それぞれの用途は以下の通りですgeneratedDensities
useSupportLibrary
zincPower {
vectorDrawables {
// 如果 minSdkVersion 小于 21,只生成mdpi的png
generatedDensities 'mdpi'
// 设置为 true,会忽略 generatedDensities ,会加入svg兼容包,不会再产生png
useSupportLibrary true
}
}
ベクター グラフィックの使用法については、 Xiaopenyou による別の記事を参照してください。
- タイプ: 整数
- 説明: 現在のバージョン値を適用します。私の友人たちの目には、と
versionName
の違いは、versionCode
プログラマー、versionName
プロダクト マネージャー、ユーザーの違いにあります。 - 手順:
zincPower {
versionCode 1000
......
}
- タイプ: 文字列
- 説明: アプリケーションのバージョン。通常、アプリケーションのバージョンは「1.2.0」と呼ばれ、この値によって構成されます。
- 手順:
zincPower {
versionName "1.0.0"
.....
}
- タイプ: 文字列
- 説明: 2.17 ドット「バージョン」にサフィックスを追加します。
- 手順:
zincPower {
// 如果 versionName "1.0.0" ,则最终的版本名为 1.0.0.test
versionNameSuffix ".test"
.....
}
3. productFlavor のメソッドの意味
3.1 buildConfigField(タイプ、名前、値)
- 説明: BuildConfig クラスに値を追加し、最後に BuildConfig に次のコード行を追加します。
// 值的注意的是 value 的值是原样放置,我们通过使用方法一节来了解
<type> <name> = <value>
- 手順:
productFlavors {
x86 {
// 可以通过 BuildConfig 进行获取
buildConfigField('String', 'name', '"XiaoPenYou"')
buildConfigField('int', 'age', '26')
.....
}
}
最後に、次の図に示すような構成が生成されます。これは、次のコードを通じて取得できます。
String name = BuildConfig.name;
int age = BuildConfig.age;
String 型のパラメーターを設定する場合は、二重引用符 "" を追加する必要があることに注意してください (例の name 属性など) 。覚えて!
3.2 ConsumerProguardFile(proguardFile)
- 説明: これは、上で共有した 2.3 点の属性 ConsumerProguardFiles と同じ機能を持ちます。ただし、ここで設定できる難読化ファイルは 1 つだけです。
- 手順:
zincPower {
consumerProguardFile('consumer-rules.pro')
}
3.3 ConsumerProguardFiles(proguardFiles)
- 説明: 上記で共有した 2.3 点の属性 ConsumerProguardFiles と同じ機能を持ち、これも複数の紛らわしいファイルです。
- 手順:
zincPower {
consumerProguardFile('consumer-rules.pro', 'zincPower-rules.pro',.....)
}
3.4 maxSdkVersion(maxSdkVersion)
- 説明: アプリケーションのサポートされている最も高いバージョンを設定します。通常は設定しません。
- 手順:
zincPower {
// 最高支持28版本
minSdkVersion 28
}
3.5 分SdkVersion(minSdkVersion)
- 説明: アプリケーションのサポートされる最小バージョンを設定します。
- 手順:
zincPower {
// 最低支持19版本
minSdkVersion 19
}
3.6 missingDimensionStrategy(ディメンション, requestedValue)
- 同様のメソッド: missingDimensionStrategy(dimension, requestedValues) 違いは、2 番目のパラメーターで複数のフレーバーを設定できることです。
- パラメータの説明:
(1) ディメンション: ディメンション
(2) requestedValue: フレーバー (requestedValues の場合、フレーバーのリスト) - 説明: ライブラリ内のチャネル設定、つまりディメンションとフレーバーを無視します。無視しない場合、インポート時に機能しません。
- 手順:
私たちのプロジェクト構造は次のとおりです 次 のチャネル構成を記述し
ます zinclibrary
build.gradle
// 创建 风味维度
flavorDimensions('zinc', 'handsome')
// 创建产品风味
productFlavors {
minApi13{
dimension 'zinc'
}
minApi23{
dimension 'zinc'
}
x86{
dimension 'handsome'
}
arm64{
dimension 'handsome'
}
}
このとき、依存関係を直接追加すると app
同期 build.gradle
時にエラーが発生します。
dependencies {
...忽略其他依赖
implementation project(":zinclibrary")
}
app
したがって、この パラメータを使用して、ライブラリによってもたらされるディメンションとフレーバーを無視する必要があります build.gradle
。つまり、次のコードを使用します。
zincPower {
missingDimensionStrategy 'zinc', 'minApi13', 'minApi23'
missingDimensionStrategy 'handsome', 'x86', 'arm64'
}
3.7 proguardFile(proguardFile)
- 説明: 難読化ファイルを追加します。これは、ファイルが渡される点を除き、2.13 の機能と一致しているため、ここでは詳細を説明しません。
- 手順:
zincPower {
proguardFile 'proguard-rules.pro'
}
- 説明: 難読化ファイルを追加します。これは 2.13 の機能と一致するため、ここでは詳細は説明しません。
- 手順:
debug {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
- 説明: 予約済みのリソース構成。
- 使用法:
zincPower {
// 这样我们编译出的apk中,只有 “默认” 和 “中文zh” 两种资源
resConfig "zh"
}
- 説明: 予約済みリソース構成。resConfig との違いは、resConfigs が複数のリソースを予約することです。
- 使用法:
zincPower {
// 这样我们编译出的apk中,只有 “默认” 、 “中文zh” 和 “英文en” 两种资源
resConfigs "zh","en"
}
- 説明: 付加価値リソース
- 使用法:
zincPower {
// 添加至 res/value,通过 R.string.age 获取
resValue('string', 'age', '12year')
}
3.14 setConsumerProguardFiles(proguardFileIterable)
- 説明:機能は2.3と同じですが、書き方が違うのでここでは詳しく説明しません
- 手順:
zincPower {
consumerProguardFiles = [ 'consumer-rules.pro','zincPower-rules.pro' ]
}
3.15 setProguardFiles(proguardFileIterable)
- 説明: 難読化されたファイルを追加します。2.13 と同じ機能ですが、記述方法が少し異なるため、ここでは繰り返しません。
- 手順:
zincPower {
proguardFiles = [getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro']
}
3.16 targetSdkVersion(targetSdkVersion)
- 説明: アプリケーションのターゲット バージョン。これは、指定されたバージョンがテスト済みであることを意味し、このバージョンの API は開発プロセス中に使用できますが、それ以外の場合は使用できないことを示すメッセージが表示されます。設定されていない場合は、minSdkVersion の値と一致します。
- 使用法:
zincPower {
targetSdkVersion 28
}