Описание Json-файла конфигурации управления памятью A1 v4

August 24, 2023 · View on GitHub

A1 Memory Management v4 разработан с использованием фреймворка HAMv2, поэтому параметры управления памятью можно настраивать через конфигурационные файлы без изменения исходного кода. В этом документе подробно рассказывается, как настроить файлы конфигурации Json.

Параметр пользовательских модулей

"config": {
    "path": "/sdcard/Android/HChai/HC_memory",
    "modulePath": "/data/adb/modules/Hc_memory",
    "list": {
        "name": "名单列表.conf",
        "whiteList": {
            "optional": true,
            "smart": true,
            "system": false
        }
    }
}
имя полятипописание
pathstringпуть к файлу конфигурации
modulePathstringимя модуля путь
namestringИмя файла конфигурационного списка, в котором хранятся белый список и смарт-список
optionalboolВключить ли белый список, после включения процессы в белом списке не будут убиты
smartboolВключить ли смарт-белый список, после его включения процесс будет автоматически идентифицирован и добавлен в белый список
systemboolВключить ли системный белый список, все системное ПО будет добавлено в белый список после включения

Следует отметить, что добавление белого списка должно быть добавлено в следующем формате:

WHITE Имена пакетов

Путь/уровень журнала

Записывайте журналы, когда запущено управление памятью A1 v4, и вы можете настроить вывод журнала, изменив путь журнала и уровень журнала.

"log": {
    "path": "/sdcard/Android/HChai/HC_memory/Run.log",
    "level": "info"
}
имя полятипописание
pathstringпуть журнала
levelstringуровень лога, варианты: debug, info, warn, err, critical

Если вы хотите отключить журнал, вы можете установить критический уровень журнала или, если вы хотите видеть только журнал текущих ошибок, вы можете настроить его на предупреждение.

Основные рабочие параметры функции

Функция этого параметра заключается в том, что после изменения приложения переднего плана переключение процесса переднего плана в течение определенного периода времени не приведет к запуску основной функции.

"initProcess": {
    "afterTopChange": {
        "sleep": 1
    }
}
имя полятипописание
sleepintвремя ожидания в секундах

"sleep" указывает время ожидания после изменения приоритетного приложения в секундах. Установка его на 1 секунду означает, что после изменения приложения переднего плана подождите 1 секунду, прежде чем переключиться на передний план, прежде чем снова выполнять основную функцию. Другими словами, основная функция не будет выполнена, если передний план переключится в течение 1 секунды. Этот параметр можно использовать для управления повторным выполнением основной функции в течение периода времени после изменения приложения переднего плана, чтобы предотвратить ненужные операции или трату ресурсов.

Управление памятью A1 завершает ненужные процессы

Управление памятью A1 v4 может завершать ненужные процессы для освобождения памяти. Ниже приведены примеры параметров, используемых для управления этим поведением:

"a1Memory": {
    "enable": true,
    "oomAdj": 905
}
имя полятипописание
enableboolВключить ли управление памятью A1 для завершения ненужных процессов
oomAdjintЗначение больше oomAdj будет прекращено
  • enable указывает, следует ли включить управление памятью A1 для завершения ненужных процессов. Если установлено значение true, управление памятью A1 выполнит операцию завершения процесса; если установлено значение false, управление памятью A1 не завершит ни один процесс.
  • oomAdj указывает значение настройки, используемое для определения того, завершен ли процесс. Только когда значение oomAdj процесса больше установленного значения "oomAdj", они будут завершены управлением памятью A1. Это значение находится в диапазоне от 0 до 1000. Чем больше значение, тем меньше процессов завершается, и наоборот, чем меньше значение, тем больше процессов завершается. Следует отметить, что не все процессы будут идентифицированы и остановлены, будут прекращены только те процессы, которые алгоритм оценивает как ненужные и у которых значение oomAdj больше заданного значения.

Разрешить приложению автоматически освобождать память

Управление памятью A1 v4 позволяет приложениям автоматически освобождать память. Ниже приведены примеры параметров, используемых для управления этим поведением:

"initCutMemory": {
    "freed": {
        "enable": true,
        "level": "80",
        "regex": "( CAC|SVC|CEM).*",
        "change": 20
    }
}
имя полятипописание
enableboolРазрешить ли приложению автоматически освобождать память
levelstring0-100, чем выше значение, тем больше памяти будет освобождено
regexstringРегулярное выражение, соответствующее состоянию приложения, которому необходимо освободить память
changeintсколько раз передний план переключается для выполнения операции автоотпуска
  • enable указывает, разрешить ли приложению автоматически освобождать память. Если установлено значение true, управление памятью A1 реализует приложение для автоматического освобождения операции с памятью; если установлено значение false, управление памятью A1 не будет выполнять приложение для автоматического освобождения операции с памятью.
  • level указывает степень освобождения памяти. Это значение находится в диапазоне от 0 до 100. Чем выше значение, тем больше памяти будет освобождено, и наоборот, чем меньше значение, тем меньше памяти будет освобождено.
  • regex представляет собой регулярное выражение, используемое для сопоставления состояния приложения, которому необходимо освободить память. Память будет освобождена только для соответствующего состояния приложения. Правила сопоставления регулярных выражений такие же, как и в языке JS, вы можете обратиться к здесь.
  • change указывает, сколько раз приложение переднего плана переключается для выполнения операции автоматического выпуска. Я рекомендую это значение между 10-30.

Как узнать, память каких приложений нужно освободить? Получить статус можно командой:

Заказ: dumpsys activity lru
выход: ACTIVITY MANAGER LRU PROCESSES (dumpsys activity lru)
  Activities:
  #67: fg     TOP  LCMN 6918:bin.mt.plus/u0a226 act:activities|recents
  #66: vis    BFGS ---N 3152:com.miui.home/u0a80 act:activities
  #65: prev   LAST ---- 25424:com.omarea.vtools/u0a672 act:activities|recents
  #64: cch    CAC  ---- 5586:com.kiwibrowser.browser/u0a91 act:activities|recents
  #63: cch    CACC ---- 5961:com.kiwibrowser.browser:kiwi_sandboxed_process0:org.chromium.content.app.KiwiSandboxedProcessService0:4/u0a91i-8996 act:client
  #62: cch+10 CAC  ---- 22204:com.tencent.mobileqq/u0a481 act:activities|recents
  #61: cch+10 CACC ---- 22308:com.tencent.mobileqq:MSF/u0a481 act:client
  #60: cch+20 CACC ---- 5715:com.kiwibrowser.browser:kiwi_privileged_process0/u0a91 act:client
  #59: cch+20 CACC ---- 5748:com.kiwibrowser.browser:kiwi_sandboxed_process0:org.chromium.content.app.KiwiSandboxedProcessService0:1/u0a91i-8999 act:client
  #58: hvy    CAC  ---- 31098:com.coolapk.market/u0a677 act:activities|recents
  #57: hvy    SVC  ---- 9696:com.tencent.mm/u0a201 act:activities|recents
  #56: vis    SVC  ---- 4370:com.google.android.gms/u0a159 act:client
  #55: vis    BFGS ---N 4265:com.google.android.gms.persistent/u0a159 act:client
  #54: hvy    SVC  ---- 9290:com.tencent.mm:push/u0a201 act:client
  #53: cch+30 CACC ---- 6104:com.kiwibrowser.browser:kiwi_sandboxed_process0:org.chromium.content.app.KiwiSandboxedProcessService0:5/u0a91i-8995 act:client
  #52: hvy    CAC  ---- 22734:org.telegram.plus/u0a386 act:activities|recents
  #51: hvy    CAC  ---- 24029:mark.via/u0a222 act:activities|recents
  #50: cch+30 CACC ---- 24074:com.google.android.webview:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:0/u0a222i1 act:client
  #49: cch+40 CAC  ---- 25274:com.google.android.apps.translate/u0a548 act:activities|recents
  #48: hvy    CAC  ---- 21987:com.github.kr328.clash/u0a329 act:activities|recents
  Other:
  #47: fg     BTOP ---N 4315:com.miui.securitycenter.remote/1000
  #46: vis    BFGS ---N 4948:com.miui.powerkeeper/1000
  #45: cch+ 5 CEM  ---- 4209:com.miui.weather2/u0a203
  #44: vis    BTOP ---N 4853:com.miui.securitycenter.bootaware/1000
  #43: cch+15 CEM  ---- 11717:com.android.mms/u0a66
  #42: cch+25 CEM  ---- 7159:egrn.pucm.pgo/u0a764
  #41: psvc   PER  LCMN 4197:com.android.providers.media.module/u0a197
  #40: prcp   FGS  ---N 5977:com.miui.gallery/u0a68
  #39: vis    FGS  ---N 22036:com.github.kr328.clash:background/u0a329 act:client
  #38: cch+35 SVC  ---- 31061:com.android.settings:remote/1000
  #37: svcb   SVC  ---- 4569:com.xiaomi.xmsf/u0a141
  #36: cch+45 CEM  ---- 5950:com.xiaomi.aiasst.service/1000
  #35: prcp   FGS  ---N 20376:com.miui.misound/u0a126
  #34: fg     BFGS ---N 5543:com.xiaomi.misettings:remote/1000
  #33: fg     FGS  ---N 5665:com.miui.notification:remote/1000
  #32: cch+55 CEM  ---- 4396:com.android.providers.calendar/u0a50
  #31: cch+65 CEM  ---- 9210:com.xiaomi.market:guard/u0a117
  #30: hvy    CEM  ---- 9075:com.xiaomi.joyose/1000
  #29: cch+75 CEM  ---- 8819:com.miui.core/u0a145
  #28: cch+85 CEM  ---- 8352:com.android.shell/2000
  #27: prcp   TRNB ---- 4793:com.lbe.security.miui/u0a52
  #26: vis    BFGS LCMN 5035:com.sohu.inputmethod.sogou.xiaomi/u0a134 act:treated
  #25: pers   PER  LCMN 4180:com.miui.face/1000
  #24: pers   PER  LCMN 4171:com.qualcomm.location/u0a182
  #23: pers   PER  LCMN 4149:org.mipay.android.manager/u0a150
  #22: pers   PER  LCMN 4130:com.tencent.soter.soterserver/u0a151 act:client
  #21: pers   PER  LCMN 4126:com.qualcomm.qti.workloadclassifier/u0a191
  #20: pers   PER  LCMN 4073:com.xiaomi.mircs/u0a76
  #19: pers   PER  LCMN 4081:com.xiaomi.xmsfkeeper/u0a140
  #18: pers   PER  LCMN 4061:com.miui.voicetrigger/u0a102
  #17: pers   PER  LCMN 4038:.slas/1000
  #16: pers   PER  LCMN 4001:system/u0a46
  #15: pers   PER  LCMN 4003:org.ifaa.aidl.manager/u0a149
  #14: pers   PER  LCMN 3996:com.android.nfc/1027
  #13: pers   PER  LCMN 3967:com.miui.contentcatcher/1000
  #12: vis    BFGS LCMN 2913:com.miui.miwallpaper/u0a119
  #11: vis    IMPF ---- 3432:com.android.smspush/u0a187
  #10: pers   PER  LCMN 3135:com.android.systemui/1000
  # 9: pers   PER  LCMN 3119:com.android.phone/1001
  # 8: pers   PER  LCMN 3104:com.xiaomi.finddevice/6110
  # 7: pers   PER  LCMN 3103:com.android.se/1068
  # 6: pers   PER  LCMN 3137:.dataservices/1001
  # 5: pers   PER  LCMN 3106:com.qualcomm.qti.devicestatisticsservice/u0a161
  # 4: pers   PER  LCMN 3094:org.codeaurora.ims/u0a184
  # 3: pers   PER  LCMN 3098:com.qti.qualcomm.mstatssystemservice/u0a186
  # 2: pers   PER  LCMN 3072:com.qti.phone/u0a175
  # 1: pers   PER  LCMN 3051:.qtidataservices/u0a148
  # 0: sys    PER  LCMN 1824:system/1000

Велика вероятность, что вы не знаете, что означает статус процесса, поясню вкратце:

  • PER (Persistent): это постоянное состояние, означающее, что процесс не будет уничтожен системой. Обычно это относится к критически важным системным процессам, таким как системные службы.
  • PERU (Persistent and Upward): это также постоянное состояние, но оно позволяет системе завершить процесс, если ему не хватает памяти. Это означает, что в некоторых случаях процесс может быть остановлен, но в большинстве случаев он будет продолжать работать.
  • TOP (Top): Это указывает на то, что процесс является видимым в данный момент приложением переднего плана, т. е. приложением, с которым взаимодействует пользователь.
  • BTOP (Bound Top): это состояние похоже на TOP, но система может остановить процесс из-за нехватки памяти. Обычно это происходит, когда на устройстве запущено много приложений, а памяти мало.
  • FGS (Foreground Service): указывает, что процесс предоставляет службы переднего плана. Служба переднего плана — это служба, которая взаимодействует с пользователем, отображая уведомления или другой пользовательский интерфейс.
  • BFGS (Bound Foreground Service): аналогична FGS, но система может завершить процесс из-за нехватки памяти.
  • IMPF (Important Background): указывает, что процесс является важным фоновым процессом, который выполняет некоторые важные задачи, но не должен отображаться для пользователя на переднем плане.
  • IMPB (Important Background and Upward): это состояние похоже на IMPF, но система может остановить процесс из-за нехватки памяти.
  • TRNB (Trusted Background): указывает, что процесс является доверенным фоновым процессом и выполняет некоторые доверенные задачи.
  • BKUP (Backup): Указывает, что процесс выполняет операции резервного копирования приложений, такие как резервное копирование данных в облако или другие устройства хранения.
  • SVC (Service): указывает, что процесс является фоновой службой, выполняющей определенные функции, и ее не нужно отображать для пользователя на переднем плане.
  • RCVR (Receiver): указывает, что процесс является широковещательным приемником для приема и обработки широковещательных сообщений, отправленных системой или приложениями.
  • TPSL (Top Sleeping): указывает, что процесс находится в состоянии ожидания верхнего уровня, то есть приложение находится в состоянии ожидания, но остается на переднем плане.
  • HVY (Heavy Weight): Указывает, что процесс является тяжеловесным, обычно потому, что он использует много системных ресурсов, таких как память или ЦП.
  • HOME: указывает, что процесс является приложением домашнего экрана устройства, рабочим столом, который видит пользователь.
  • LAST: Указывает, что процесс является последним завершенным процессом приложения.
  • CAC (Cached Activity Client): указывает, что процесс является активным клиентом кэша, обычно это приложение, работающее в фоновом режиме.
  • CACC (Cached Recent): указывает, что процесс является последним активным клиентом кэша и обычно завершается, когда ему не хватает памяти.
  • CRE (Cached Empty): указывает, что процесс является кэшированным пустым процессом, у него нет никаких действий или задач.
  • CEM (Cached Empty and Maintained): указывает, что процесс является кэшированным пустым процессом, но может быть остановлен при нехватке памяти.
  • NONE: Указывает, что процесс не имеет состояния или его состояние не может быть определено.

параметры, связанные с внедрением хуков

Управление памятью A1 v4 может использовать хуки, чтобы предотвратить уничтожение фоновых процессов lmkd. Ниже приведены примеры параметров, используемых для управления этим поведением:

"initInjection": {
	"enable": true,
	"processName": "/system/bin/lmkd",
	"symbolsFunc": "hc_hook",
	"libraryPath": "/data/adb/modules/Hc_memory/lib/arm64-v8a/libhook_lmkd.so",
	"lmkd": {
		"memThreshold": {
			"enable": true,
			"value": 90
		},
		"hookFunc": {
			"kill": true,
			"pidfd_send_signal": true,
			"__android_log_print": false,
			"meminfo": {
				"updateTime": 60
			}
		},
		"model": {
			"inlineHook": "dobby"
		}
	}
}
имя полятипописание
initInjectionobjectинъекция инициализации
enableboolbool ли ловушку lmkd
processNamestringимя процесса
symbolsFuncstringИмя функции, которая будет выполняться после хука
libraryPathstringПуть к библиотеке хуков

Вы можете изменить путь, чтобы внедрить свою библиотеку ловушек в указанный процесс.Я рекомендую использовать абсолютный путь для имени процесса.

  • initInjection означает инъекцию инициализации.
  • enable указывает, включать ли хук lmkd. Если установлено значение true, управление памятью A1 будет перехватывать lmkd; если установлено значение false, управление памятью A1 не будет перехватывать lmkd.

порог памяти

имя полятипописание
memThresholdobjectпорог памяти
enableboolВключить ли порог памяти
valueintКогда использование памяти достигает 90%, больше не препятствовать тому, чтобы lmkd убивал процесс

Порог памяти — очень важная функция, она позволяет больше не препятствовать тому, чтобы lmkd убивал процесс после того, как использование памяти достигает определенного уровня. Преимущество этого заключается в том, что это может предотвратить зависание системы из-за большого использования памяти, но также приведет к остановке фонового процесса. Таким образом, вы можете контролировать использование памяти до определенного уровня, установив пороговое значение памяти, и больше не запрещать lmkd убивать процесс.

  • memThreshold представляет функцию порога памяти.
  • enable указывает, следует ли включить функцию порога памяти. Если установлено значение true, управление памятью A1 активирует функцию порога памяти; если установлено значение false, управление памятью A1 не активирует функцию порога памяти.
  • value указывает, что когда использование памяти достигает 90%, больше не препятствовать тому, чтобы lmkd убивал процесс.

Выберите функцию для перехвата

имя полятипописание
hookFuncobjectфункция ловушки
killboolПерехватывать ли функцию kill
pidfd_send_signalboolбудет ли hook pidfd_send_signal функция
__android_log_printboolбудет ли hook __android_log_print функция
meminfoobjectинформация о памяти
updateTimeintвремя обновления в секундах
  • hookFunc представляет функцию ловушки.
  • для kill установлено значение true, чтобы перехватывать функцию kill, управление памятью A1 будет перехватывать функцию kill; установите для него значение false, чтобы не перехватывать функцию kill.
  • pidfd_send_signal имеет значение true, чтобы перехватывать функцию pidfd_send_signal, управление памятью A1 будет цеплять функцию pidfd_send_signal, чтобы предотвратить завершение процесса; установите для него значение false, чтобы не цеплять функцию pidfd_send_signal.
  • Установите для __android_log_print значение true, чтобы перехватывать функцию __android_log_print, управление памятью A1 будет перехватывать функцию __android_log_print; установите для него значение false, чтобы не перехватывать функцию __android_log_print. Не рекомендуется включать эту функцию, поскольку это приведет к сбою вывода журнала и может вызвать исключение lmkd.

Время обновления информации о памяти

Эффективно избегайте потребления производительности, вызванного повторным обновлением информации в памяти meminfo, вы можете контролировать интервал обновления, устанавливая время обновления.

  • meminfo информация о памяти.
  • updateTime Время обновления занимаемой памяти в процентах, рекомендуемое значение от 30 до 90. Чем больше значение, тем больше интервал обновления и меньше потребление производительности; чем меньше значение, тем короче интервал обновления и больше потребление производительности.
имя полятипописание
modelobjectмодель
inlineHookstringрежим inlineHook
  • model указывает на образец.
  • inlineHook по умолчанию использует dobby для изменения адреса функции. Если хук нельзя использовать нормально, вы можете попробовать изменить его на [And64InlineHook](https: //github.com/Rprop/And64InlineHook).

Разрешить приложению спать, чтобы уменьшить использование ЦП и памяти

Управление памятью A1 v4 позволяет приложениям переходить в спящий режим, чтобы уменьшить использование ЦП и памяти. Ниже приведены примеры параметров, используемых для управления этим поведением:

имя полятипописание
appSleepobjectприложение сна
enableboolВключать ли гибернацию приложений для снижения использования ЦП и памяти
idlestringДля пользователей после бездействия все означает все/текущий означает текущего пользователя, текущий не действует на мультиоткрытие
bgstringстатус фонового приложения, ignore означает игнорирование запроса на пробуждение и запрос приложения на извлечение
topstringСтатус приложения переднего плана, разрешить означает разрешить запросы пробуждения и запросы приложений подтягивания
  • для enable установлено значение true, чтобы включить спящий режим приложения для сокращения операций использования ЦП и памяти; установите значение false, чтобы не выполнять.
  • настройка idle для пользователя после бездействия. Необязательные значения: все (все пользователи) и текущий (текущий пользователь), где текущий не влияет на мультиоткрытие.
  • bg настройки состояния фонового приложения. Необязательные значения: игнорировать (игнорировать запрос пробуждения и запрос приложения подтягивания), разрешить (разрешить запрос пробуждения и запрос приложения подтягивания), запретить (запретить запрос пробуждения и запрос приложения подтягивания). .
  • top установка состояния приложения переднего плана. Необязательные значения такие же, как и у параметра bg.

милый режим

Проще говоря, это означает убить подпроцесс приложения и попытаться предотвратить подтягивание подпроцесса основным процессом, чтобы приложение могло уменьшить использование ЦП и памяти. Чтобы удовлетворить потребности большего количества людей, управление памятью A1 v4 по умолчанию включает некоторые подпроцессы приложений, но это может по-прежнему не охватывать все ситуации. Если вам нужно УБИТЬ другие дочерние процессы, вы можете добавить их, отредактировав файл list.conf. Ниже приведен пример формата файла roster-list.conf:

KILL имя пакета: дочерний процесс
имя полятипописание
cleverobjectумный режим
enableboolВключать ли интеллектуальный режим

безумно бойня

Вызовите API ядра, чтобы убить некоторые процессы.Принцип пока не ясен, но он может эффективно убить некоторые процессы. Я думаю, об этом можно судить по значению oom. Ниже приведены примеры параметров, используемых для управления этим поведением:

имя полятипописание
crazyKillobjectбезумное убийство
enableboolРазрешить ли безумное убийство

Записать содержимое в файл

Содержимое может быть записано в файл. Ниже приведены примеры параметров, используемых для управления этим поведением:

"file": {
    "write": [
        {
            "path": "/proc/sys/fs/inotify/max_queued_events",
            "content": "102400"
        },
        {
            "path": "/proc/sys/fs/inotify/max_user_watches",
            "content": "102400"
        },
        ...
    ]
}

В приведенном выше примере мы записали содержимое в два файла, тем самым активировав функцию inotify.

имя полятипописание
writearrayзапись содержимого в файл
pathstringпуть к файлу
contentstringписьменный контент

После изменения файла конфигурации необходимо перезагрузить телефон или завершить процесс HC_memory, чтобы изменения вступили в силу.

Спасибо

Благодаря исходному коду следующих пользователей или проектов за их помощь в этом проекте:

Спасибо следующим пользователям за отзывы о тестировании и обнаружение ошибок:

  • @火機(coolapk)

Пожертвовать на поддержку

Как вы думаете, этот модуль очень полезен, вы можете пожертвовать, чтобы поддержать меня