Skip to content

Commit 6c3eea7

Browse files
committed
optimize restart
1 parent 2259fd3 commit 6c3eea7

File tree

7 files changed

+46
-24
lines changed

7 files changed

+46
-24
lines changed

app/src/main/java/io/nekohasekai/sagernet/SagerNet.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ class SagerNet : Application(),
202202

203203
var underlyingNetwork: Network? = null
204204

205-
var appVersionNameForDisplay = lazy {
205+
var appVersionNameForDisplay = {
206206
var n = BuildConfig.VERSION_NAME
207207
if (isPreview) {
208208
n += " " + BuildConfig.PRE_VERSION_NAME
@@ -213,7 +213,7 @@ class SagerNet : Application(),
213213
n += " DEBUG"
214214
}
215215
n
216-
}
216+
}()
217217
}
218218

219219
}

app/src/main/java/io/nekohasekai/sagernet/bg/BaseService.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ class BaseService {
105105
override fun getProfileName(): String = data?.proxy?.displayProfileName ?: "Idle"
106106

107107
override fun registerCallback(cb: ISagerNetServiceCallback, id: Int) {
108+
if (id == SagerConnection.CONNECTION_ID_RESTART_BG) {
109+
Runtime.getRuntime().exit(0)
110+
return
111+
}
108112
if (!callbackIdMap.contains(cb)) {
109113
callbacks.register(cb)
110114
}

app/src/main/java/io/nekohasekai/sagernet/bg/Executable.kt

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,21 @@ package io.nekohasekai.sagernet.bg
33
import android.system.ErrnoException
44
import android.system.Os
55
import android.system.OsConstants
6-
import android.text.TextUtils
76
import io.nekohasekai.sagernet.ktx.Logs
87
import java.io.File
98
import java.io.IOException
9+
import androidx.core.text.isDigitsOnly
1010

1111
object Executable {
1212
private val EXECUTABLES = setOf(
13-
"libtrojan.so",
14-
"libtrojan-go.so",
15-
"libnaive.so",
16-
"libtuic.so",
17-
"libhysteria.so"
13+
"libtrojan.so", "libtrojan-go.so", "libnaive.so", "libtuic.so", "libhysteria.so"
1814
)
1915

2016
fun killAll(alsoKillBg: Boolean = false) {
21-
for (process in File("/proc").listFiles { _, name -> TextUtils.isDigitsOnly(name) }
22-
?: return) {
23-
val exe = File(try {
17+
// kill bg may fail
18+
for (process in File("/proc").listFiles { _, name -> name.isDigitsOnly() } ?: return) {
19+
val exe = File(
20+
try {
2421
File(process, "cmdline").inputStream().bufferedReader().use {
2522
it.readText()
2623
}

app/src/main/java/io/nekohasekai/sagernet/bg/SagerConnection.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ class SagerConnection(
3232
const val CONNECTION_ID_TILE = 1
3333
const val CONNECTION_ID_MAIN_ACTIVITY_FOREGROUND = 2
3434
const val CONNECTION_ID_MAIN_ACTIVITY_BACKGROUND = 3
35+
const val CONNECTION_ID_RESTART_BG = 4
36+
37+
var restartingApp = false
3538
}
3639

3740
interface Callback {
@@ -124,7 +127,7 @@ class SagerConnection(
124127
} catch (e: RemoteException) {
125128
e.printStackTrace()
126129
}
127-
callback!!.onServiceConnected(service)
130+
callback?.onServiceConnected(service)
128131
}
129132

130133
override fun onServiceDisconnected(name: ComponentName?) {
@@ -137,7 +140,9 @@ class SagerConnection(
137140
override fun binderDied() {
138141
service = null
139142
callbackRegistered = false
140-
callback?.also { runOnMainDispatcher { it.onBinderDied() } }
143+
if (!restartingApp) {
144+
callback?.also { runOnMainDispatcher { it.onBinderDied() } }
145+
}
141146
}
142147

143148
private fun unregisterCallback() {
@@ -149,7 +154,7 @@ class SagerConnection(
149154
callbackRegistered = false
150155
}
151156

152-
fun connect(context: Context, callback: Callback) {
157+
fun connect(context: Context, callback: Callback?) {
153158
if (connectionActive) return
154159
connectionActive = true
155160
check(this.callback == null)

app/src/main/java/io/nekohasekai/sagernet/ktx/Utils.kt

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import androidx.activity.result.ActivityResultLauncher
2020
import androidx.annotation.AttrRes
2121
import androidx.annotation.ColorRes
2222
import androidx.core.content.ContextCompat
23+
import androidx.core.view.isGone
24+
import androidx.core.view.isVisible
2325
import androidx.fragment.app.DialogFragment
2426
import androidx.fragment.app.Fragment
2527
import androidx.fragment.app.FragmentManager
@@ -30,10 +32,10 @@ import com.jakewharton.processphoenix.ProcessPhoenix
3032
import io.nekohasekai.sagernet.BuildConfig
3133
import io.nekohasekai.sagernet.R
3234
import io.nekohasekai.sagernet.SagerNet
33-
import io.nekohasekai.sagernet.bg.Executable
35+
import io.nekohasekai.sagernet.aidl.ISagerNetService
36+
import io.nekohasekai.sagernet.bg.BaseService
37+
import io.nekohasekai.sagernet.bg.SagerConnection
3438
import io.nekohasekai.sagernet.database.DataStore
35-
import io.nekohasekai.sagernet.database.SagerDatabase
36-
import io.nekohasekai.sagernet.database.preference.PublicDatabase
3739
import io.nekohasekai.sagernet.ui.MainActivity
3840
import io.nekohasekai.sagernet.ui.ThemedActivity
3941
import kotlinx.coroutines.Dispatchers
@@ -201,7 +203,7 @@ val shortAnimTime by lazy {
201203
fun View.crossFadeFrom(other: View) {
202204
clearAnimation()
203205
other.clearAnimation()
204-
if (visibility == View.VISIBLE && other.visibility == View.GONE) return
206+
if (isVisible && other.isGone) return
205207
alpha = 0F
206208
visibility = View.VISIBLE
207209
animate().alpha(1F).duration = shortAnimTime
@@ -256,10 +258,24 @@ fun triggerFullRestart(ctx: Context) {
256258
runOnDefaultDispatcher {
257259
SagerNet.stopService()
258260
delay(500)
259-
Executable.killAll(true)
260-
runOnMainDispatcher {
261+
SagerConnection.restartingApp = true
262+
val connection = SagerConnection(SagerConnection.CONNECTION_ID_RESTART_BG)
263+
connection.connect(ctx, RestartCallback {
261264
ProcessPhoenix.triggerRebirth(ctx, Intent(ctx, MainActivity::class.java))
262-
}
265+
})
266+
}
267+
}
268+
269+
private class RestartCallback(val callback: () -> Unit) : SagerConnection.Callback {
270+
override fun stateChanged(
271+
state: BaseService.State,
272+
profileName: String?,
273+
msg: String?
274+
) {
275+
}
276+
277+
override fun onServiceConnected(service: ISagerNetService) {
278+
callback()
263279
}
264280
}
265281

app/src/main/java/io/nekohasekai/sagernet/ui/AboutFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
8080
MaterialAboutActionItem.Builder()
8181
.icon(R.drawable.ic_baseline_update_24)
8282
.text(R.string.app_version)
83-
.subText(SagerNet.appVersionNameForDisplay.value)
83+
.subText(SagerNet.appVersionNameForDisplay)
8484
.setOnClickAction {
8585
requireContext().launchCustomTab(
8686
"https://github.com/MatsuriDayo/NekoBoxForAndroid/releases"
@@ -251,7 +251,7 @@ class AboutFragment : ToolbarFragment(R.layout.layout_about) {
251251
.setMessage(
252252
context.getString(
253253
R.string.update_dialog_message,
254-
SagerNet.appVersionNameForDisplay.value,
254+
SagerNet.appVersionNameForDisplay,
255255
releaseName
256256
)
257257
)

nb4a.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
PACKAGE_NAME=moe.nb4a
22
VERSION_NAME=1.3.9
3-
PRE_VERSION_NAME=pre-1.4.0-20250904-2
3+
PRE_VERSION_NAME=pre-1.4.0-20250905-1
44
VERSION_CODE=43

0 commit comments

Comments
 (0)