com.bugsnag.android.gradle.BugsnagUploadProguardTask.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bugsnag-android-gradle-plugin Show documentation
Show all versions of bugsnag-android-gradle-plugin Show documentation
Gradle plugin to automatically upload ProGuard mapping files to Bugsnag.
package com.bugsnag.android.gradle
import com.bugsnag.android.gradle.internal.BugsnagHttpClientHelper
import com.bugsnag.android.gradle.internal.UploadRequestClient
import com.bugsnag.android.gradle.internal.md5HashCode
import com.bugsnag.android.gradle.internal.property
import com.bugsnag.android.gradle.internal.register
import okhttp3.RequestBody.Companion.asRequestBody
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import javax.inject.Inject
/**
* Task to upload ProGuard mapping files to Bugsnag.
*
* Reads meta-data tags from the project's AndroidManifest.xml to extract a
* build UUID (injected by BugsnagManifestTask) and a Bugsnag API Key:
*
* https://developer.android.com/guide/topics/manifest/manifest-intro.html
* https://developer.android.com/guide/topics/manifest/meta-data-element.html
*
* This task must be called after ProGuard mapping files are generated, so
* it is usually safe to have this be the absolute last task executed during
* a build.
*/
open class BugsnagUploadProguardTask @Inject constructor(
objects: ObjectFactory
) : DefaultTask(), AndroidManifestInfoReceiver, BugsnagFileUploadTask {
init {
group = BugsnagPlugin.GROUP_NAME
description = "Uploads the mapping file to Bugsnag"
}
@get:InputFile
override val manifestInfo: RegularFileProperty = objects.fileProperty()
@get:Internal
internal val uploadRequestClient: Property = objects.property()
@get:Internal
override val httpClientHelper: Property = objects.property()
@get:InputFiles
val mappingFileProperty: RegularFileProperty = objects.fileProperty()
@get:OutputFile
val requestOutputFile: RegularFileProperty = objects.fileProperty()
@get:Input
override val failOnUploadError: Property = objects.property()
@get:Input
override val overwrite: Property = objects.property()
@get:Input
override val endpoint: Property = objects.property()
@get:Input
override val retryCount: Property = objects.property()
@get:Input
override val timeoutMillis: Property = objects.property()
@TaskAction
fun upload() {
val mappingFile = mappingFileProperty.get().asFile
// Read the API key and Build ID etc..
// Construct a basic request
val manifestInfo = parseManifestInfo()
// Send the request
val request = BugsnagMultiPartUploadRequest.from(this)
val mappingFileHash = mappingFile.md5HashCode()
val response = uploadRequestClient.get().makeRequestIfNeeded(manifestInfo, mappingFileHash) {
request.uploadMultipartEntity(retryCount.get()) { builder ->
logger.lifecycle("Bugsnag: Uploading JVM mapping file from: $mappingFile")
builder.addAndroidManifestInfo(manifestInfo)
builder.addFormDataPart("proguard", mappingFile.name, mappingFile.asRequestBody())
}
}
requestOutputFile.asFile.get().writeText(response)
}
companion object {
/**
* Registers the appropriate subtype to this [project] with the given [name] and
* [configurationAction]
*/
internal fun register(
project: Project,
name: String,
configurationAction: BugsnagUploadProguardTask.() -> Unit
): TaskProvider {
return project.tasks.register(name, configurationAction)
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy