com.bugsnag.gradle.android.AndroidVariant.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bugsnag-gradle-plugin Show documentation
Show all versions of bugsnag-gradle-plugin Show documentation
Gradle plugin to automatically upload mapping files to BugSnag.
The newest version!
package com.bugsnag.gradle.android
import com.android.build.api.artifact.SingleArtifact
import com.android.build.api.variant.AndroidComponentsExtension
import com.android.build.api.variant.ApplicationVariant
import com.android.build.api.variant.CanMinifyCode
import com.android.build.api.variant.Variant
import com.bugsnag.gradle.capitalise
import com.bugsnag.gradle.toTaskName
import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.file.RegularFile
import org.gradle.api.plugins.BasePlugin
import org.gradle.api.provider.Provider
internal data class AndroidVariant(
val name: String,
val manifestFile: Provider,
val bundleFile: Provider,
val nativeSymbols: Provider>?,
/**
* The provider pointing to the obfuscation mapping file (typically `mapping.txt`) or `null` if minification is
* not enabled for this variant.
*/
val obfuscationMappingFile: Provider?,
val versionName: Provider?,
val versionCode: Provider?,
val applicationId: Provider?,
val dexClassesDir: Provider?
) {
val bundleTaskName: String
get() = name.toTaskName(prefix = "bundle")
}
internal fun Project.isMinifyEnabledFor(variant: Variant): Boolean {
return variant is CanMinifyCode && variant.isMinifyEnabled || hasDexguardPlugin()
}
internal fun Project.onAndroidVariant(consumer: (variant: AndroidVariant) -> Unit) {
try {
project.plugins.withType(BasePlugin::class.java) {
collectVariants(consumer)
}
} catch (ex: NoClassDefFoundError) {
// ignore these - AGP is not available in this Project
}
}
private fun Project.collectVariants(consumer: (variant: AndroidVariant) -> Unit) {
try {
val androidExtension = extensions.findByType(AndroidComponentsExtension::class.java)
androidExtension?.onVariants { variant: Variant ->
when (variant) {
is ApplicationVariant -> variant.outputs.onEach { output ->
if (output.enabled.get()) {
consumer(
AndroidVariant(
variant.name,
variant.artifacts.get(SingleArtifact.MERGED_MANIFEST),
variant.artifacts.get(SingleArtifact.BUNDLE),
getNativeSymbolDirs(variant),
variant.artifacts
.get(SingleArtifact.OBFUSCATION_MAPPING_FILE)
.takeIf { isMinifyEnabledFor(variant) },
output.versionName,
output.versionCode,
variant.applicationId,
getDexFiles(variant)
)
)
}
}
else -> consumer(
AndroidVariant(
variant.name,
variant.artifacts.get(SingleArtifact.MERGED_MANIFEST),
variant.artifacts.get(SingleArtifact.BUNDLE),
getNativeSymbolDirs(variant),
variant.artifacts
.get(SingleArtifact.OBFUSCATION_MAPPING_FILE)
.takeIf { isMinifyEnabledFor(variant) },
null,
null,
null,
getDexFiles(variant)
)
)
}
}
} catch (ex: NoClassDefFoundError) {
// ignore these - AGP is not available in this Project
}
}
private fun Project.getNativeSymbolDirs(variant: Variant): Provider>? {
if (variant.externalNativeBuild == null) {
return null
}
return project.layout.buildDirectory.map {
listOf(it.dir("intermediates/merged_native_libs/${variant.name}/out/lib"))
}
}
private fun Project.getDexFiles(variant: Variant): Provider {
return if (isMinifyEnabledFor(variant)) {
layout.buildDirectory.dir("intermediates/dex/${variant.name}/minify${variant.name.capitalise()}WithR8/")
} else {
layout.buildDirectory.dir("intermediates/dex/${variant.name}/mergeExtDex${variant.name.capitalise()}/")
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy