staging
parent
fc67140c2d
commit
cd46a2fe6c
@ -1,4 +1,132 @@
|
|||||||
package cfig.lazybox
|
package cfig.lazybox
|
||||||
|
|
||||||
|
import cfig.lazybox.sysinfo.SysInfo.Companion.runAndWrite
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
|
||||||
class AMS {
|
class AMS {
|
||||||
|
enum class StandbyBucket(val id: Int) {
|
||||||
|
STANDBY_BUCKET_EXEMPTED(5),
|
||||||
|
STANDBY_BUCKET_ACTIVE(10),
|
||||||
|
STANDBY_BUCKET_WORKING_SET(20),
|
||||||
|
STANDBY_BUCKET_FREQUENT(30),
|
||||||
|
STANDBY_BUCKET_RARE(40),
|
||||||
|
STANDBY_BUCKET_RESTRICTED(45),
|
||||||
|
STANDBY_BUCKET_NEVER(50);
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun fromValue(value: Int): StandbyBucket? = StandbyBucket.entries.firstOrNull { it.id == value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val log = LoggerFactory.getLogger(AMS::class.qualifiedName)
|
||||||
|
fun getProcRank(): MutableList<String> {
|
||||||
|
val pkgRank: MutableList<String> = mutableListOf()
|
||||||
|
ByteArrayOutputStream().use {
|
||||||
|
runAndWrite("adb shell procrank", it, true)
|
||||||
|
it.toString().split("\n").subList(1, 21).forEachIndexed { i, line ->
|
||||||
|
val pkg = line.trim().split("\\s+".toRegex()).last()
|
||||||
|
pkgRank.add(pkg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//print pkgRank items, with index and content
|
||||||
|
|
||||||
|
FileOutputStream("proc_rank.log").use {
|
||||||
|
pkgRank.forEachIndexed { i, s ->
|
||||||
|
it.write("$s\n".toByteArray())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pkgRank
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getStandbyBucket(): HashMap<StandbyBucket, MutableList<String>> {
|
||||||
|
val buckets: HashMap<StandbyBucket, MutableList<String>> = hashMapOf(
|
||||||
|
StandbyBucket.STANDBY_BUCKET_EXEMPTED to mutableListOf(),
|
||||||
|
StandbyBucket.STANDBY_BUCKET_ACTIVE to mutableListOf(),
|
||||||
|
StandbyBucket.STANDBY_BUCKET_WORKING_SET to mutableListOf(),
|
||||||
|
StandbyBucket.STANDBY_BUCKET_FREQUENT to mutableListOf(),
|
||||||
|
StandbyBucket.STANDBY_BUCKET_RARE to mutableListOf(),
|
||||||
|
StandbyBucket.STANDBY_BUCKET_RESTRICTED to mutableListOf(),
|
||||||
|
StandbyBucket.STANDBY_BUCKET_NEVER to mutableListOf(),
|
||||||
|
)
|
||||||
|
ByteArrayOutputStream().use {
|
||||||
|
runAndWrite("adb shell am get-standby-bucket", it, true)
|
||||||
|
it.toString().trim().split("\n").forEachIndexed { i, line ->
|
||||||
|
log.info("#$i: $line")
|
||||||
|
if (line.split(":").size == 2) {
|
||||||
|
val b = line.split(":").get(0).trim()
|
||||||
|
val a = line.split(":").get(1).trim()
|
||||||
|
log.info("[$a]-[$b]")
|
||||||
|
buckets[StandbyBucket.fromValue(a.toInt())]!!.add(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StandbyBucket.entries.forEach {
|
||||||
|
log.info(it.toString() + "(${it.id})")
|
||||||
|
buckets[it]!!.apply { sort() }.forEach {
|
||||||
|
log.info("\t$it")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return buckets
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getStandbyBucket2(): HashMap<String, StandbyBucket> {
|
||||||
|
val ret: HashMap<String, StandbyBucket> = HashMap<String, StandbyBucket>()
|
||||||
|
ByteArrayOutputStream().use {
|
||||||
|
runAndWrite("adb shell am get-standby-bucket", it, true)
|
||||||
|
it.toString().trim().split("\n").forEachIndexed { i, line ->
|
||||||
|
log.info("#$i: $line")
|
||||||
|
if (line.split(":").size == 2) {
|
||||||
|
val b = line.split(":").get(0).trim()
|
||||||
|
val a = line.split(":").get(1).trim()
|
||||||
|
log.info("[$a]-[$b]")
|
||||||
|
ret.put(b, StandbyBucket.fromValue(a.toInt())!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getOom() {
|
||||||
|
val text = ByteArrayOutputStream().use {
|
||||||
|
runAndWrite("adb shell dumpsys activity oom", it, true)
|
||||||
|
it.toString()
|
||||||
|
}
|
||||||
|
log.info(text)
|
||||||
|
val lines = text.trim().split("\n") // Split lines
|
||||||
|
val regex = Regex("""^ +Proc #\d+: (.*?) +oom: max=\d+ curRaw=(-?\d+) setRaw=(-?\d+) cur=(-?\d+) set=(-?\d+)""") // Match relevant parts
|
||||||
|
val results = lines.mapNotNull { line ->
|
||||||
|
val matchResult = regex.matchEntire(line) ?: return@mapNotNull null
|
||||||
|
val groups = matchResult.groups
|
||||||
|
// Extract data from groups
|
||||||
|
val packageName = groups[1]?.value ?: ""
|
||||||
|
val oomCurValue = groups[2]?.value?.toIntOrNull() ?: 0
|
||||||
|
val status = groups[3]?.value ?: ""
|
||||||
|
|
||||||
|
// Create the Any array
|
||||||
|
arrayOf(packageName, oomCurValue, status)
|
||||||
|
log.info("$packageName -> $oomCurValue -> $status")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun computeRankAndBucket(rank: MutableList<String>, bkt: HashMap<String, StandbyBucket>) {
|
||||||
|
val sb = StringBuilder()
|
||||||
|
rank.forEach {
|
||||||
|
val bktEntry = bkt.get(it)
|
||||||
|
if (bktEntry != null) {
|
||||||
|
sb.append(String.format("%-40s %s\n", it, bktEntry))
|
||||||
|
} else {
|
||||||
|
sb.append(String.format("%-40s -\n", it))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.info("Writing to rank_bucket.log ...\n$sb")
|
||||||
|
File("rank_bucket.log").writeText(sb.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue