Skip to content

Commit ebbc1b2

Browse files
authored
android: add logging to see what's spamming editPrefs (#586)
Updates tailscale/tailscale#14125 Signed-off-by: kari-ts <[email protected]>
1 parent db6f9fe commit ebbc1b2

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

android/src/main/java/com/tailscale/ipn/App.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ class App : UninitializedApp(), libtailscale.AppContext, ViewModelStoreOwner {
190190
applicationScope.launch {
191191
val hideDisconnectAction = MDMSettings.forceEnabled.flow.first()
192192
}
193+
TSLog.init(this)
193194
}
194195

195196
private fun initViewModels() {

android/src/main/java/com/tailscale/ipn/ui/localapi/Client.kt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package com.tailscale.ipn.ui.localapi
55

66
import android.content.Context
7+
import com.tailscale.ipn.App
78
import com.tailscale.ipn.ui.model.BugReportID
89
import com.tailscale.ipn.ui.model.Errors
910
import com.tailscale.ipn.ui.model.Ipn
@@ -13,7 +14,6 @@ import com.tailscale.ipn.ui.model.StableNodeID
1314
import com.tailscale.ipn.ui.model.Tailcfg
1415
import com.tailscale.ipn.ui.util.InputStreamAdapter
1516
import com.tailscale.ipn.util.TSLog
16-
import com.tailscale.ipn.App
1717
import kotlinx.coroutines.CoroutineScope
1818
import kotlinx.coroutines.Dispatchers
1919
import kotlinx.coroutines.launch
@@ -69,9 +69,7 @@ class Client(private val scope: CoroutineScope) {
6969
private val TAG = Client::class.simpleName
7070

7171
// Access libtailscale.Application lazily
72-
private val app: libtailscale.Application by lazy {
73-
App.get().getLibtailscaleApp()
74-
}
72+
private val app: libtailscale.Application by lazy { App.get().getLibtailscaleApp() }
7573

7674
fun start(options: Ipn.Options, responseHandler: (Result<Unit>) -> Unit) {
7775
val body = Json.encodeToString(options).toByteArray()
@@ -102,6 +100,14 @@ class Client(private val scope: CoroutineScope) {
102100
}
103101

104102
fun editPrefs(prefs: Ipn.MaskedPrefs, responseHandler: (Result<Ipn.Prefs>) -> Unit) {
103+
// Log the stack trace for debugging purposes for
104+
// https://github.com/tailscale/tailscale/issues/14125
105+
val stackTrace =
106+
Thread.currentThread().stackTrace.joinToString("\n") { element ->
107+
"at ${element.className}.${element.methodName}(${element.fileName}:${element.lineNumber})"
108+
}
109+
TSLog.v("editPrefs", "Called editPrefs with prefs: $prefs\nStack trace:\n$stackTrace")
110+
105111
val body = Json.encodeToString(prefs).toByteArray()
106112
return patch(Endpoint.PREFS, body, responseHandler = responseHandler)
107113
}

android/src/main/java/com/tailscale/ipn/util/TSLog.kt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@
22
// SPDX-License-Identifier: BSD-3-Clause
33
package com.tailscale.ipn.util
44

5+
import android.content.Context
56
import android.util.Log
67
import libtailscale.Libtailscale
78

89
object TSLog {
10+
private lateinit var appContext: Context
911
var libtailscaleWrapper = LibtailscaleWrapper()
1012

13+
fun init(context: Context) {
14+
appContext = context.applicationContext
15+
}
16+
1117
fun d(tag: String?, message: String) {
1218
Log.d(tag, message)
1319
libtailscaleWrapper.sendLog(tag, message)
@@ -18,6 +24,13 @@ object TSLog {
1824
libtailscaleWrapper.sendLog(tag, message)
1925
}
2026

27+
fun v(tag: String?, message: String) {
28+
if (isUnstableRelease()) {
29+
Log.v(tag, message)
30+
libtailscaleWrapper.sendLog(tag, message)
31+
}
32+
}
33+
2134
// Overloaded function without Throwable because Java does not support default parameters
2235
@JvmStatic
2336
fun e(tag: String?, message: String) {
@@ -35,6 +48,15 @@ object TSLog {
3548
}
3649
}
3750

51+
private fun isUnstableRelease(): Boolean {
52+
val versionName =
53+
appContext.packageManager.getPackageInfo(appContext.packageName, 0).versionName
54+
55+
// Extract the middle number and check if it's odd
56+
val middleNumber = versionName.split(".").getOrNull(1)?.toIntOrNull()
57+
return middleNumber?.let { it % 2 == 1 } ?: false
58+
}
59+
3860
class LibtailscaleWrapper {
3961
public fun sendLog(tag: String?, message: String) {
4062
val logTag = tag ?: ""

0 commit comments

Comments
 (0)