Skip to content

Commit ff99d7d

Browse files
author
Memfault Inc.
committed
Memfault BORT SDK 5.4.2 (Build 3268598)
1 parent 7967a7b commit ff99d7d

File tree

23 files changed

+357
-164
lines changed

23 files changed

+357
-164
lines changed

.gitignore

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,36 @@
1+
# Gradle files
2+
.gradle/
3+
build/
4+
5+
# Local configuration file (sdk path, etc)
6+
local.properties
7+
8+
# Log/OS Files
9+
*.log
10+
11+
# Android Studio generated files and folders
12+
captures/
13+
.externalNativeBuild/
14+
.cxx/
15+
*.aab
16+
output-metadata.json
17+
18+
# IntelliJ
119
*.iml
2-
.gradle
3-
/local.properties
4-
/.idea/caches
5-
/.idea/libraries
6-
/.idea/modules.xml
7-
/.idea/workspace.xml
8-
/.idea/navEditor.xml
9-
/.idea/assetWizardSettings.xml
20+
.idea/
21+
misc.xml
22+
deploymentTargetDropDown.xml
23+
render.experimental.xml
24+
25+
# Google Services (e.g. APIs or Firebase)
26+
google-services.json
27+
28+
# Android Profiling
29+
*.hprof
30+
31+
# Mac
1032
.DS_Store
11-
/build
12-
/build-lite
13-
/captures
14-
.externalNativeBuild
15-
.cxx
33+
34+
# Memfault
35+
build-lite/
1636
validate-sdk-integration.log*

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
66
This project currently does not attempt to adhere to Semantic Versioning, but
77
breaking changes are avoided unless absolutely necessary.
88

9+
## v5.4.2 - August 4, 2025
10+
11+
### :construction: Fixes
12+
13+
- Fixed a bug where bugreports would not always be cleaned up due to incorrect
14+
file permissions in the Bort app.
15+
16+
### :chart_with_upwards_trend: Improvements
17+
18+
- Refactored the device config handlers into clearer interfaces and
19+
implementations.
20+
- Added several more bugreport reply broadcasts (OK_REQUESTED, OK_GENERATING,
21+
OK_GENERATED, ERROR_GENERATED_TIMEOUT).
22+
- Added optional constraints on bugreport requests through a multibind
23+
interface.
24+
925
## v5.4.1 - July 22, 2025
1026

1127
### :rocket: New Features

MemfaultDumpstateRunner/memfault_init.rc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ service memfault_dumpstatez /system/bin/dumpstate -S -d -z -q \
2424
# the source code of the program itself.
2525

2626
on post-fs-data
27-
mkdir /data/misc/MemfaultBugReports/ 0771 system system
27+
mkdir /data/misc/MemfaultBugReports/ 0777 system system
28+
chmod 0777 /data/misc/MemfaultBugReports/
2829
wait /data/misc/MemfaultBugReports/
2930

3031
service memfault_dumpstate_runner /system_ext/bin/MemfaultDumpstateRunner

MemfaultPackages/bort/src/main/java/com/memfault/bort/bugreport/PendingBugReportRequestReplying.kt renamed to MemfaultPackages/bort-shared/src/main/java/com/memfault/bort/bugreport/PendingBugReportRequestReplying.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@ private const val INTENT_ACTION_BUG_REPORT_REQUEST_REPLY = "com.memfault.intent.
99
private const val INTENT_EXTRA_BUG_REPORT_REQUEST_STATUS = "com.memfault.intent.extra.BUG_REPORT_REQUEST_STATUS"
1010

1111
enum class BugReportRequestStatus(val value: String) {
12+
OK_REQUESTED("OK_REQUESTED"),
13+
OK_GENERATING("OK_GENERATING"),
14+
OK_GENERATED("OK_GENERATED"),
1215
OK_UPLOAD_QUEUED("OK_UPLOAD_QUEUED"),
1316
ERROR_ALREADY_PENDING("ERROR_ALREADY_PENDING"),
14-
ERROR_TIMEOUT("ERROR_TIMEOUT"),
17+
ERROR_CONSTRAINTS_NOT_SATISFIED("ERROR_CONSTRAINTS_NOT_SATISFIED"),
18+
ERROR_GENERATING_TIMEOUT("ERROR_TIMEOUT"),
19+
ERROR_GENERATED_TIMEOUT("ERROR_GENERATED_TIMEOUT"),
1520
ERROR_SDK_NOT_ENABLED("ERROR_SDK_NOT_ENABLED"),
1621
ERROR_RATE_LIMITED("ERROR_RATE_LIMITED"),
1722
}

MemfaultPackages/bort-shared/src/main/java/com/memfault/bort/shared/BugReportRequest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ data class BugReportOptions(
2424
data class BugReportRequest(
2525
val options: BugReportOptions = BugReportOptions(),
2626

27-
// NOTE: periodic bug report requests have a null requestId
27+
// Note that periodic bug reports always have a null requestId, but explicit bug report requests must have a
28+
// request_id specified in the request intent.
2829
@SerialName("request_id")
2930
val requestId: String? = null,
3031

MemfaultPackages/bort/src/main/java/com/memfault/bort/BortAppModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.content.Context
55
import android.content.SharedPreferences
66
import android.content.res.Resources
77
import androidx.preference.PreferenceManager
8+
import com.memfault.bort.bugreport.StartBugReportConstraint
89
import com.memfault.bort.dagger.InjectSet
910
import com.memfault.bort.diagnostics.BortErrorsDb
1011
import com.memfault.bort.http.RetrofitInterceptor
@@ -46,6 +47,7 @@ import dagger.Provides
4647
import dagger.hilt.InstallIn
4748
import dagger.hilt.components.SingletonComponent
4849
import dagger.multibindings.IntoSet
50+
import dagger.multibindings.Multibinds
4951
import okhttp3.HttpUrl.Companion.toHttpUrl
5052
import okhttp3.OkHttpClient
5153
import retrofit2.Retrofit
@@ -66,6 +68,10 @@ import kotlin.time.toJavaDuration
6668
@Module
6769
@InstallIn(SingletonComponent::class)
6870
abstract class BortAppModule {
71+
72+
@Multibinds
73+
abstract fun startBugReportConstraints(): InjectSet<StartBugReportConstraint>
74+
6975
companion object {
7076
@Provides
7177
@Singleton

MemfaultPackages/bort/src/main/java/com/memfault/bort/BugReportRequestTimeoutTask.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class BugReportRequestTimeoutTask @Inject constructor(
2626
override fun convertAndValidateInputData(inputData: Data): String? =
2727
inputData.getString(REQUEST_ID_INPUT_DATA_KEY)
2828

29-
override suspend fun doWork(input: String?): TaskResult = TaskResult.SUCCESS.also {
29+
override suspend fun doWork(input: String?): TaskResult {
3030
val (_, request) = pendingBugReportRequestAccessor.compareAndSwap(null) { request ->
3131
if (request == null) {
3232
false
@@ -35,10 +35,9 @@ class BugReportRequestTimeoutTask @Inject constructor(
3535
}
3636
}
3737

38-
request?.broadcastReply(
39-
application,
40-
BugReportRequestStatus.ERROR_TIMEOUT,
41-
)
38+
request?.broadcastReply(application, BugReportRequestStatus.ERROR_GENERATING_TIMEOUT)
39+
40+
return TaskResult.SUCCESS
4241
}
4342

4443
companion object {

MemfaultPackages/bort/src/main/java/com/memfault/bort/bugreport/ReceiveBugReportIntentUseCase.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import android.content.Intent
55
import com.memfault.bort.BugReportRequestTimeoutTask
66
import com.memfault.bort.INTENT_EXTRA_BUGREPORT_PATH
77
import com.memfault.bort.ProcessingOptions
8+
import com.memfault.bort.bugreport.BugReportRequestStatus.ERROR_GENERATED_TIMEOUT
9+
import com.memfault.bort.bugreport.BugReportRequestStatus.OK_GENERATED
810
import com.memfault.bort.clientserver.MarMetadata.BugReportMarMetadata
911
import com.memfault.bort.fileExt.deleteSilently
1012
import com.memfault.bort.settings.SettingsProvider
@@ -37,11 +39,13 @@ class RealReceiveBugReportIntentUseCase
3739

3840
Logger.v("Got bugreport path: $bugreportPath, request: $request")
3941
bugreportPath ?: return
42+
request?.broadcastReply(application, OK_GENERATED)
4043

4144
val file = File(bugreportPath)
4245
if (!success) {
4346
Logger.w("Bug report request timed out, not uploading!")
4447
file.deleteSilently()
48+
request?.broadcastReply(application, ERROR_GENERATED_TIMEOUT)
4549
return
4650
}
4751

MemfaultPackages/bort/src/main/java/com/memfault/bort/bugreport/RequestBugReportIntentUseCase.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class RealRequestBugReportIntentUseCase
3434
Logger.e("Invalid bug report request", e)
3535
return
3636
}
37+
request.broadcastReply(application, BugReportRequestStatus.OK_REQUESTED)
3738

3839
if (!bortEnabledProvider.isEnabled()) {
3940
Logger.w("Bort not enabled; not sending request")
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.memfault.bort.bugreport
2+
3+
/**
4+
* Plug-in mechanism to control whether a bugreport should run or not. In cases where running a bugreport
5+
* during another CPU-heavy operation is not desirable because it would cause the device to stutter or lag, you can
6+
* implement a constraint via a Dagger Multibinding that'll be called before a bugreport is started.
7+
*
8+
* If any constraint is not met, `ERROR_CONSTRAINTS_NOT_SATISFIED` will be returned as the status of the request.
9+
*
10+
* ex:
11+
*
12+
* @ContributesMultibinding(SingletonComponent::class)
13+
* class DeviceIdleStartBugReportConstraint
14+
* @Inject constructor(
15+
* private val deviceStatusApi: DeviceStatusApi,
16+
* ): StartBugReportConstraint {
17+
*
18+
* override suspend fun ok(): Boolean {
19+
* return deviceStatusApi.status == DeviceStatus.IDLE
20+
* }
21+
* }
22+
*/
23+
interface StartBugReportConstraint {
24+
suspend fun ok(): Boolean
25+
}

0 commit comments

Comments
 (0)