Skip to content

Commit

Permalink
perf: 优化查询逻辑
Browse files Browse the repository at this point in the history
  • Loading branch information
lisonge committed Dec 25, 2023
1 parent a9f7572 commit 43c45e1
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 42 deletions.
2 changes: 2 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/data/AppRule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ class AppRule(
subsItem = subsItem,
rawSubs = rawSubs,
) {

override val type = "app"
override fun matchActivity(topActivity: TopActivity?): Boolean {
topActivity ?: return false
topActivity.activityId ?: return true
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/kotlin/li/songe/gkd/data/GlobalRule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ class GlobalRule(
subsItem = subsItem,
rawSubs = rawSubs,
) {

override val type = "global"

private val excludeAppIds = apps.filter { e -> !e.value.enable }.keys
override fun matchActivity(topActivity: TopActivity?): Boolean {
topActivity ?: return false
Expand Down
23 changes: 16 additions & 7 deletions app/src/main/kotlin/li/songe/gkd/data/ResolvedRule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,13 @@ sealed class ResolvedRule(
return false
}

val actionCd = (if (rule.actionCdKey != null) {
group.rules.find { r -> r.key == rule.actionCdKey }?.actionCd ?: group.actionCd
val actionCdKey = rule.actionCdKey ?: group.actionCdKey
val actionCd = rule.actionCd ?: (if (actionCdKey != null) {
group.rules.find { r -> r.key == actionCdKey }?.actionCd
?: group.actionCd
} else {
null
} ?: rule.actionCd ?: group.actionCd ?: 1000L)
} ?: group.actionCd ?: 1000L)

var actionTriggerTime = Value(0L)
fun trigger() {
Expand All @@ -55,12 +57,13 @@ sealed class ResolvedRule(
lastTriggerRule = this
}

val actionMaximum = ((if (rule.actionMaximumKey != null) {
group.rules.find { r -> r.key == rule.actionMaximumKey }?.actionMaximum
val actionMaximumKey = rule.actionMaximumKey ?: group.actionMaximumKey
val actionMaximum = rule.actionMaximum ?: ((if (actionMaximumKey != null) {
group.rules.find { r -> r.key == actionMaximumKey }?.actionMaximum
?: group.actionMaximum
} else {
null
}) ?: rule.actionMaximum ?: group.actionMaximum)
}) ?: group.actionMaximum)

var actionCount = Value(0)

Expand Down Expand Up @@ -122,9 +125,15 @@ sealed class ResolvedRule(
}
return 0
}

abstract val type: String
abstract fun matchActivity(topActivity: TopActivity?): Boolean

fun statusText(): String {
return "id:${subsItem.id}, v:${rawSubs.version}, rType:${type}, gKey=${group.key}, gName:${group.name}, rIndex:${index}, rKey:${key}, rCode:${
statusCode
}"
}

}


Expand Down
42 changes: 29 additions & 13 deletions app/src/main/kotlin/li/songe/gkd/service/GkdAbService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ import li.songe.gkd.data.SubsVersion
import li.songe.gkd.data.getActionFc
import li.songe.gkd.db.DbSet
import li.songe.gkd.debug.SnapshotExt
import li.songe.gkd.shizuku.shizukuIsSafeOK
import li.songe.gkd.shizuku.useSafeGetTasksFc
import li.songe.gkd.shizuku.useShizukuAliveState
import li.songe.gkd.util.VOLUME_CHANGED_ACTION
import li.songe.gkd.util.client
import li.songe.gkd.util.launchTry
Expand All @@ -66,7 +68,25 @@ class GkdAbService : CompositionAbService({
service = null
}

val safeGetTasksFc = useSafeGetTasksFc(scope)
val shizukuAliveFlow = useShizukuAliveState()
val shizukuGrantFlow = MutableStateFlow(false)
var lastCheckShizukuTime = 0L
onAccessibilityEvent { // 借助无障碍轮询校验 shizuku 权限
if (storeFlow.value.enableService && it?.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {// 筛选降低判断频率
val t = System.currentTimeMillis()
if (t - lastCheckShizukuTime > 5000L) {
lastCheckShizukuTime = t
scope.launchTry(Dispatchers.IO) {
shizukuGrantFlow.value = if (shizukuAliveFlow.value) {
shizukuIsSafeOK()
} else {
false
}
}
}
}
}
val safeGetTasksFc = useSafeGetTasksFc(scope, shizukuGrantFlow, shizukuAliveFlow)

// 当锁屏/上拉通知栏时, safeActiveWindow 没有 activityId, 但是此时 shizuku 获取到是前台 app 的 appId 和 activityId
fun getShizukuTopActivity(): TopActivity? {
Expand Down Expand Up @@ -135,7 +155,7 @@ class GkdAbService : CompositionAbService({
if (actionResult.result) {
insertClickLog(rule)
LogUtils.d(
*rule.matches.toTypedArray(),
rule.statusText(),
AttrInfo.info2data(nodeVal, 0, 0),
actionResult
)
Expand All @@ -158,8 +178,9 @@ class GkdAbService : CompositionAbService({
if (event == null || event.packageName == null) return@onAccessibilityEvent
if (!(event.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED)) return@onAccessibilityEvent

if (event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED &&
skipAppIds.contains(event.packageName.toString())
if (event.eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && skipAppIds.contains(
event.packageName.toString()
)
) {
return@onAccessibilityEvent
}
Expand Down Expand Up @@ -294,9 +315,7 @@ class GkdAbService : CompositionAbService({
activityRuleFlow.debounce(300).collect {
if (storeFlow.value.enableService) {
LogUtils.d(it.topActivity, *it.currentRules.map { r ->
"id:${r.subsItem.id}, v:${r.rawSubs.version}, gKey=${r.group.key}, gName:${r.group.name}, rIndex:${r.index}, rKey:${r.key}, rCode:${
r.statusCode
}"
r.statusText()
}.toTypedArray())
} else {
LogUtils.d(
Expand Down Expand Up @@ -397,11 +416,9 @@ class GkdAbService : CompositionAbService({
e ?: return@onAccessibilityEvent
val appId = e.packageName ?: return@onAccessibilityEvent
val appCls = e.className ?: return@onAccessibilityEvent
if (appId.contentEquals("com.miui.screenshot") &&
e.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED &&
!e.isFullScreen &&
appCls.contentEquals("android.widget.RelativeLayout") &&
e.text.firstOrNull()?.contentEquals("截屏缩略图") == true // [截屏缩略图, 截长屏, 发送]
if (appId.contentEquals("com.miui.screenshot") && e.eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && !e.isFullScreen && appCls.contentEquals(
"android.widget.RelativeLayout"
) && e.text.firstOrNull()?.contentEquals("截屏缩略图") == true // [截屏缩略图, 截长屏, 发送]
) {
LogUtils.d("captureScreenshot", e)
scope.launchTry(Dispatchers.IO) {
Expand All @@ -410,7 +427,6 @@ class GkdAbService : CompositionAbService({
}
}


isRunning.value = true
onDestroy {
isRunning.value = false
Expand Down
15 changes: 5 additions & 10 deletions app/src/main/kotlin/li/songe/gkd/shizuku/ShizukuApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,13 @@ import android.view.Display
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ToastUtils
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.stateIn
import li.songe.gkd.composition.CanOnDestroy
import li.songe.gkd.data.DeviceInfo
import li.songe.gkd.util.launchWhile
import li.songe.gkd.util.map
import li.songe.gkd.util.storeFlow
import rikka.shizuku.Shizuku
Expand Down Expand Up @@ -95,13 +92,11 @@ fun CanOnDestroy.useShizukuAliveState(): StateFlow<Boolean> {
return shizukuAliveFlow
}

fun CanOnDestroy.useSafeGetTasksFc(scope: CoroutineScope): () -> List<ActivityManager.RunningTaskInfo>? {
val shizukuAliveFlow = useShizukuAliveState()
val shizukuGrantFlow = MutableStateFlow(false)
scope.launchWhile(Dispatchers.IO) {
shizukuGrantFlow.value = if (shizukuAliveFlow.value) shizukuIsSafeOK() else false
delay(3000)
}
fun useSafeGetTasksFc(
scope: CoroutineScope,
shizukuGrantFlow: StateFlow<Boolean>,
shizukuAliveFlow: StateFlow<Boolean>
): () -> List<ActivityManager.RunningTaskInfo>? {
val shizukuCanUsedFlow = combine(
shizukuAliveFlow,
shizukuGrantFlow,
Expand Down
12 changes: 0 additions & 12 deletions app/src/main/kotlin/li/songe/gkd/util/CoroutineExt.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,10 @@ import com.blankj.utilcode.util.ToastUtils
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlin.coroutines.CoroutineContext
import kotlin.coroutines.EmptyCoroutineContext


fun CoroutineScope.launchWhile(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit,
) = launch(context, start) {
while (isActive) {
block()
}
}

fun CoroutineScope.launchTry(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
Expand Down

0 comments on commit 43c45e1

Please sign in to comment.