├── APP └── assets │ └── page │ ├── home.sh │ └── other.xml ├── META-INF └── com │ └── google │ └── android │ ├── update-binary │ └── updater-script ├── README.md ├── busybox └── bin │ ├── add_whitelist │ ├── change_prop │ ├── getCurrentFocusAPP │ ├── getProcessState │ ├── getService │ ├── getUnlockState │ ├── get_difference │ ├── get_time │ ├── read_EAST │ ├── startWhitelistClean │ ├── take_same │ ├── time_duration │ └── write_EAST ├── config ├── Auto.sh ├── Focus.sh ├── Function.sh ├── Monitor.sh └── Refresh.sh ├── customize.sh ├── module.prop ├── service.sh └── uninstall.sh /APP/assets/page/home.sh: -------------------------------------------------------------------------------- 1 | conf=/data/media/0/Android/ASGuard.conf 2 | source "${conf}" >/dev/null 2>&1 3 | [[ -n "${MODPATH}" ]] && [[ -d "${MODPATH}" ]] || [[ -d /data/adb/modules/huzeASGuard ]] && MODPATH=/data/adb/modules/huzeASGuard || MODPATH="" 4 | prop="${MODPATH}/module.prop" 5 | LF=' ' 6 | amp='&' 7 | quot='"' 8 | 9 | ASGuardUIversion='1.6.5' 10 | ASGuardUIversionCode=202209041 11 | updata_text1="修改部分描述${LF}新增APP使用手册条目" 12 | new_version='v6.1' 13 | new_versionCode=202209041 14 | updata_text2="调整优化Auto模式运行逻辑${LF}修复已知bug${LF}提升AS列表内APP在Auto模式的优先级" 15 | if [[ -n "${MODPATH}" ]] && [[ -d "${MODPATH}" ]]; then 16 | installed=1 17 | uninstalled=0 18 | if [[ -f "${prop}" ]]; then 19 | source "${prop}" >/dev/null 2>&1 20 | description=$(cat "${prop}" | grep 'description') 21 | description=${description#*=} 22 | inform="模块作者:沍澤\n模块版本:${version}(${versionCode})\n\n模块简介\n${description}\n\n模块信息路径:${prop}" 23 | if [[ "${new_versionCode}" -gt "${versionCode}" ]]; then 24 | updata=1 25 | else 26 | updata=0 27 | fi 28 | else 29 | updata=0 30 | fi 31 | else 32 | installed=0 33 | uninstalled=1 34 | updata=0 35 | fi 36 | num1=$(echo "${AS}" | sed '/^$/d' | wc -l) 37 | num2=$(echo "${exAS}" | sed '/^$/d' | wc -l) 38 | num3=$(echo "${exclude}" | sed '/^$/d' | wc -l) 39 | num4=$(echo "${package_whitelist}" | sed '/^$/d' | wc -l) 40 | 41 | for var in $(echo ${exAS:-}); do 42 | result="$(dumpsys package ${var} | grep -s "ACCESSIBILITY_SERVICE" | sed 's/ /\n/g' | grep "${var}/" | sort | uniq)" 43 | if [[ -n "${result}" ]]; then 44 | result="$(echo "${result}" | sed "s:/\.:/${var}\.:g")" 45 | tmp="${tmp:-}${result} " 46 | fi 47 | done 48 | result="${tmp}" 49 | 50 | cat < 52 | 53 | 54 | 本应用为Magisk模块 无障碍服务守护(ASGuard) 的可视化配置界面,仅适配对应版本的模块 55 | 56 | 57 | ASGuardUI ${ASGuardUIversion}(${ASGuardUIversionCode}) 58 | ${updata_text1} 59 | 60 | 61 | 找不到模块安装目录!请检测是否(正确)安装! 62 | 请确保/sdcard/Android/ASGuard.conf文件没有被手机管家或其他模块当做垃圾清理! 63 | 面具包下载入口请点击 其它-下载完整包 64 | 65 | 66 | 67 | 68 | 更新版本 ${new_version}(${new_versionCode}) 69 | ${updata_text2} 70 | 71 | 72 | 73 | 开始更新 [模块beta版本对应APP的更新入口将一直显示] 74 | 无需额外下载,免重启更新,新版模块文件已内置APP 75 | 76 | if [[ -f './script/modulefiles/service.sh' ]] ${amp}${amp} [[ -f './script/modulefiles/module.prop' ]]; then 77 | echo '安装目录: '${MODPATH} 78 | echo '开始拷贝文件...' 79 | rm -rf ${MODPATH}/* 80 | cp -rvf ./script/modulefiles/* ${MODPATH}/ 81 | echo '正在运行模块' 82 | if [[ \$(ps -ef | grep '/huzeASGuard/' | grep -v grep | wc -l) -eq '0' ]]; then 83 | sh ${MODPATH}/service.sh 84 | else 85 | echo '正在结束模块进程...' 86 | ps -ef | grep "huzeASGuard" | grep -v grep | awk '{print \$2}' | xargs kill -9 87 | echo '重新运行模块进程...' 88 | sh ${MODPATH}/service.sh 89 | sleep 1 90 | fi 91 | echo '完成' 92 | echo '移除释放的更新文件' 93 | else 94 | echo '更新资源文件已被移除,结束ASGuardUI进程以重新释放更新文件...' 95 | fi 96 | 97 | 98 | 99 | 100 | 101 | 102 | if [[ ${installed} -eq 1 ]];then 103 | if [[ -f ${MODPATH}/disable ]]; then 104 | echo 0 105 | else 106 | if [[ \$(ps -ef | grep '/huzeASGuard/' | grep -v grep | wc -l) != '0' ]]; then 107 | echo 1 108 | else 109 | echo 0 110 | fi 111 | fi 112 | else 113 | echo 0 114 | fi 115 | 116 | 117 | if [[ \${state} -eq 0 ]]; then 118 | touch ${MODPATH}/disable 119 | ps -ef | grep '/huzeASGuard/' | grep -v grep | awk '{print \$2}' | xargs kill -9 120 | else 121 | [[ -f ${MODPATH}/disable ]] ${amp}${amp} rm ${MODPATH}/disable 122 | if [[ \$(ps -ef | grep 'ASGuard_Process.sh' | grep -v grep | wc -l) = '0' ]];then 123 | nohup sh ${MODPATH}/service.sh ${amp} 124 | fi 125 | fi 126 | 127 | 128 | if [[ ${installed} -eq 1 ]]; then 129 | echo 0 130 | else 131 | echo '模块路径未找到启动文件,确保/sdcard/Android/ASGuard.conf文件没被清理掉' 132 | fi 133 | 134 | 135 | 136 | 137 | 138 | 139 | 运行模式 [当前: ${mode}] 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | sh ./script/WriteConfig.sh 'mode' \${mo} 148 | 149 | 150 | 151 | 152 | 153 | 无障碍功能受保护APP [已配置${num1}个APP] 154 | 配置需要保护无障碍功能的APP (实时生效) 155 | 在Auto模式具有最高优先级 156 | 163 | 164 | sh ./script/WriteConfig.sh 'AS' ${quot}\${ASpackages}${quot} 165 | 166 | 167 | 168 | 电池优化白名单APP [已配置${num4}个APP] 169 | 配置开机后加入电池优化白名单的APP (重启模块生效) 170 | 177 | 178 | sh ./script/WriteConfig.sh 'package_whitelist' ${quot}\${WhitelistPackages}${quot} 179 | 180 | 181 | 182 | 监测周期 [当前设置: ${CTime}] 183 | 监测无障碍功能的频率周期 (当运行模式为R/M时有效) 184 | 191 | 192 | sh ./script/WriteConfig.sh 'CTime' \${Time} 193 | 194 | 195 | 196 | 197 | 198 | 过滤APP列表 [已指定${num2}个APP] 199 | Auto模式下这些APP将被忽略 200 | 207 | 208 | sh ./script/WriteConfig.sh 'exAS' ${quot}\${exASpackages}${quot} 209 | 210 | 211 | 212 | 过滤开关列表 [已指定${num3}个开关] 213 | 任何模式下这些APP的开关将被忽略,一般用于APP存在多个开关的情况 214 | 215 | 216 | 217 | sh ./script/WriteConfig.sh 'exclude' ${quot}\${exswitch}${quot} 218 | 219 | 220 | 221 | 222 | 223 | 清空电池优化白名单 224 | 开机90秒后将清空系统电池优化白名单并添加配置APP 225 | 注意: 开启此功能可能会导致系统某些功能睡死,部分应用及桌面部件功能可能受影响 226 | 227 | source ${conf} 228 | echo \${WhitelistCleaner} 229 | 230 | 231 | sh ./script/WriteConfig.sh 'WhitelistCleaner' \${state} 232 | 233 | 234 | 235 | 抓取Log 236 | 一般用于检查模块流程的问题 237 | 238 | source ${conf} 239 | echo \${log} 240 | 241 | 242 | sh ./script/WriteConfig.sh 'log' \${state} 243 | 244 | 245 | 246 | 开机关闭所有无障碍 247 | 开机时关闭所有APP的无障碍服务 248 | 249 | source ${conf} 250 | echo \${clean} 251 | 252 | 253 | sh ./script/WriteConfig.sh 'clean' \${state} 254 | 255 | 256 | 257 | 258 | EOF -------------------------------------------------------------------------------- /APP/assets/page/other.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 无障碍简易管理 5 | 这里可以显示一些系统菜单内没有列出的无障碍选项 6 | 7 | 8 | 9 | EAST=$(echo ${EAST} | sed 's/ /:/g') 10 | settings put secure enabled_accessibility_services "${EAST}" 11 | 12 | 13 | 14 | 15 | 16 | 查看详细配置内容 17 | 18 | if [ -f '/data/media/0/Android/ASGuard.conf' ]; then 19 | cat '/data/media/0/Android/ASGuard.conf' 20 | else 21 | echo '没有配置文件' 22 | fi 23 | 24 | 25 | 26 | 查看log 27 | 28 | if [[ -f '/data/media/0/Android/log_ASG.txt' ]]; then 29 | cat '/data/media/0/Android/log_ASG.txt' 30 | else 31 | echo '未发现log' 32 | fi 33 | 34 | 35 | 36 | 查看过滤开关 37 | 38 | source '/data/media/0/Android/ASGuard.conf' 39 | if [[ -n $(echo ${exclude}) ]]; then 40 | echo "${exclude}" | sed '/^$/d' 41 | else 42 | echo '未发现' 43 | fi 44 | 45 | 46 | 47 | 48 | 49 | 删除log 50 | 51 | if [[ -f '/data/media/0/Android/log_ASG.txt' ]]; then 52 | rm '/data/media/0/Android/log_ASG.txt' 53 | echo '已删除' 54 | else 55 | echo '无log文件' 56 | fi 57 | 58 | 59 | 60 | 61 | 62 | APP使用手册 63 | 64 | echo -e 'Q: 点击开关没反应?\nA: 点击开关后需要等待一小会儿,模块主要进程运行之后才会显示打开,不要连续点!\n\n' 65 | echo -e 'Q: 如何添加过滤开关列表?\nA: 先将需要过滤开关的APP添加到过滤APP列表,再选择过滤开关(过滤开关将从过滤APP列表中读取)\n\n' 66 | echo -e 'Q: 无障碍简易管理如何开启无障碍功能?\nA: 不支持开启,只能从中选择关闭\n\n' 67 | echo -e 'Q: 什么是Auto模式?\nA: 其实就是F模式和M模式的集成加强\n\n' 68 | 69 | 70 | 71 | 72 | 76 | 80 | 83 | 88 | 89 | -------------------------------------------------------------------------------- /META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | umask 022 3 | ui_print() { echo "$1"; } 4 | require_new_magisk() { 5 | ui_print "*******************************" 6 | ui_print " Please install Magisk v20.4+! " 7 | ui_print "*******************************" 8 | exit 1 9 | } 10 | OUTFD=$2 11 | ZIPFILE=$3 12 | mount /data 2>/dev/null 13 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk 14 | . /data/adb/magisk/util_functions.sh 15 | [ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk 16 | install_module 17 | exit 0 -------------------------------------------------------------------------------- /META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ASGuard 2 | Magisk模块,用于安卓的无障碍服务(或名:辅助功能)辅助管理模块 3 | 模块自带的四种运行机制(Auto/Monitor/Focus/Refresh)尽可能满足大部分人对无障碍功能需要时就开启,不需要的时候忽视的需求 4 | 此模块从2021年1月18号发布v1.0到现在,截至2022年4月14号粗略统计已更新34个版本,这不仅是我第一个更新维护长达一年的模块,也是我第一个出于兴趣开始制作的模块。 5 | 6 | # 运行机制 7 | ## Auto(此模式无须配置AS即可使用) 8 | 9 | 当应用处于前台时会将其辅助功能打开,并开始粗略记录该应用的进程状况,使用频率,使用频率趋势,简易判断辅助功能是否要开启或保持开启,处于AS列表内的APP具有更高的优先级,而一段时间没有记录前台则从记录列表中移除 10 | 11 | 12 | ## Monitor 13 | 14 | 周期监测系统辅助功能开启名单,如果其中的列表发生改变,并且被关闭的是AS列表内的APP,则重新将其打开,其他情况则忽略操作 15 | 16 | 17 | ## Focus 18 | 19 | 监测前台APP是为AS列表内的APP,如果该APP有相应的辅助功能,则将其打开 20 | 21 | 22 | ## Refresh 23 | 24 | 定时重启所有AS列表内APP的辅助功能 25 | 26 | # 配置 27 | 配置文件存放于/sdcard/Android/ASGuard.conf 28 | 29 | 配置方法可参考配置文件 30 | 31 | 过滤APP需要填入package name包名 32 | 33 | 过滤开关可通过以下命令获取: 34 | 35 | dumpsys package [PackageName]| grep -s "ACCESSIBILITY_SERVICE" | sed 's/ /\n/g' | fgrep "[PackageName]/." | sed "s:/\.:/[PackageName]\.:g" | sort | uniq 36 | 37 | 以上三处[PackageName]需要替换成查找的package name 38 | 39 | # 安装 40 | 下载zip之后通过Magisk manager刷入 41 | 42 | Magisk详细查看 43 | 44 | ![Magisk](https://github.com/topjohnwu/Magisk/raw/master/docs/images/logo.png) 45 | 46 | # APP 47 | APP是由酷安@嘟嘟ski提供的PIO框架二次创作而来,旨在于能够轻松修改ASGuard的配置,并非必需部分,可自行选择 48 | 49 | 而APP也提供了简易的无障碍管理功能,无需等待例如某些系统的开启警告倒计时 50 | 51 | # 作者的自说自话 52 | 首先呢我是一个小fw,做的并不是太好,可能还有些设备不能很好的运行,但是我真的很想把它做好,如果喜欢的话可以点亮小星星 53 | -------------------------------------------------------------------------------- /busybox/bin/add_whitelist: -------------------------------------------------------------------------------- 1 | #APP包名(空格或换行隔开) 2 | for var in $(echo ${1:-}); do 3 | dumpsys deviceidle whitelist +${var} 4 | done -------------------------------------------------------------------------------- /busybox/bin/change_prop: -------------------------------------------------------------------------------- 1 | #日志描述 标准描述(可选) 2 | cat < "${PROP}" 3 | id=huzeASGuard 4 | name=H-无障碍服务守护[ASGuard] 5 | version=${version} 6 | versionCode=${versionCode} 7 | author=沍澤 8 | description=${2:-一个无障碍功能管理模块.在获取root权限的APP完全替代一般获取无障碍权限的APP前的不错选择.}${1:+[}${1:-}${1:+]} 9 | PROP -------------------------------------------------------------------------------- /busybox/bin/getCurrentFocusAPP: -------------------------------------------------------------------------------- 1 | #获取当前窗口AppPackageName 2 | CurrentAPP="$(dumpsys window | grep mFocusedWindow | egrep -oh '[^ ]*/[^/}]+' | cut -f 1 -d '/')" 3 | if [[ -z "${CurrentAPP}" ]]; then 4 | CurrentAPP="$(dumpsys window | grep mFocusedApp | tail -n -1 | egrep -oh '[^ ]*/[^/}]+' | cut -f 1 -d '/')" 5 | fi 6 | echo "${CurrentAPP}" -------------------------------------------------------------------------------- /busybox/bin/getProcessState: -------------------------------------------------------------------------------- 1 | #APP包名(单个) 选项() 2 | #输出(5)启动时间点(7:CPU使用时间) 3 | if [[ -z ${1:-} ]]; then 4 | echo null 5 | return 1 6 | fi 7 | local package 8 | package=$1 9 | local option 10 | option=${2:-n} 11 | local data 12 | data=$(ps -ef | grep "${package}" | grep -v grep) 13 | for var in $(seq 1 $(echo "${data}" | wc -l)); do 14 | var=$(echo "${data}" | sed -n ${var}p | sed 's/ /\n/g' | sed '/^$/d') 15 | if [[ $(echo "${var}" | wc -l ) = 8 ]];then 16 | if [[ "$(echo "${var}" | sed -n 8p)" = "${package}" ]] || [[ $(echo "${var}" | grep "${package}:") ]]; then 17 | case ${option} in 18 | t) echo "${var}" | sed -n 5p ;; 19 | *) echo "true" ;; 20 | esac 21 | return 22 | fi 23 | fi 24 | done 25 | echo "false" -------------------------------------------------------------------------------- /busybox/bin/getService: -------------------------------------------------------------------------------- 1 | #APP包名 2 | if [[ -z "${1:-}" ]]; then 3 | return 1 4 | fi 5 | for var in $(echo ${1:-}); do 6 | result="$(dumpsys package ${var} | grep -s "ACCESSIBILITY_SERVICE" | sed 's/ /\n/g' | fgrep "${var}/." | sed "s:/\.:/${var}\.:g" | sort | uniq)" 7 | if [[ -n "${result}" ]];then 8 | tmp="${tmp:-}${result}\n" 9 | fi 10 | done 11 | local filter 12 | filter="com.android.settings" 13 | tmp=$(echo -e "${tmp}") 14 | for var in $(echo ${filter});do 15 | tmp=$(echo "${tmp}" | grep -v ${var}) 16 | done 17 | echo "${tmp}" | sort | uniq | sed '/^$/d' -------------------------------------------------------------------------------- /busybox/bin/getUnlockState: -------------------------------------------------------------------------------- 1 | if [[ -z $(dumpsys window policy | grep mInputRestricted | grep true) ]]; then 2 | echo true 3 | else 4 | echo false 5 | fi -------------------------------------------------------------------------------- /busybox/bin/get_difference: -------------------------------------------------------------------------------- 1 | echo -e "${1:-}${2:+\n}${2:-}" | sort | uniq -u -------------------------------------------------------------------------------- /busybox/bin/get_time: -------------------------------------------------------------------------------- 1 | case "${1:-0}" in 2 | 1) date '+%s' ;; 3 | *) date '+%X' ;; 4 | esac -------------------------------------------------------------------------------- /busybox/bin/read_EAST: -------------------------------------------------------------------------------- 1 | #读EAST(参数由write_EAST提供) 2 | var="$(settings get secure enabled_accessibility_services | sed 's/:/ /g') ${1:-}" 3 | for var in $(echo ${var}); do 4 | partA="${var%/*}" 5 | var="$(echo "${var}" | sed "s:/\.:/${partA}\.:g")" 6 | result="${result:-}${var}\n" 7 | done 8 | echo -e "${result}" | sort | uniq | sed '/^$/d' -------------------------------------------------------------------------------- /busybox/bin/startWhitelistClean: -------------------------------------------------------------------------------- 1 | #APP包名(空格或换行隔开) 2 | sleep 90 3 | if [[ ${WhitelistCleaner:-0} = 1 ]]; then 4 | mylog "开始清理电池优化白名单." "Whitelist" 5 | for line in $(echo $(pm list packages --user 0 | sed 's/package://g')); do 6 | dumpsys deviceidle whitelist -${line} >/dev/null 2>&1 7 | done 8 | fi 9 | add_whitelist "${1:-}" -------------------------------------------------------------------------------- /busybox/bin/take_same: -------------------------------------------------------------------------------- 1 | max=$(echo "${1:-}" | sort | uniq) 2 | min=$(echo "${2:-}" | sort | uniq) 3 | echo -e "${max}${min:+\n}${min}" | sort | uniq -d -------------------------------------------------------------------------------- /busybox/bin/time_duration: -------------------------------------------------------------------------------- 1 | (( ${2:-$(date '+%s')} - ${1:-$(date '+%s')} )) | awk '{t=split("60 s 60 m 24 h 999 d",a);for(n=1;n> "${LOG_PATH}" 5 | fi 6 | change_prop "更新配置时间:$(get_time)" "运行模式: A 排除应用个数:$(echo "${exAS:-}" | sed '/^$/d' | wc -l)" 7 | mylog "正在运行..." "A" 8 | ST=4 9 | switch=1 10 | n=0 11 | m=0 12 | for var in $(echo ${AS}); do 13 | write_EAST "$(getService "${var}")" 14 | done 15 | EAST="$(read_EAST)" 16 | if_config_change() { 17 | if [[ "$(ls -l "${CONFIG%/*}/" | fgrep "${CONFIG##*/}")" != "${LastConf}" ]]; then 18 | load_config 19 | EAS="$(getService "${AS:-}")" 20 | LastConf="$(ls -l "${CONFIG%/*}/" | grep "${CONFIG##*/}")" 21 | change_prop "更新配置时间:$(get_time)" "运行模式: A 排除应用个数:$(echo "${exAS:-}" | sed '/^$/d' | wc -l)" 22 | mylog "配置文件已被修改." "ASGuard.conf" 23 | fi 24 | } 25 | exEAS() { 26 | ##删去排除名单 27 | local result var result 28 | result="${1:-}" 29 | for var in $(echo ${exclude}); do 30 | result="$(echo "${result}" | grep -v "${var}")" 31 | done 32 | echo "${result}" 33 | } 34 | while true; do 35 | if [[ ! -f "${DIR}/disable" ]]; then 36 | if [[ ${switch} == 0 ]]; then 37 | change_prop "重新运行" 38 | switch=1 39 | nohup sh "${DIR}/service.sh" & 40 | exit 0 41 | fi 42 | while [[ $(getUnlockState) == true ]] && [[ ${mode} == 'A' ]]; do 43 | [[ -f "${DIR}/disable" ]] && break 44 | n=$(( n + 1 )) 45 | old_EAST="${EAST}" 46 | sleep ${ST} 47 | ##获取焦点窗口APP## 48 | EAST="$(read_EAST)" 49 | CFA="$(getCurrentFocusAPP)" 50 | ##排除指定APP## 51 | [[ -n $(echo "${exAS}" | fgrep -w "${CFA}") ]] && CFA="" 52 | if [[ "${EAST}" != "${old_EAST}" ]]; then 53 | sameEAST=$(take_same "${EAST}" "${old_EAST}") 54 | decreaseEAST=$(get_difference "${old_EAST}" "${sameEAST}") 55 | fi 56 | for var in $(echo $(echo -e "${AL}\n${AS//./_}" | sort | uniq)); do 57 | Td="$(getProcessState ${var//_/.} t)" 58 | if [[ -n $(echo "${AS}" | fgrep "${var//_/.}") ]]; then 59 | write_EAST "$(echo "${EAS:-}" | fgrep "${var//_/.}")" 60 | mylog "开启优先级应用无障碍开关." "${var//_/.}" 61 | elif [[ $(eval "echo \${${var}_Td}") != ${Td} ]] || [[ -n $(echo "${decreaseEAST}" | fgrep "${var//_/.}/") ]]; then 62 | if [[ ${Td} != false ]]; then 63 | write_EAST "$(getService "${var//_/.}")" 64 | mylog "为进程开启无障碍服务." "${var//_/.}" 65 | fi 66 | eval "${var}_Td=${Td}" 67 | fi 68 | done 69 | willWrite="$(getService "${CFA}")" 70 | willWrite="$(exEAS "${willWrite}")" 71 | if [[ -n ${willWrite} ]]; then 72 | mylog "无障碍功能应用获得焦点." "${CFA}" 73 | if [[ -z $(echo "${AL}" | fgrep "${CFA//./_}") ]]; then 74 | write_EAST "${willWrite}" 75 | mylog "已开启无障碍功能." "${CFA}" 76 | mylog "已加入AL名单." "${CFA}" 77 | AL="${AL:-}${AL:+\n}${CFA}" 78 | ##替换包名如com.huze.ASGuard替换为com_huze_ASGuard## 79 | AL=$(echo "${AL//./_}" | sort | uniq) 80 | eval "${CFA//./_}_Td=$(getProcessState ${CFA} t)" 81 | eval "${CFA//./_}_Fre5=\$(( \${${CFA//./_}_Fre5:-0} + 1 ))" 82 | eval "${CFA//./_}_Fre10=\$(( \${${CFA//./_}_Fre10:-0} + 1 ))" 83 | ##最近大约五分钟使用频率是否大于最近大约十分钟的前五分钟使用频率## 84 | elif [[ $(eval "(( ${var}_Fre10 - ${var}_Fre5 ))") < $(eval "echo \${${var}_Fre5}") ]]; then 85 | write_EAST "$(getService "${var//_/.}")" 86 | mylog "开启常用应用无障碍开关." "${var//_/.}" 87 | fi 88 | willWrite="" 89 | fi 90 | if [[ ${m} -gt 1 ]]; then 91 | for var in $(echo ${AL}); do 92 | if [[ $(eval "echo \${${var}_Fre5}") == 0 ]]; then 93 | ##去除长时间未打开的APP名单## 94 | AL=$(echo "${AL}" | fgrep -vw "${var}") 95 | eval "unset ${var}_Fre10 ${var}_Fre5 ${var}_Td" 96 | mylog "从AL名单中移除." "${var//_/.}" 97 | else 98 | eval "${var}_Fre10=${var}_Fre5" 99 | fi 100 | done 101 | m=0 102 | fi 103 | if [[ ${n} -gt 75 ]]; then 104 | for var in $(echo ${AL}); do 105 | eval "${var}_Fre5=0" 106 | done 107 | n=0 108 | m=$(( m + 1 )) 109 | fi 110 | if_config_change 111 | done 112 | else 113 | if [[ ${switch} = 1 ]]; then 114 | change_prop "暂停服务" 115 | mylog "暂停服务" "ASGuard" 116 | switch=0 117 | fi 118 | fi 119 | sleep $(( ${ST} + 6 )) 120 | if [[ ${mode} != 'A' ]]; then 121 | change_prop "重新运行" 122 | nohup sh "${DIR}/service.sh" & 123 | exit 0 124 | fi 125 | done 126 | exit 10 -------------------------------------------------------------------------------- /config/Focus.sh: -------------------------------------------------------------------------------- 1 | source "${DIR}/config/Function.sh" 2 | if [[ $? != 0 ]]; then 3 | change_prop "错误" "Function.sh加载失败" 4 | exit 1 >> "${LOG_PATH}" 5 | fi 6 | change_prop "更新配置时间:$(get_time)" "运行模式: F 指定应用个数:$(echo "${AS:-}" | sed '/^$/d' | wc -l)" 7 | mylog "正在运行..." "F" 8 | ST=4 9 | switch=1 10 | if_config_change() { 11 | if [[ "$(ls -l "${CONFIG%/*}/" | fgrep "${CONFIG##*/}")" != "${LastConf}" ]]; then 12 | load_config 13 | LastConf=$(ls -l "${CONFIG%/*}/" | grep "${CONFIG##*/}") 14 | if [[ "${AS}" != "${old_AS}" ]]; then 15 | sameAS=$(take_same "${AS}" "${old_AS}") 16 | increaseAS=$(get_difference "${AS}" "${sameAS}") 17 | fi 18 | ##匹配AS的无障碍开关 19 | result=$(getService "${increaseAS}") 20 | EAS=$(echo -e "${result}\n${EAS}" | sort | uniq | sed '/^$/d') 21 | ##删去排除名单 22 | for var in $(echo ${exclude}); do 23 | EAS=$(echo "${EAS}" | grep -v "${var}") 24 | done 25 | change_prop "更新配置时间:$(get_time)" "运行模式: F 指定应用个数:$(echo "${AS:-}" | sed '/^$/d' | wc -l)" 26 | mylog "配置文件已被修改." "ASGuard.conf" 27 | fi 28 | } 29 | while true; do 30 | if [[ ! -f "${DIR}/disable" ]]; then 31 | if [[ ${switch} = 0 ]]; then 32 | change_prop "重新运行" 33 | switch=1 34 | nohup sh "${DIR}/service.sh" & 35 | exit 0 36 | fi 37 | if_config_change 38 | while [[ -n ${AS} ]] && [[ ${mode} = 'F' ]]; do 39 | CurrentAPP=$(getCurrentFocusAPP) 40 | if [[ "${CurrentAPP}" != "${Before}" ]]; then 41 | mylog "应用获取焦点." "${CurrentAPP}" 42 | Before=${CurrentAPP} 43 | fi 44 | if [[ -n $(echo "${AS}" | grep -w "${CurrentAPP}") ]]; then 45 | willWrite=$(get_EAS "${CurrentAPP}") 46 | write_EAST "${willWrite}" 47 | fi 48 | sleep ${ST} 49 | [[ -f "${DIR}/disable" ]] && break 50 | if_config_change 51 | done 52 | else 53 | if [[ ${switch} = 1 ]]; then 54 | change_prop "暂停服务" 55 | mylog "暂停服务" "ASGuard" 56 | switch=0 57 | fi 58 | fi 59 | sleep $(( ${ST} + 6 )) 60 | if [[ ${mode} != 'F' ]]; then 61 | change_prop "重新运行" 62 | nohup sh "${DIR}/service.sh" & 63 | exit 0 64 | fi 65 | done 66 | done 67 | exit 10 -------------------------------------------------------------------------------- /config/Function.sh: -------------------------------------------------------------------------------- 1 | releaseConfig() { 2 | cat < "${CONFIG}" 3 | #面板日期:2022.04.30#作者:酷安@沍澤#QQ用户群:837934310# 4 | #======================提示======================== 5 | #需要保护的APP包名请填在下面AS的" "内,一行一个!不要填在" "外面!否则无法正常运行! 6 | #填在AS配置里的包名不需要填到package_Whitelist里面 7 | AS=" 8 | ${AS:-} 9 | " 10 | 11 | #排除名单包名(当运行模式为A时有效) 12 | exAS=" 13 | ${exAS:-} 14 | " 15 | 16 | #这个是电池优化白名单列表,开机后先清空电池优化百名单,再将列表内APP加入电池优化白名单,修改此项开机时生效 17 | #一行一个包名,填在" "内! 18 | package_whitelist=" 19 | ${package_whitelist:-} 20 | " 21 | 22 | #模式运行周期时间(当运行模式为R/M时有效,默认为10,单位: M:秒 R:分) 23 | CTime=${CTime:-10} 24 | 25 | #是否开启log日志(开启/关闭: 1/0) 26 | log=${log:-1} 27 | 28 | #是否开机时关闭所有无障碍服务(开启/关闭: 1/0) 29 | clean=${clean:-1} 30 | 31 | #是否清空电池优化白名单(开启/关闭: 1/0) 32 | WhitelistCleaner=${WhitelistCleaner:-0} 33 | 34 | #运行模式(A/M/F/R) 35 | #A(Auto): 自动管理开启相应无障碍功能无须配置AS即可使用 36 | #M(Monitor): 监控无障碍服务的启用应用,将被关闭的无障碍服务重新开启 37 | #F(Focus): 选择该模式在开机时不会自动打开无障碍服务,直到列表内的APP处于焦点窗口时若app未打开无障碍服务,则将其打开 38 | #R(Refresh): 该模式为定时刷新的增强版,定时刷新开启状态 39 | mode=${mode:-A} 40 | 41 | #过滤无障碍开关 42 | #名单内的无障碍将会被忽略 43 | exclude=" 44 | ${exclude:-} 45 | " 46 | 47 | #对于不同版本magisk(如正式版和lite版)安装路径略有不同,此用于定位模块安装目录的参数,请不要修改 48 | MODPATH="${DIR}" 49 | 50 | EOF 51 | } 52 | 53 | load_config() { 54 | if [[ -f "${CONFIG}" ]]; then 55 | source "${CONFIG}" 56 | fi 57 | AS=$(echo "${AS:-}" | sort | uniq | sed '/^$/d') 58 | exAS=$(echo "${exAS:-}" | sort | uniq | sed '/^$/d') 59 | exclude=$(echo "${exclude:-}" | sort | uniq | sed '/^$/d') 60 | package_whitelist=$(echo "${package_whitelist:-}" | sed '/^$/d') 61 | CTime=$(echo ${CTime:-3} | tr -cd "[0-9]") 62 | log=$(echo ${log:-1} | tr -cd "[0-1]") 63 | clean=$(echo ${clean:-0} | tr -cd "[0-1]") 64 | mode=${mode:-A} 65 | [[ $(echo ${CTime:-3}) -lt 1 ]] && CTime=5 66 | ReloadTime=$(echo ${ReloadTime:=0} | tr -cd "[0-9]") 67 | releaseConfig 68 | } 69 | 70 | get_EAS() { 71 | #APP包名 72 | if [[ -n "${1:-}" ]]; then 73 | local tmp resule var 74 | for var in $(echo $1); do 75 | tmp=$(echo "${EAS}" | grep "${var}/") 76 | resule="${resule}${tmp:-}\n" 77 | done 78 | echo -e "${resule}" | sort | uniq | sed '/^$/d' 79 | fi 80 | } 81 | 82 | mylog() { 83 | if [[ ${log:-1} != 0 ]]; then 84 | [[ -z ${1:-} ]] || echo -e "[$(date "+%m-%d %X")] [${mode:-A}]${2:+ [}${2:-}${2:+]}: "${1:-Empty Log} >> /data/media/0/Android/log_ASG.txt 85 | [[ $(cat /data/media/0/Android/log_ASG.txt | wc -l) -gt 200 ]] && sed -i '6d' /data/media/0/Android/log_ASG.txt && [[ $(cat /data/media/0/Android/log_ASG.txt | wc -l) -gt 200 ]] && sed -i '6d' /data/media/0/Android/log_ASG.txt 86 | fi 87 | } 88 | 89 | change_prop() { 90 | #日志描述 标准描述(可选) 91 | cat < "${PROP}" 92 | id=huzeASGuard 93 | name=H-无障碍服务守护[ASGuard] 94 | version=${version} 95 | versionCode=${versionCode} 96 | author=沍澤 97 | description=${2:-一个无障碍功能管理模块.在获取root权限的APP完全替代一般获取无障碍权限的APP前的不错选择.}${1:+[}${1:-}${1:+]} 98 | PROP 99 | } 100 | -------------------------------------------------------------------------------- /config/Monitor.sh: -------------------------------------------------------------------------------- 1 | source "${DIR}/config/Function.sh" 2 | if [[ $? != 0 ]]; then 3 | change_prop "错误" "Function.sh加载失败" 4 | exit 1 >> "${LOG_PATH}" 5 | fi 6 | change_prop "更新配置时间:$(get_time)" "运行模式: M 监控应用个数:$(echo "${AS:-}" | sed '/^$/d' | wc -l)" 7 | mylog "正在运行..." "M" 8 | write_EAST "${EAS}" 9 | EAST="$(read_EAST)" 10 | old_AS="${AS}" 11 | old_EAST="${EAST}" 12 | switch=1 13 | if_config_change() { 14 | if [[ "$(ls -l "${CONFIG%/*}/" | fgrep "${CONFIG##*/}")" != "${LastConf}" ]]; then 15 | load_config 16 | LastConf=$(ls -l "${CONFIG%/*}/" | grep "${CONFIG##*/}") 17 | if [[ "${AS}" != "${old_AS}" ]]; then 18 | sameAS=$(take_same "${AS}" "${old_AS}") 19 | increaseAS=$(get_difference "${AS}" "${sameAS}") 20 | fi 21 | ##匹配AS的无障碍开关 22 | result="$(getService "${increaseAS}")" 23 | EAS="$(echo -e "${result}\n${EAS}" | sort | uniq | sed '/^$/d')" 24 | ##删去排除名单 25 | for var in $(echo ${exclude}); do 26 | EAS="$(echo "${EAS}" | grep -v "${var}")" 27 | done 28 | change_prop "更新配置时间:$(get_time)" "运行模式: M 监控应用个数:$(echo "${AS:-}" | sed '/^$/d' | wc -l)" 29 | mylog "配置文件已被修改." "ASGuard.conf" 30 | fi 31 | } 32 | while true; do 33 | if [[ ! -f "${DIR}/disable" ]]; then 34 | if [[ ${switch} = 0 ]]; then 35 | change_prop "重新运行" 36 | nohup sh "${DIR}/service.sh" & 37 | exit 0 38 | fi 39 | if_config_change 40 | while [[ -n "${AS}" ]] && [[ ${mode} = 'M' ]]; do 41 | EAST="$(read_EAST)" 42 | if [[ "${EAST}" != "${old_EAST}" ]]; then 43 | sameEAST=$(take_same "${EAST}" "${old_EAST}") 44 | decreaseEAST=$(get_difference "${old_EAST}" "${sameEAST}") 45 | decreaseEAST=$(take_same "${decreaseEAST}" "${EAS}") 46 | fi 47 | willWrite=$(get_EAS "${increaseAS}") 48 | willWrite=$(echo -e "${willWrite}\n${decreaseEAST}") 49 | if [[ -n "${willWrite}" ]]; then 50 | write_EAST "${willWrite}" 51 | mylog "${willWrite}" "M" 52 | fi 53 | EAST="$(read_EAST)" 54 | old_EAST="${EAST}" 55 | old_AS="${AS}" 56 | willWrite="" 57 | increaseAS="" 58 | decreaseEAST="" 59 | sameEAST="" 60 | sameAS="" 61 | sleep "${CTime}" 62 | [[ -f "${DIR}/disable" ]] && break 63 | if_config_change 64 | done 65 | else 66 | if [[ ${switch} = 1 ]]; then 67 | change_prop "暂停服务" 68 | mylog "暂停服务" "ASGuard" 69 | switch=0 70 | fi 71 | fi 72 | sleep $(( ${CTime} + 6 )) 73 | if [[ ${mode} != 'M' ]]; then 74 | change_prop "重新运行" 75 | nohup sh "${DIR}/service.sh" & 76 | exit 0 77 | fi 78 | done 79 | exit 10 -------------------------------------------------------------------------------- /config/Refresh.sh: -------------------------------------------------------------------------------- 1 | source "${DIR}/config/Function.sh" 2 | if [[ $? != 0 ]]; then 3 | change_prop "错误" "Function.sh加载失败" 4 | exit 1 >> "${LOG_PATH}" 5 | fi 6 | change_prop "更新配置时间:$(get_time)" "运行模式: R " 7 | mylog "正在运行..." "R" 8 | load_config 9 | switch=1 10 | if_config_change() { 11 | if [[ "$(ls -l "${CONFIG%/*}/" | fgrep "${CONFIG##*/}")" != "${LastConf}" ]]; then 12 | load_config 13 | LastConf=$(ls -l "${CONFIG%/*}/" | grep "${CONFIG##*/}") 14 | if [[ "${AS}" != "${old_AS}" ]]; then 15 | sameAS=$(take_same "${AS}" "${old_AS}") 16 | increaseAS=$(get_difference "${AS}" "${sameAS}") 17 | fi 18 | ##匹配AS的无障碍开关 19 | result=$(getService "${increaseAS}") 20 | EAS=$(echo -e "${result}\n${EAS}" | sort | uniq | sed '/^$/d') 21 | ##删去排除名单 22 | for var in $(echo ${exclude}); do 23 | EAS=$(echo "${EAS}" | grep -v "${var}") 24 | done 25 | change_prop "更新配置时间:$(get_time)" "运行模式: R" 26 | mylog "配置文件已被修改." "ASGuard.conf" 27 | fi 28 | } 29 | while true; do 30 | if [[ ! -f "${DIR}/disable" ]]; then 31 | if [[ ${switch} = 0 ]]; then 32 | change_prop "重新运行" 33 | switch=1 34 | nohup sh "${DIR}/service.sh" & 35 | exit 0 36 | fi 37 | if_config_change 38 | while [[ -n ${AS} ]] && [[ ${mode} = 'R' ]]; do 39 | EAST=$(read_EAST) 40 | write_EAST -c 41 | write_EAST "${EAST} ${EAS}" 42 | mylog "刷新开关." "R" 43 | sleep $(( ${CTime} * 60 )) 44 | [[ -f "${DIR}/disable" ]] && break 45 | if_config_change 46 | done 47 | else 48 | if [[ ${switch} = 1 ]]; then 49 | change_prop "暂停服务" 50 | mylog "暂停服务" "ASGuard" 51 | switch=0 52 | fi 53 | fi 54 | sleep $(( ${CTime} + 6 )) 55 | if [[ ${mode} != 'R' ]]; then 56 | change_prop "重新运行" 57 | nohup sh "${DIR}/service.sh" & 58 | exit 0 59 | fi 60 | done 61 | exit 10 -------------------------------------------------------------------------------- /customize.sh: -------------------------------------------------------------------------------- 1 | #BOOTMODE(布尔):true如果模块已安装在Magisk应用中 2 | #MODPATH (路径):应在其中安装模块文件的路径 3 | timer_start=$(date "+%Y-%m-%d %H:%M:%S") 4 | LogPrint() { echo "$1" ; } 5 | WriteConfig() { 6 | touch /data/media/0/Android/ASGuard.conf 7 | LogPrint "- 调整外部配置文件权限组(3/3)" 8 | chmod 664 /data/media/0/Android/ASGuard.conf 9 | chown 'media_rw:media_rw' /data/media/0/Android/ASGuard.conf 10 | } 11 | model="$(grep_prop ro.product.system.model)" 12 | version="$(grep_prop version ${MODPATH}/module.prop)" 13 | versioncode="$(grep_prop versionCode ${MODPATH}/module.prop)" 14 | var_version="$(grep_prop ro.build.version.release)" 15 | name="$(grep_prop name ${MODPATH}/module.prop)" 16 | description="$(grep_prop description ${MODPATH}/module.prop)" 17 | cat < "${LOG_PATH}" 24 | fi 25 | ##读取配置后记录文件信息,当文件信息产生改动重新读取## 26 | load_config 27 | LastConf="$(ls -l "${CONFIG%/*}/" | grep "${CONFIG##*/}")" 28 | if [[ ${log=1} -ne 0 ]]; then 29 | echo "${inform}" > "${LOG_PATH}" 30 | echo "运行日期:$(date '+%Y.%m.%d %X')" >> "${LOG_PATH}" 31 | else 32 | [[ -f "${LOG_PATH}" ]] && rm -rf "${LOG_PATH}" >/dev/null 2>&1 33 | fi 34 | 35 | ##电池优化白名单操作## 36 | startWhitelistClean "${AS} ${package_whitelist}" & 37 | mylog "${AS} ${package_whitelist}" "Whitelist" 38 | 39 | ##匹配AS的无障碍开关## 40 | EAS="$(getService "${AS:-}")" 41 | 42 | ##删去排除名单## 43 | for var in $(echo ${exclude}); do 44 | EAS="$(echo "${EAS}" | grep -v "${var}")" 45 | done 46 | mylog "${exclude}" "过滤开关" 47 | 48 | ##判断是否清空已开启的无障碍## 49 | if [[ ${clean} == 1 ]]; then 50 | write_EAST -c 51 | fi 52 | 53 | ##选择加载文件路径## 54 | case "${mode:-A}" in 55 | R) file="${DIR}/config/Refresh.sh" ;; 56 | F) file="${DIR}/config/Focus.sh" ;; 57 | M) file="${DIR}/config/Monitor.sh" ;; 58 | *) file="${DIR}/config/Auto.sh" ;; 59 | esac 60 | if [[ ! -f "${file}" ]]; then 61 | mylog "\"${file}\"文件丢失" 62 | change_prop "加载失败" "${file}文件丢失" 63 | exit 2 > "${LOG_PATH}" 64 | fi 65 | cp -f "${file}" "${DIR}/ASGuard_Process.sh" 66 | chmod 111 "${DIR}/ASGuard_Process.sh" 67 | chown 'root:root' "${DIR}/ASGuard_Process.sh" 68 | settings put secure accessibility_enabled 1 69 | while [[ "$(ps -ef | grep 'ASGuard_Process' | grep -v grep | wc -l)" == "0" ]]; do 70 | nohup sh "${DIR}/ASGuard_Process.sh" & 71 | sleep 2 72 | done 73 | exit -------------------------------------------------------------------------------- /uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/system/bin/sh 2 | rm /data/media/0/Android/ASGuard.config 3 | rm /data/media/0/Android/ASGuard.config.bak 4 | rm /data/media/0/Android/log_ASG.txt 5 | exit 0 --------------------------------------------------------------------------------