mirror of
https://github.com/gkd-kit/gkd.git
synced 2024-11-16 11:42:22 +08:00
perf: clear node child cache
This commit is contained in:
parent
ac51aae4ab
commit
44b0fd0066
|
@ -46,18 +46,40 @@ class A11yContext(
|
|||
private var parentCache = LruCache<AccessibilityNodeInfo, AccessibilityNodeInfo>(MAX_CACHE_SIZE)
|
||||
var rootCache: AccessibilityNodeInfo? = null
|
||||
|
||||
private var lastClearTime = 0L
|
||||
private fun clearNodeCache(t: Long = System.currentTimeMillis()) {
|
||||
private fun clearChildCache(node: AccessibilityNodeInfo) {
|
||||
repeat(node.childCount.coerceAtMost(MAX_CHILD_SIZE)) { i ->
|
||||
childCache.remove(node to i)?.let {
|
||||
clearChildCache(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun clearNodeCache(eventNode: AccessibilityNodeInfo? = null) {
|
||||
if (rootCache?.packageName != topActivityFlow.value.appId) {
|
||||
rootCache = null
|
||||
}
|
||||
if (eventNode != null) {
|
||||
clearChildCache(eventNode)
|
||||
parentCache[eventNode]?.let { p ->
|
||||
getPureIndex(eventNode)?.let { i ->
|
||||
childCache[p to i] = eventNode
|
||||
}
|
||||
}
|
||||
if (rootCache == eventNode) {
|
||||
rootCache = eventNode
|
||||
} else {
|
||||
if (META.debuggable) {
|
||||
Log.d("cache", "clear node cache ${eventNode.packageName}/${eventNode.className}")
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
if (META.debuggable) {
|
||||
val sizeList = listOf(childCache.size(), parentCache.size(), indexCache.size())
|
||||
if (sizeList.any { it > 0 }) {
|
||||
Log.d("cache", "clear cache -> $sizeList")
|
||||
}
|
||||
}
|
||||
lastClearTime = t
|
||||
if (rootCache?.packageName != topActivityFlow.value.appId) {
|
||||
rootCache = null
|
||||
}
|
||||
try {
|
||||
childCache.evictAll()
|
||||
parentCache.evictAll()
|
||||
|
@ -72,12 +94,13 @@ class A11yContext(
|
|||
}
|
||||
|
||||
private var lastAppChangeTime = appChangeTime
|
||||
fun clearOldAppNodeCache() {
|
||||
fun clearOldAppNodeCache(): Boolean {
|
||||
if (appChangeTime != lastAppChangeTime) {
|
||||
lastAppChangeTime = appChangeTime
|
||||
clearNodeCache()
|
||||
return
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
var currentRule: ResolvedRule? = null
|
||||
|
|
|
@ -255,7 +255,12 @@ private fun A11yService.useMatchRule() {
|
|||
}
|
||||
}
|
||||
var lastNodeUsed = false
|
||||
a11yContext.clearOldAppNodeCache()
|
||||
if (!a11yContext.clearOldAppNodeCache()) {
|
||||
if (byEvent != null) { // 此为多数情况
|
||||
// 新事件到来时, 若缓存清理不及时会导致无法查询到节点
|
||||
a11yContext.clearNodeCache(lastNode)
|
||||
}
|
||||
}
|
||||
for (rule in activityRule.priorityRules) { // 规则数量有可能过多导致耗时过长
|
||||
if (delayRule != null && delayRule !== rule) continue
|
||||
val statusCode = rule.status
|
||||
|
|
Loading…
Reference in New Issue
Block a user