Схема построения Gradle динамически из комбинированных вкусовых измерений
У нас есть два разных измерения вкуса, как в этом примере, и мы хотим динамически генерировать applicationId как
com.company.apple
вместо этого этот сценарий будет генерировать идентификатор приложения
null.company.apple
Я полагаю, что это потому, что функция внизу перебирает весь список productFlavor, а не комбинированный список.
flavorDimensions "product", "license"
productFlavors.all {
ext.scheme = null
ext.scheme_tail = ""
ext.kind = null
ext.license = null
}
productFlavors {
apple {
dimension "product"
kind = "apple"
scheme = "companyapple"
}
orange {
dimension "product"
scheme = "companyorange"
kind = "orange"
}
kiwi {
dimension "product"
scheme = "companykiwi"
kind = "kiwi"
}
com {
dimension "license"
license = "com"
scheme_tail = ''
}
eu {
dimension "license"
license = "eu"
scheme_tail = "eu"
}
uk {
dimension "license"
license = "uk"
scheme_tail = "uk"
}
}
productFlavors.all {
applicationId license + ".company." + kind
ext.fileProvider = applicationId + ".fileprovider"
manifestPlaceholders = [scheme: "$scheme$scheme_tail", fileProvider: "$fileProvider"]
buildConfigField("String", "FILE_PROVIDER", "\"$fileProvider\"")
buildConfigField("String", "SCHEME", "\"$scheme$scheme_tail\"")
buildConfigField("String", "KIND", "\"$kind\"")
buildConfigField("String", "LICENSE", "\"$license\"")
}
Как я могу перебрать объединенный список, чтобы построить мои поля buildConfig и applicationIds?
МанифестПлейсхолдеры используются следующим образом:
<activity android:name=".FruitViewerActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="${scheme}" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${fileProvider}"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
Спасибо Рори
2 ответа
Я нашел решение, которое отвечает моим целям, а затем улучшил его с помощью информации из этой статьи Дэвида Меденьяка.
Сначала используйте applicationId и applicationIdSuffix для создания applicationId. Создайте файловый провайдер отдельно для BuildConfig и для AndroidManifest. Опубликуйте файл sche_prefix и circuit_suffix отдельно для AndroidManifest и объедините их позже. Соберите схему из ее компонентов в ApplicationVariant.
flavorDimensions "product", "license"
productFlavors.all {
ext.scheme_prefix = null
ext.scheme_suffix = ""
ext.license = null
}
productFlavors {
apple {
applicationId = "apple.company"
dimension "product"
scheme_prefix = "companyapple"
manifestPlaceholders = [scheme_prefix: "$scheme_prefix"]
buildConfigField("String", "KIND", "\"apple\"")
}
orange {
applicationId = 'orange.company'
dimension "product"
scheme_prefix = "companyorange"
manifestPlaceholders = [scheme_prefix: "$scheme_prefix"]
buildConfigField("String", "KIND", "\"orange\"")
}
kiwi {
applicationId = "kiwi.company"
dimension "product"
scheme_prefix = "companykiwi"
manifestPlaceholders = [scheme_prefix: "$scheme_prefix"]
buildConfigField("String", "KIND", "\"kiwi\"")
}
com {
dimension "license"
license = "com"
applicationIdSuffix = "$license"
scheme_suffix = ''
manifestPlaceholders = [scheme_suffix: "$scheme_suffix"]
}
eu {
dimension "license"
license = "eu"
applicationIdSuffix = "$license"
scheme_suffix = "eu"
manifestPlaceholders = [scheme_suffix: "$scheme_suffix"]
}
uk {
dimension "license"
license = "uk"
applicationIdSuffix = "$license"
scheme_suffix = "uk"
manifestPlaceholders = [scheme_suffix: "$scheme_suffix"]
}
}
android.applicationVariants.all {
variant ->
ext.fileProvider = variant.applicationId + ".fileprovider"
buildConfigField("String", "FILE_PROVIDER", "\"$fileProvider\"")
def product = variant.productFlavors[0]
def license = variant.productFlavors[1]
variant.buildConfigField("String", "LICENSE", "\"${license.license}\"")
variant.buildConfigField "String", "SCHEME", "\"${product.scheme_prefix}${license.scheme_suffix}\""
}
Вот соответствующие изменения манифеста:
<activity android:name=".FruitViewerActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="${scheme_prefix}${scheme_suffix}" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
apple {
dimension "product"
kind = "apple"
licence = "apple"
scheme = "companyapple"
}
Ваша недостающая лицензия в вашем вкусе, поэтому она по умолчанию null