Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeSharedObjectFilesTask
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeFileToBase64Task

plugins {
id("java")
Expand All @@ -8,13 +8,13 @@ plugins {

def failBuildOnUploadErrors = (project.findProperty("failBuildOnUploadErrors") ?: "true").toBoolean()

project.tasks.register("testTask", EncodeSharedObjectFilesTask) { task ->
project.tasks.register("testTask", EncodeFileToBase64Task) { task ->
integrationTest.configureEmbraceTask(task)
task.failBuildOnUploadErrors.set(failBuildOnUploadErrors)
task.architecturesToHashedSharedObjectFilesMapJson.set(
task.inputFile.set(
project.layout.projectDirectory.file("architecturesMap.json")
)
task.encodedSharedObjectFilesMap.set(
task.outputFile.set(
project.layout.buildDirectory.file("encoded_map.txt")
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import org.junit.Assert.assertEquals
import org.junit.Rule
import org.junit.Test

class EncodeSharedObjectFilesTaskIntegrationTest {
class EncodeFileToBase64TaskIntegrationTest {

@Rule
@JvmField
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.android.build.api.instrumentation.FramesComputationMode
import com.android.build.api.instrumentation.InstrumentationScope
import io.embrace.android.gradle.plugin.gradle.nullSafeMap
import io.embrace.android.gradle.plugin.gradle.tryGetTaskProvider
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeSharedObjectFilesTask
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeFileToBase64Task
import io.embrace.android.gradle.plugin.tasks.registration.EmbraceTaskRegistration
import io.embrace.android.gradle.plugin.tasks.registration.RegistrationParams
import io.embrace.android.gradle.plugin.util.capitalizedString
Expand All @@ -26,7 +26,6 @@ class AsmTaskRegistration : EmbraceTaskRegistration {
variantConfigs.first { it.variantName == variant.name }
}
)
// TODO: why are we passing disabled to ASM, if we could just not use transformClassesWith if behavior is disabled?
params.disabled.set(
project.provider {
behavior.isPluginDisabledForVariant(variant.name) || behavior.isInstrumentationDisabledForVariant(variant.name)
Expand All @@ -43,20 +42,20 @@ class AsmTaskRegistration : EmbraceTaskRegistration {

project.afterEvaluate {
// Find the Asm transformation task by name and make it depend on encodeSharedObjectFilesTask
val encodeSharedObjectFilesTask = project.tryGetTaskProvider(
"${EncodeSharedObjectFilesTask.NAME}${data.name.capitalizedString()}",
EncodeSharedObjectFilesTask::class.java
val encodeFileToBase64Task = project.tryGetTaskProvider(
"${EncodeFileToBase64Task.NAME}${data.name.capitalizedString()}",
EncodeFileToBase64Task::class.java
) ?: return@afterEvaluate

val asmTransformationTask = project.tryGetTaskProvider(
"transform${variant.name.capitalizedString()}ClassesWithAsm"
) ?: error("Unable to find ASM transformation task for variant ${variant.name}.")

asmTransformationTask.configure { it.dependsOn(encodeSharedObjectFilesTask) }
asmTransformationTask.configure { it.dependsOn(encodeFileToBase64Task) }

params.encodedSharedObjectFilesMap.set(
encodeSharedObjectFilesTask.nullSafeMap { task ->
task.encodedSharedObjectFilesMap.asFile.orNull?.let { file ->
encodeFileToBase64Task.nullSafeMap { encodeTask ->
encodeTask.outputFile.asFile.orNull?.let { file ->
file.takeIf { it.exists() }
?.bufferedReader()
?.use { it.readText() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package io.embrace.android.gradle.plugin.tasks.il2cpp

import io.embrace.android.gradle.plugin.gradle.tryGetTaskProvider
import io.embrace.android.gradle.plugin.model.AndroidCompactedVariantData
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeSharedObjectFilesTask
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeFileToBase64Task
import io.embrace.android.gradle.plugin.util.capitalizedString
import org.gradle.api.Project
import org.gradle.api.Task
Expand All @@ -14,7 +14,7 @@ import org.gradle.api.tasks.TaskProvider
*/
class Il2CppTaskSource {
fun fetchTask(project: Project, variant: AndroidCompactedVariantData): TaskProvider<Task>? {
val taskName = "${EncodeSharedObjectFilesTask.NAME}${variant.name.capitalizedString()}"
val taskName = "${EncodeFileToBase64Task.NAME}${variant.name.capitalizedString()}"
return project.tryGetTaskProvider(taskName)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,26 @@ import java.util.Base64
import javax.inject.Inject

/**
* Task that encodes in Base64 a map of architectures to hashed shared object files. It reads the map from a JSON file and outputs a base64
* encoded string of the map. This encoded string will be then used by the Embrace SDK for NDK crash reporting.
* Task that reads the contents of an input file, encodes them to Base64, and stores them in an output file.
*
* Input: architecturesToHashedSharedObjectFilesMapJson, a JSON file containing the map of architectures to hashed shared object files.
* Output: encodedSharedObjectFilesMap, a file containing the base64 encoded map.
* This task is currently used to encode a JSON file containing a map of architectures
* to hashed shared object files. This encoded string is then used by the Embrace SDK for NDK crash reporting.
*
* Input: inputFile, the file to be encoded
* Output: outputFile, the file containing the Base64 encoded content
*/
abstract class EncodeSharedObjectFilesTask @Inject constructor(
abstract class EncodeFileToBase64Task @Inject constructor(
objectFactory: ObjectFactory,
) : EmbraceTaskImpl(objectFactory) {

private val logger = Logger(EncodeSharedObjectFilesTask::class.java)
private val logger = Logger(EncodeFileToBase64Task::class.java)

@SkipWhenEmpty
@get:InputFile
val architecturesToHashedSharedObjectFilesMapJson: RegularFileProperty = objectFactory.fileProperty()
val inputFile: RegularFileProperty = objectFactory.fileProperty()

@get:OutputFile
val encodedSharedObjectFilesMap: RegularFileProperty = objectFactory.fileProperty()
val outputFile: RegularFileProperty = objectFactory.fileProperty()

@get:Input
val failBuildOnUploadErrors: Property<Boolean> = objectFactory.property(Boolean::class.java)
Expand All @@ -40,9 +42,11 @@ abstract class EncodeSharedObjectFilesTask @Inject constructor(
@TaskAction
fun onRun() {
try {
val jsonContent = architecturesToHashedSharedObjectFilesMapJson.get().asFile.bufferedReader().use { it.readText() }
val encodedContent = Base64.getEncoder().encodeToString(jsonContent.toByteArray())
encodedSharedObjectFilesMap.get().asFile.bufferedWriter().use { it.write(encodedContent) }
inputFile.get().asFile.inputStream().use { inputStream ->
Base64.getEncoder().wrap(outputFile.get().asFile.outputStream()).use { encoder ->
inputStream.copyTo(encoder)
}
}
} catch (exception: Exception) {
logger.error("An error has occurred while encoding shared object files map", exception)
if (failBuildOnUploadErrors.get()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,20 +125,20 @@ class NdkUploadTasksRegistration(
}

project.registerTask(
EncodeSharedObjectFilesTask.NAME,
EncodeSharedObjectFilesTask::class.java,
EncodeFileToBase64Task.NAME,
EncodeFileToBase64Task::class.java,
data
) { task ->
// TODO: Check why this is needed for 7.5.1. For Gradle 8+ Gradle detects automatically when the other tasks aren't executed
task.onlyIf { task.architecturesToHashedSharedObjectFilesMapJson.asFile.get().exists() }
task.onlyIf { task.inputFile.asFile.get().exists() }

task.architecturesToHashedSharedObjectFilesMapJson.set(
task.inputFile.set(
hashTaskProvider.flatMap { it.architecturesToHashedSharedObjectFilesMap }
)

task.failBuildOnUploadErrors.set(behavior.failBuildOnUploadErrors)

task.encodedSharedObjectFilesMap.set(
task.outputFile.set(
project.layout.buildDirectory.file("intermediates/embrace/ndk/${data.name}/encoded_map.txt")
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import io.embrace.android.gradle.plugin.instrumentation.config.model.UnityConfig
import io.embrace.android.gradle.plugin.instrumentation.config.model.VariantConfig
import io.embrace.android.gradle.plugin.model.AndroidCompactedVariantData
import io.embrace.android.gradle.plugin.tasks.ndk.CompressSharedObjectFilesTask
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeSharedObjectFilesTask
import io.embrace.android.gradle.plugin.tasks.ndk.EncodeFileToBase64Task
import io.embrace.android.gradle.plugin.tasks.ndk.HashSharedObjectFilesTask
import io.embrace.android.gradle.plugin.tasks.ndk.NdkUploadTasksRegistration
import io.embrace.android.gradle.plugin.tasks.ndk.UploadSharedObjectFilesTask
Expand Down Expand Up @@ -115,7 +115,7 @@ class NdkUploadTasksRegistrationTest {
assertTaskNotRegistered(CompressSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskNotRegistered(HashSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskNotRegistered(UploadSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskNotRegistered(EncodeSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskNotRegistered(EncodeFileToBase64Task.NAME, testAndroidCompactedVariantData.name)
}

@Test
Expand Down Expand Up @@ -145,8 +145,8 @@ class NdkUploadTasksRegistrationTest {

// The injection task should not run
val encodingTask = project.tasks.findByName(
"${EncodeSharedObjectFilesTask.NAME}${testAndroidCompactedVariantData.name.capitalizedString()}"
) as EncodeSharedObjectFilesTask
"${EncodeFileToBase64Task.NAME}${testAndroidCompactedVariantData.name.capitalizedString()}"
) as EncodeFileToBase64Task
assertFalse(encodingTask.onlyIf.isSatisfiedBy(encodingTask))
}

Expand Down Expand Up @@ -184,7 +184,7 @@ class NdkUploadTasksRegistrationTest {
assertTaskRegistered(CompressSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskRegistered(HashSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskRegistered(UploadSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskRegistered(EncodeSharedObjectFilesTask.NAME, testAndroidCompactedVariantData.name)
assertTaskRegistered(EncodeFileToBase64Task.NAME, testAndroidCompactedVariantData.name)
}

// TODO: Do all Unity projects have a mergeNativeLibs task?
Expand Down
Loading