diff --git a/CHANGELOG.md b/CHANGELOG.md
index c36cce1f..cb8b49e3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@
* Fix FileAlreadyExistsException errors when building ReactNative projects with Hermes
[#482](https://github.com/bugsnag/bugsnag-android-gradle-plugin/pull/482)
+* Support using objcopy instead of objdump to extract native symbols (when supported by the current NDK).
+ [#484](https://github.com/bugsnag/bugsnag-android-gradle-plugin/pull/484)
## 7.3.1 (2022-10-05)
diff --git a/detekt-baseline.xml b/detekt-baseline.xml
index 44c65c55..6b6325ec 100644
--- a/detekt-baseline.xml
+++ b/detekt-baseline.xml
@@ -4,22 +4,24 @@
ComplexCondition:AndroidManifestParser.kt$AndroidManifestParser$apiKey == null || "" == apiKey || versionCode == null || buildUuid == null || versionName == null || applicationId == null
ComplexCondition:BugsnagPlugin.kt$BugsnagPlugin$!jvmMinificationEnabled && !ndkEnabled && !unityEnabled && !reactNativeEnabled
- LongParameterList:BugsnagGenerateNdkSoMappingTask.kt$BugsnagGenerateNdkSoMappingTask.Companion$( project: Project, variant: BaseVariant, output: ApkVariantOutput, objdumpPaths: Provider<Map<String, String>>, searchPaths: List<File>, soMappingOutputPath: String )
+ LongParameterList:BugsnagGenerateNdkSoMappingTask.kt$BugsnagGenerateNdkSoMappingTask.Companion$( project: Project, variant: BaseVariant, output: ApkVariantOutput, ndk: NdkToolchain, searchPaths: List<File>, soMappingOutputPath: String )
+ LongParameterList:BugsnagUploadSoSymTask.kt$BugsnagUploadSoSymTask.Companion$( project: Project, variant: BaseVariantOutput, ndkToolchain: NdkToolchain, uploadType: UploadType, generateTaskProvider: TaskProvider<out AbstractSoMappingTask>, httpClientHelperProvider: Provider<out BugsnagHttpClientHelper>, ndkUploadClientProvider: Provider<out UploadRequestClient>, )
MagicNumber:BugsnagPluginExtension.kt$BugsnagPluginExtension$60000
MagicNumber:BugsnagReleasesTask.kt$BugsnagReleasesTask$200
MagicNumber:MappingFileProvider.kt$9
- ReturnCount:BugsnagPlugin.kt$BugsnagPlugin$ @Suppress("SENSELESS_COMPARISON") internal fun isUnityLibraryUploadEnabled( bugsnag: BugsnagPluginExtension, android: BaseExtension ): Boolean
+ MaxLineLength:NdkToolchain.kt$NdkToolchain.Companion$/* * SdkComponents.ndkDirectory * https://developer.android.com/reference/tools/gradle-api/7.2/com/android/build/api/dsl/SdkComponents#ndkDirectory() * sometimes fails to resolve when ndkPath is not defined (Cannot query the value of this property because it has * no value available.). This means that even `map` and `isPresent` will break. * * So we also fall back use the old BaseExtension if it appears broken */
+ ReturnCount:BugsnagGenerateUnitySoMappingTask.kt$BugsnagGenerateUnitySoMappingTask.Companion$ @Suppress("SENSELESS_COMPARISON") internal fun isUnityLibraryUploadEnabled( bugsnag: BugsnagPluginExtension, android: BaseExtension ): Boolean
ReturnCount:BugsnagPlugin.kt$BugsnagPlugin$ private fun registerUploadSourceMapTask( project: Project, variant: BaseVariant, output: BaseVariantOutput, bugsnag: BugsnagPluginExtension, manifestInfoProvider: Provider<RegularFile> ): TaskProvider<out BugsnagUploadJsSourceMapTask>?
ReturnCount:ManifestUuidTaskV2Compat.kt$internal fun createManifestUpdateTask( bugsnag: BugsnagPluginExtension, project: Project, variantName: String, variantOutput: VariantOutput ): TaskProvider<BugsnagManifestUuidTask>?
- ReturnCount:SharedObjectMappingFileFactory.kt$SharedObjectMappingFileFactory$ fun generateSoMappingFile(project: Project, params: Params): File?
SpreadOperator:DexguardCompat.kt$(buildDir, *path, variant.dirName, outputDir, "mapping.txt")
+ SwallowedException:NdkToolchain.kt$NdkToolchain.Companion$catch (e: Exception) { null }
+ SwallowedException:NdkToolchain.kt$NdkToolchain.Companion$catch (e: Exception) { return@provider extensions.getByType(BaseExtension::class.java).ndkDirectory.absoluteFile }
+ TooGenericExceptionCaught:AbstractSoMappingTask.kt$AbstractSoMappingTask$e: Exception
TooGenericExceptionCaught:BugsnagHttpClientHelper.kt$exc: Throwable
TooGenericExceptionCaught:BugsnagMultiPartUploadRequest.kt$BugsnagMultiPartUploadRequest$exc: Throwable
TooGenericExceptionCaught:BugsnagReleasesTask.kt$BugsnagReleasesTask$exc: Throwable
TooGenericExceptionCaught:MappingFileProvider.kt$exc: Throwable
- TooGenericExceptionCaught:SharedObjectMappingFileFactory.kt$SharedObjectMappingFileFactory$e: Exception
- TooGenericExceptionCaught:SharedObjectMappingFileFactory.kt$SharedObjectMappingFileFactory$ex: Throwable
+ TooGenericExceptionCaught:NdkToolchain.kt$NdkToolchain.Companion$e: Exception
TooManyFunctions:BugsnagPlugin.kt$BugsnagPlugin : Plugin
- UnusedPrivateMember:BugsnagPlugin.kt$BugsnagPlugin$private fun BaseVariantOutput.findVersionCode(): Int
diff --git a/features/fixtures/config/ndk/objcopy.gradle b/features/fixtures/config/ndk/objcopy.gradle
new file mode 100644
index 00000000..e62bfeca
--- /dev/null
+++ b/features/fixtures/config/ndk/objcopy.gradle
@@ -0,0 +1,6 @@
+dependencies {
+ implementation 'com.bugsnag:bugsnag-android:5.26.0'
+}
+
+android.ndkVersion = "23.0.7599858"
+bugsnag.useLegacyNdkSymbolUpload = false
diff --git a/features/fixtures/config/ndk/old_sdk_upload_failure.gradle b/features/fixtures/config/ndk/old_sdk_upload_failure.gradle
new file mode 100644
index 00000000..55dee428
--- /dev/null
+++ b/features/fixtures/config/ndk/old_sdk_upload_failure.gradle
@@ -0,0 +1,6 @@
+dependencies {
+ implementation 'com.bugsnag:bugsnag-android:5.9.4'
+}
+
+android.ndkVersion = "23.0.7599858"
+bugsnag.useLegacyNdkSymbolUpload = true
diff --git a/features/fixtures/config/ndk/standard.gradle b/features/fixtures/config/ndk/standard.gradle
new file mode 100644
index 00000000..10049421
--- /dev/null
+++ b/features/fixtures/config/ndk/standard.gradle
@@ -0,0 +1,3 @@
+dependencies {
+ implementation 'com.bugsnag:bugsnag-android:5.9.4'
+}
diff --git a/features/fixtures/ndkapp/app/build.gradle b/features/fixtures/ndkapp/app/build.gradle
index 6df04b51..38be7a6b 100644
--- a/features/fixtures/ndkapp/app/build.gradle
+++ b/features/fixtures/ndkapp/app/build.gradle
@@ -66,10 +66,6 @@ android {
}
}
-dependencies {
- implementation 'com.bugsnag:bugsnag-android:5.9.4'
-}
-
bugsnag {
uploadNdkMappings = true
endpoint = "http://localhost:9339/builds"
@@ -95,3 +91,6 @@ bugsnag {
]
}
}
+
+def ndkConfig = System.env.BUGSNAG_NDK_CONFIG ?: "standard"
+apply from: "../../config/ndk/${ndkConfig}.gradle"
diff --git a/features/fixtures/rn-monorepo/abc/android/app/src/main/AndroidManifest.xml b/features/fixtures/rn-monorepo/abc/android/app/src/main/AndroidManifest.xml
index ad008b47..191aba6e 100644
--- a/features/fixtures/rn-monorepo/abc/android/app/src/main/AndroidManifest.xml
+++ b/features/fixtures/rn-monorepo/abc/android/app/src/main/AndroidManifest.xml
@@ -13,6 +13,7 @@
diff --git a/features/fixtures/rn-monorepo/abc/android/build.gradle b/features/fixtures/rn-monorepo/abc/android/build.gradle
index 87ebf1fc..9b8c8841 100644
--- a/features/fixtures/rn-monorepo/abc/android/build.gradle
+++ b/features/fixtures/rn-monorepo/abc/android/build.gradle
@@ -4,8 +4,8 @@ buildscript {
ext {
buildToolsVersion = "30.0.2"
minSdkVersion = 21
- compileSdkVersion = 30
- targetSdkVersion = 30
+ compileSdkVersion = 31
+ targetSdkVersion = 31
}
repositories {
mavenCentral()
@@ -26,9 +26,20 @@ allprojects {
repositories {
mavenCentral()
mavenLocal()
- maven {
- // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
- url("$rootDir/../../node_modules/react-native/android")
+ // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
+ exclusiveContent {
+ // We get React Native's Android binaries exclusively through npm,
+ // from a local Maven repo inside node_modules/react-native/.
+ // (The use of exclusiveContent prevents looking elsewhere like Maven Central
+ // and potentially getting a wrong version.)
+ filter {
+ includeGroup "com.facebook.react"
+ }
+ forRepository {
+ maven {
+ url("$rootDir/../../node_modules/react-native/android")
+ }
+ }
}
maven {
// Android JSC is installed from npm
diff --git a/features/fixtures/rn-monorepo/xyz/android/app/src/main/AndroidManifest.xml b/features/fixtures/rn-monorepo/xyz/android/app/src/main/AndroidManifest.xml
index 93dd554d..e5647203 100644
--- a/features/fixtures/rn-monorepo/xyz/android/app/src/main/AndroidManifest.xml
+++ b/features/fixtures/rn-monorepo/xyz/android/app/src/main/AndroidManifest.xml
@@ -13,6 +13,7 @@
diff --git a/features/fixtures/rn-monorepo/xyz/android/build.gradle b/features/fixtures/rn-monorepo/xyz/android/build.gradle
index ed5a5684..8f622085 100644
--- a/features/fixtures/rn-monorepo/xyz/android/build.gradle
+++ b/features/fixtures/rn-monorepo/xyz/android/build.gradle
@@ -4,8 +4,8 @@ buildscript {
ext {
buildToolsVersion = "29.0.2"
minSdkVersion = 16
- compileSdkVersion = 29
- targetSdkVersion = 29
+ compileSdkVersion = 31
+ targetSdkVersion = 31
}
repositories {
google()
@@ -21,9 +21,20 @@ buildscript {
allprojects {
repositories {
mavenLocal()
- maven {
- // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
- url("$rootDir/../node_modules/react-native/android")
+ // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
+ exclusiveContent {
+ // We get React Native's Android binaries exclusively through npm,
+ // from a local Maven repo inside node_modules/react-native/.
+ // (The use of exclusiveContent prevents looking elsewhere like Maven Central
+ // and potentially getting a wrong version.)
+ filter {
+ includeGroup "com.facebook.react"
+ }
+ forRepository {
+ maven {
+ url("$rootDir/../node_modules/react-native/android")
+ }
+ }
}
maven {
// Android JSC is installed from npm
diff --git a/features/fixtures/rn065/android/app/src/main/AndroidManifest.xml b/features/fixtures/rn065/android/app/src/main/AndroidManifest.xml
index afcb33f4..78032638 100644
--- a/features/fixtures/rn065/android/app/src/main/AndroidManifest.xml
+++ b/features/fixtures/rn065/android/app/src/main/AndroidManifest.xml
@@ -13,6 +13,7 @@
diff --git a/features/fixtures/rn065/android/build.gradle b/features/fixtures/rn065/android/build.gradle
index d1afbe73..cda34a95 100644
--- a/features/fixtures/rn065/android/build.gradle
+++ b/features/fixtures/rn065/android/build.gradle
@@ -4,8 +4,8 @@ buildscript {
ext {
buildToolsVersion = "30.0.2"
minSdkVersion = 21
- compileSdkVersion = 30
- targetSdkVersion = 30
+ compileSdkVersion = 31
+ targetSdkVersion = 31
ndkVersion = "20.1.5948944"
}
repositories {
@@ -29,9 +29,20 @@ allprojects {
repositories {
mavenCentral()
mavenLocal()
- maven {
- // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
- url("$rootDir/../node_modules/react-native/android")
+ // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
+ exclusiveContent {
+ // We get React Native's Android binaries exclusively through npm,
+ // from a local Maven repo inside node_modules/react-native/.
+ // (The use of exclusiveContent prevents looking elsewhere like Maven Central
+ // and potentially getting a wrong version.)
+ filter {
+ includeGroup "com.facebook.react"
+ }
+ forRepository {
+ maven {
+ url("$rootDir/../node_modules/react-native/android")
+ }
+ }
}
maven {
// Android JSC is installed from npm
diff --git a/features/ndk_app.feature b/features/ndk_app.feature
index edfaff0d..29a38ce0 100644
--- a/features/ndk_app.feature
+++ b/features/ndk_app.feature
@@ -110,3 +110,27 @@ Scenario: Mapping files uploaded for custom sharedObjectPaths
And 1 requests are valid for the android mapping API and match the following:
| appId |
| com.bugsnag.android.ndkapp |
+
+Scenario: Mapping fails when using obcopy and an incompatible SDK
+ When I build the NDK app using the "old_sdk_upload_failure" config
+ And I wait for 3 seconds
+ Then I should receive no requests
+
+Scenario: objcopy is used to produce symbols when configured
+ When I build the NDK app using the "objcopy" config
+ And I wait to receive 6 builds
+
+ Then 1 requests are valid for the build API and match the following:
+ | appVersionCode | appVersion | buildTool |
+ | 1 | 1.0 | gradle-android |
+
+ And 4 requests are valid for the android so symbol mapping API and match the following:
+ | projectRoot | sharedObjectName |
+ | /\S+/ | libnative-lib.so |
+ | /\S+/ | libnative-lib.so |
+ | /\S+/ | libnative-lib.so |
+ | /\S+/ | libnative-lib.so |
+
+ And 1 requests are valid for the android mapping API and match the following:
+ | appId |
+ | com.bugsnag.android.ndkapp |
diff --git a/features/steps/gradle_plugin_steps.rb b/features/steps/gradle_plugin_steps.rb
index ed6c2b97..5098d0bf 100644
--- a/features/steps/gradle_plugin_steps.rb
+++ b/features/steps/gradle_plugin_steps.rb
@@ -33,6 +33,13 @@
}
end
+When("I build the NDK app using the {string} config") do |config|
+ Maze::Runner.environment['BUGSNAG_NDK_CONFIG'] = config
+ steps %Q{
+ And I run the script "features/scripts/build_ndk_app.sh" synchronously
+}
+end
+
When("I set the fixture JVM arguments to {string}") do |jvm_args|
steps %Q{
When I set environment variable "CUSTOM_JVM_ARGS" to "#{jvm_args}"
@@ -59,7 +66,7 @@ def setup_and_run_script(module_config, bugsnag_config, script_path, variant = n
end
When("I build the failing {string} on AGP {string} using the {string} bugsnag config") do |module_config, agp_version, bugsnag_config|
-steps %Q{
+ steps %Q{
When I set environment variable "AGP_VERSION" to "#{agp_version}"
And I build the failing "#{module_config}" using the "#{bugsnag_config}" bugsnag config
}
@@ -105,6 +112,16 @@ def setup_and_run_script(module_config, bugsnag_config, script_path, variant = n
end
end
+Then('{int} requests are valid for the android so symbol mapping API and match the following:') do |request_count, data_table|
+ requests = get_requests_with_field('build', 'soFile')
+ assert_equal(request_count, requests.length, 'Wrong number of android .so symbol mapping API requests')
+ Maze::Assertions::RequestSetAssertions.assert_requests_match requests, data_table
+
+ requests.each do |request|
+ valid_android_so_symbol_mapping_api?(request[:body])
+ end
+end
+
Then('{int} requests are valid for the JS source map API and match the following:') do |request_count, data_table|
requests = get_requests_with_field('build', 'sourceMap')
assert_equal(request_count, requests.length, 'Wrong number of JS source map API requests')
@@ -167,16 +184,32 @@ def valid_build_api?(request_body)
def valid_android_mapping_api?(request_body)
valid_mapping_api?(request_body)
+ assert_not_nil(request_body['buildUUID'])
assert_not_nil(request_body['proguard'])
end
def valid_android_ndk_mapping_api?(request_body)
valid_mapping_api?(request_body)
+ assert_not_nil(request_body['buildUUID'])
assert_not_nil(request_body['soSymbolFile'])
end
+def valid_android_so_symbol_mapping_api?(request_body)
+ valid_mapping_api?(request_body)
+ assert_not_nil(request_body['soFile'])
+
+ gzipped_part = request_body['soFile']
+ archive = Zlib::GzipReader.new(StringIO.new(gzipped_part))
+
+ # check that decompressed this is a valid ELF file:
+ # https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
+ header = archive.read(4)
+ assert_equal("\x7f\x45\x4c\x46", header, 'not a valid ELF file')
+end
+
def valid_android_unity_ndk_mapping_api?(request_body)
valid_mapping_api?(request_body)
+ assert_not_nil(request_body['buildUUID'])
assert_not_nil(request_body['soSymbolTableFile'])
end
@@ -184,7 +217,6 @@ def valid_mapping_api?(request_body)
assert_equal($api_key, request_body['apiKey'])
assert_not_nil(request_body['appId'])
assert_not_nil(request_body['versionCode'])
- assert_not_nil(request_body['buildUUID'])
assert_not_nil(request_body['versionName'])
end
diff --git a/src/main/kotlin/com/bugsnag/android/gradle/AndroidManifestInfoReceiver.kt b/src/main/kotlin/com/bugsnag/android/gradle/AndroidManifestInfoReceiver.kt
index 39b38108..2f1812a2 100644
--- a/src/main/kotlin/com/bugsnag/android/gradle/AndroidManifestInfoReceiver.kt
+++ b/src/main/kotlin/com/bugsnag/android/gradle/AndroidManifestInfoReceiver.kt
@@ -1,10 +1,10 @@
package com.bugsnag.android.gradle
import org.gradle.api.file.RegularFileProperty
-import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFile
interface AndroidManifestInfoReceiver {
- @get:Input
+ @get:InputFile
val manifestInfo: RegularFileProperty
}
diff --git a/src/main/kotlin/com/bugsnag/android/gradle/BugsnagFileUploadTask.kt b/src/main/kotlin/com/bugsnag/android/gradle/BugsnagFileUploadTask.kt
index 04baf550..b5dc687f 100644
--- a/src/main/kotlin/com/bugsnag/android/gradle/BugsnagFileUploadTask.kt
+++ b/src/main/kotlin/com/bugsnag/android/gradle/BugsnagFileUploadTask.kt
@@ -2,13 +2,26 @@ package com.bugsnag.android.gradle
import com.bugsnag.android.gradle.internal.BugsnagHttpClientHelper
import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.Internal
interface BugsnagFileUploadTask {
+ @get:Input
val failOnUploadError: Property
+
+ @get:Input
val overwrite: Property
+
+ @get:Input
val endpoint: Property
+
+ @get:Input
val retryCount: Property
+
+ @get:Input
val timeoutMillis: Property
+
+ @get:Internal
val httpClientHelper: Property
fun configureWith(bugsnag: BugsnagPluginExtension) {
diff --git a/src/main/kotlin/com/bugsnag/android/gradle/BugsnagGenerateNdkSoMappingTask.kt b/src/main/kotlin/com/bugsnag/android/gradle/BugsnagGenerateNdkSoMappingTask.kt
index 4147a8fb..2f3e6360 100644
--- a/src/main/kotlin/com/bugsnag/android/gradle/BugsnagGenerateNdkSoMappingTask.kt
+++ b/src/main/kotlin/com/bugsnag/android/gradle/BugsnagGenerateNdkSoMappingTask.kt
@@ -3,28 +3,22 @@ package com.bugsnag.android.gradle
import com.android.build.VariantOutput
import com.android.build.gradle.api.ApkVariantOutput
import com.android.build.gradle.api.BaseVariant
+import com.bugsnag.android.gradle.internal.AbstractSoMappingTask
import com.bugsnag.android.gradle.internal.ExternalNativeBuildTaskUtil
+import com.bugsnag.android.gradle.internal.NdkToolchain
import com.bugsnag.android.gradle.internal.VariantTaskCompanion
import com.bugsnag.android.gradle.internal.clearDir
import com.bugsnag.android.gradle.internal.dependsOn
import com.bugsnag.android.gradle.internal.forBuildOutput
-import com.bugsnag.android.gradle.internal.mapProperty
import com.bugsnag.android.gradle.internal.property
import com.bugsnag.android.gradle.internal.register
-import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileCollection
-import org.gradle.api.file.DirectoryProperty
-import org.gradle.api.file.RegularFileProperty
import org.gradle.api.model.ObjectFactory
-import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Property
-import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Input
-import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Optional
-import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskProvider
import java.io.File
@@ -33,43 +27,32 @@ import javax.inject.Inject
/**
* Task that generates NDK shared object mapping files for upload to Bugsnag.
*/
-open class BugsnagGenerateNdkSoMappingTask @Inject constructor(
+internal abstract class BugsnagGenerateNdkSoMappingTask @Inject constructor(
objects: ObjectFactory
-) : DefaultTask(), AndroidManifestInfoReceiver {
+) : AbstractSoMappingTask() {
init {
group = BugsnagPlugin.GROUP_NAME
description = "Generates NDK mapping files for upload to Bugsnag"
}
- @get:InputFile
- override val manifestInfo: RegularFileProperty = objects.fileProperty()
-
@get:Input
@get:Optional
val abi: Property = objects.property()
- @get:OutputDirectory
- val intermediateOutputDir: DirectoryProperty = objects.directoryProperty()
-
- @get:Input
- val objDumpPaths: MapProperty = objects.mapProperty()
-
@get:InputFiles
val searchDirectories: ConfigurableFileCollection = objects.fileCollection()
@TaskAction
fun generateMappingFiles() {
logger.lifecycle("Generating NDK mapping files")
- val searchDirs = searchDirectories.files.toList()
- val files = findSharedObjectMappingFiles(searchDirs)
+ val files = findSharedObjectMappingFiles()
processFiles(files)
}
- private fun findSharedObjectMappingFiles(
- searchDirectories: List
- ): Collection {
- return searchDirectories.flatMap(this::findSharedObjectFiles)
+ private fun findSharedObjectMappingFiles(): Collection {
+ return searchDirectories
+ .flatMap(this::findSharedObjectFiles)
.toSortedSet(compareBy { it.absolutePath })
}
@@ -97,18 +80,12 @@ open class BugsnagGenerateNdkSoMappingTask @Inject constructor(
private fun processFiles(files: Collection) {
logger.info("Bugsnag: Found shared object files for upload: $files")
- val outputDir = intermediateOutputDir.get().asFile
- outputDir.clearDir()
+ outputDirectory.get().asFile.clearDir()
files.forEach { sharedObjectFile ->
val arch = sharedObjectFile.parentFile.name
- val params = SharedObjectMappingFileFactory.Params(
- sharedObjectFile,
- requireNotNull(Abi.findByName(arch)),
- objDumpPaths.get(),
- outputDir
- )
- val outputFile = SharedObjectMappingFileFactory.generateSoMappingFile(project, params)
+ val abi = requireNotNull(Abi.findByName(arch)) { "unknown abi: $arch" }
+ val outputFile = generateMappingFile(sharedObjectFile, abi)
if (outputFile != null) {
logger.info("Bugsnag: Created symbol file for $arch at $outputFile")
}
@@ -127,14 +104,13 @@ open class BugsnagGenerateNdkSoMappingTask @Inject constructor(
project: Project,
variant: BaseVariant,
output: ApkVariantOutput,
- objdumpPaths: Provider