Skip to content

Commit

Permalink
DEV 21.03.14
Browse files Browse the repository at this point in the history
1. 本次更新合并了30+个commit
2. 新增:SfBoost游戏操作时专用SfLag,降低非掉帧时最大频率改进能耗比,掉帧时释放最大性能降低停顿时长
3. 新增:自定义配置与日志目录迁移到/sdcard/yc/uperf/,弃用panel文件,开放cfg_uperf.json供用户自定义,如调整频率范围
4. 新增:屏幕刷新率切换改用surfaceflinger backdoor法,兼容Android 10+
5. 新增:高通平台c-state设置,避免过早进入c3很快再次唤醒引入0.5ms滞后
6. 新增:高通平台动态force_no_nap,减少复杂过渡动画GPU引入的卡顿
7. 修复:android.hardware.power由于空白配置文件格式错误崩溃,导致部分设备循环重启
8. 修复:min_refresh_rate设置未清理,导致模块卸载后帧率被锁定为最大值
9. 修复:非magisk安装方式运行后没有停用系统perfhal
10. 修复:音频编码线程被固定在小核,导致视频录制破音
11. 修复:费电模式安兔兔跑分超大核空载,导致跑分偏低
12. 修复:由于屏幕刷新率切换通知到系统框架,导致SsAnim错误拉起耗电,即使没有系统动画发生
13. 修复:顶层应用离开顶层后没有触发当前顶层应用检查,导致帧率切换未响应
14. 修复:sfanalysis渲染状态检测为了匹配动态刷新率灵敏度过低,影响到掉帧检测
15. 改进:动态屏幕刷新率降低前延迟降低到600ms,切换响应更快
16. 改进:sfanalysis用户内容刷新率自适应响应更快,60hz->120hz检测延迟从350ms降低到200ms
17. 改进:禁用高通perfhal采用空白targetconfig.json法
18. 改进:指纹识别线程更容易放置到超大核
19. 改进:APP主线程识别准确度

Signed-off-by: Matt Yang <yccy@outlook.com>
  • Loading branch information
yc9559 committed Mar 14, 2021
1 parent a526fd2 commit c5cdd1d
Show file tree
Hide file tree
Showing 16 changed files with 127 additions and 450 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ https://github.com/yc9559/uperf/releases
### Magisk方式

1. 下载后通过Magisk Manager刷入,Magisk版本不低于18.0
2. 重启后查看`/sdcard/Android/log_uperf.txt`检查uperf是否正常自启动
2. 重启后查看`/sdcard/yc/uperf/log_uperf.txt`检查uperf是否正常自启动

### 手动安装

Expand All @@ -40,13 +40,13 @@ https://github.com/yc9559/uperf/releases
6. 打开`/data/cache/injector.log`,检查sfanalysis注入是否成功
7. 如果关联自启动到第三方APP,设置在开机完成后执行`run_uperf.sh`
8. 如果关联自启动到系统启动脚本,插入`sh /data/uperf/initsvc_uperf.sh`
9. 重启后查看`/sdcard/Android/log_uperf.txt`检查uperf是否正常自启动
9. 重启后查看`/sdcard/yc/uperf/log_uperf.txt`检查uperf是否正常自启动

### 性能模式切换

#### 修改启动时的默认性能模式

1. 打开`/sdcard/Android/panel_uperf.txt`
1. 打开`/sdcard/yc/uperf/panel_uperf.txt`
2. 修改`default_mode=balance`, 其中`balance`为开机后使用的默认性能模式,可选的模式有:
- `balance`均衡模式,比原厂略流畅的同时略省电
- `powersave`卡顿模式,保证基本流畅的同时尽可能降低功耗
Expand Down Expand Up @@ -214,7 +214,7 @@ Sfanalysis是一个独立于Uperf的模块,注入到surfaceflinger进行修改

## 自定义配置文件

本项目已经为大多数热门硬件平台提供了调参后的Uperf配置文件,但总有一些情况预调参的配置不适用于你的软硬件平台,例如冷门的硬件平台、自定义的内核。此外,也有自定义现有预调参配置文件的需求,例如调高交互时的最低CPU频率、增加GPU频率范围调整。在Uperf设计之初便考虑到了这类需求,开放几乎所有的可调参数,并且在配置文件更改保存后自动重新加载,改善在手机端调试参数的效率。Magisk模块使用的配置文件位于`/data/adb/modules/uperf/config/cfg_uperf.json`
本项目已经为大多数热门硬件平台提供了调参后的Uperf配置文件,但总有一些情况预调参的配置不适用于你的软硬件平台,例如冷门的硬件平台、自定义的内核。此外,也有自定义现有预调参配置文件的需求,例如调高交互时的最低CPU频率、增加GPU频率范围调整。在Uperf设计之初便考虑到了这类需求,开放几乎所有的可调参数,并且在配置文件更改保存后自动重新加载,改善在手机端调试参数的效率。Magisk模块使用的配置文件位于`/sdcard/yc/uperf/cfg_uperf.json`

### 元信息

Expand All @@ -241,7 +241,7 @@ Sfanalysis是一个独立于Uperf的模块,注入到surfaceflinger进行修改

```json
"common": {
"switchInode": "/data/uperf_powermode",
"switchInode": "/sdcard/yc/uperf/cur_powermode",
"verboseLog": false,
"uxAffinity": true,
"stateTransThd": {
Expand Down Expand Up @@ -279,12 +279,12 @@ Sfanalysis是一个独立于Uperf的模块,注入到surfaceflinger进行修改

在Uperf启动时会读取`switchInode`对应路径的文件获取默认性能模式,在日志以如下方式体现:
```
[13:03:33][I] CfgMgr: Read default powermode from /data/uperf_powermode
[13:03:33][I] CfgMgr: Read default powermode from /sdcard/yc/uperf/cur_powermode
[13:03:33][I] CfgMgr: Powermode "(null)" -> "balance"
```
`switchInode`对应路径的文件,监听新模式名称的写入完成模式切换:
```shell
echo "powersave" > /data/uperf_powermode
echo "powersave" > /sdcard/yc/uperf/cur_powermode
```
在日志以如下方式体现:
```
Expand Down
8 changes: 2 additions & 6 deletions magisk/common/post-fs-data.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,12 @@ MODDIR=${0%/*}
# vendor/etc/powerhint.json: android perf hal
# vendor/etc/powerscntbl.cfg: mediatek perf hal (android 9)
# vendor/etc/powerscntbl.xml: mediatek perf hal (android 10+)
# vendor/etc/perf/perfboostsconfig.json: qualcomm perf hal
# vendor/etc/perf/commonresourceconfigs.json: qualcomm perf hal resource path
# vendor/etc/perf/targetresourceconfigs.json: qualcomm perf hal resource path overrides
# vendor/etc/perf/targetconfig.json: qualcomm perf hal targets
perfcfgs="
vendor/etc/powerhint.json
vendor/etc/powerscntbl.cfg
vendor/etc/powerscntbl.xml
vendor/etc/perf/perfboostsconfig.xml
vendor/etc/perf/commonresourceconfigs.xml
vendor/etc/perf/targetresourceconfigs.xml
vendor/etc/perf/targetconfig.xml
"
for f in $perfcfgs; do
[ ! -f "/$f" ] && rm "$MODDIR/system/$f"
Expand Down
15 changes: 9 additions & 6 deletions magisk/config/cfg_uperf_display.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
# Uperf dynamic refresh rate config
# 规则优先级从高到低排列,最多64条
# 格式:包名 空闲fps 画面内容更新fps 触摸操作fps
# 例子:
# tv.danmaku.bili 60 60 120
# com.hypergryph.arknights 60 60 60
# * 60 120 120
# 规则优先级从高到低排列,"*"表示全局默认规则,最多64条
# idx: 系统支持的刷新率索引,0/1/2/...对应的帧率需要自行尝试。
# 例如系统支持60/90/120hz刷新率,0:120hz,1:90hz,2:60hz
# 例如系统支持60/90hz刷新率,0:90hz,1:60hz
# 格式:包名 空闲idx 画面内容更新idx 触摸操作idx

# com.tencent.tmgp.sgame 1 1 1
# com.hypergryph.arknights 2 2 2
# * 2 2 0
2 changes: 1 addition & 1 deletion magisk/module.prop
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
id=uperf
name=Uperf
version=v2 (21.02.28)
version=v2 (21.03.14)
versionCode=2
author=Matt Yang
description=Userspace performance controller for android. Repo: https://github.com/yc9559/uperf/
Expand Down
1 change: 0 additions & 1 deletion magisk/run_uperf.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,4 @@ chmod 755 /data/powercfg-base.sh
echo "sh $SCRIPT_DIR/powercfg_main.sh \"\$1\"" >> /data/powercfg.sh

sh $SCRIPT_DIR/start_injector.sh
sh $SCRIPT_DIR/powercfg_main.sh
sh $SCRIPT_DIR/powercfg_once.sh
11 changes: 10 additions & 1 deletion magisk/script/libcommon.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Basic Tool Library
# https://github.com/yc9559/
# Author: Matt Yang
# Version: 20210225
# Version: 20210309

BASEDIR="$(dirname "$0")"
. $BASEDIR/pathinfo.sh
Expand Down Expand Up @@ -138,6 +138,15 @@ is_aarch64()
fi
}

is_mtk()
{
if [ "$(getprop | grep ro.mtk)" != "" ]; then
echo "true"
else
echo "false"
fi
}

is_magisk()
{
if [ "$(echo $BASEDIR | grep "^\/data\/adb\/modules")" != "" ]; then
Expand Down
15 changes: 9 additions & 6 deletions magisk/script/libuperf.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Uperf Library
# https://github.com/yc9559/
# Author: Matt Yang
# Version: 20210225
# Version: 20210304

BASEDIR="$(dirname "$0")"
. $BASEDIR/pathinfo.sh
Expand All @@ -20,9 +20,9 @@ UPERF_NAME="uperf"
# Uperf tool functions
###############################

uperf_config_path="$MODULE_PATH/config/cfg_uperf.json"
uperf_log_path="/sdcard/Android/log_uperf.txt"
uperf_powermode_node="/data/uperf_powermode"
uperf_config_path="$USER_PATH/cfg_uperf.json"
uperf_log_path="$USER_PATH/log_uperf.txt"
uperf_powermode_node="/sdcard/yc/uperf/cur_powermode"

# $1:mode_name
uperf_set_powermode()
Expand Down Expand Up @@ -53,10 +53,13 @@ uperf_start()
lock_val "131072" /proc/sys/fs/inotify/max_user_watches
lock_val "1024" /proc/sys/fs/inotify/max_user_instances

# cleanup
cmd settings delete system min_refresh_rate

# start uperf
"$MODULE_PATH/$UPERF_REL/$UPERF_NAME" -o "$uperf_log_path" "$uperf_config_path"
# waiting for uperf initialization
sleep 2
# uperf shouldn't preempt foreground tasks, pin on cpu0-1
change_task_affinity "$UPERF_NAME" "3"
# uperf shouldn't preempt foreground tasks
pin_proc_on_pwr "$UPERF_NAME"
}
5 changes: 3 additions & 2 deletions magisk/script/pathinfo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ SCRIPT_DIR="script"
BIN_DIR="bin"
MODULE_PATH="$(dirname $(readlink -f "$0"))"
MODULE_PATH="${MODULE_PATH%\/$SCRIPT_DIR}"
PANEL_FILE="/sdcard/Android/panel_uperf.txt"
LOG_FILE="/sdcard/Android/log_uperf_initsvc.log"
USER_PATH="/sdcard/yc/uperf"
PANEL_FILE="$USER_PATH/panel_uperf.txt"
LOG_FILE="$USER_PATH/log_uperf_initsvc.log"

# prefer to use magisk's busybox and busybox for android ndk
PATH="/sbin:/system/sbin:/system/xbin:/system/bin:/vendor/xbin:/vendor/bin"
Expand Down
26 changes: 0 additions & 26 deletions magisk/script/powercfg_main.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,6 @@ verify_power_mode()
esac
}

save_panel()
{
clear_panel
write_panel ""
write_panel "Uperf https://github.com/yc9559/uperf/"
write_panel "Author: Matt Yang"
write_panel "Version: v2 (21.02.28)"
write_panel "Last performed: $(date '+%Y-%m-%d %H:%M:%S')"
write_panel ""
write_panel "[Uperf status]"
write_panel "$(uperf_status)"
write_panel ""
write_panel "[Settings]"
write_panel "# The default mode applied at boot"
write_panel "# Available mode: balance powersave performance"
write_panel "default_mode=$default_mode"
}

# 1. target from exec parameter
action="$1"
if [ "$action" != "" ]; then
Expand All @@ -50,12 +32,4 @@ if [ "$action" != "" ]; then
exit 0
fi

# 2. target from panel
default_mode="$(read_cfg_value default_mode)"
default_mode="$(verify_power_mode "$default_mode")"
apply_power_mode "$default_mode"

# save mode for automatic applying mode after reboot
save_panel

exit 0
79 changes: 44 additions & 35 deletions magisk/script/powercfg_once.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,20 @@ BASEDIR="$(dirname "$0")"

unify_cgroup()
{
# clear stune
lock_val "0" /dev/stune/background/schedtune.sched_boost_no_override
lock_val "0" /dev/stune/background/schedtune.boost
lock_val "0" /dev/stune/background/schedtune.prefer_idle
lock_val "0" /dev/stune/foreground/schedtune.sched_boost_no_override
lock_val "0" /dev/stune/foreground/schedtune.boost
lock_val "0" /dev/stune/foreground/schedtune.prefer_idle
lock_val "1" /dev/stune/top-app/schedtune.sched_boost_no_override
lock_val "0" /dev/stune/top-app/schedtune.boost
lock_val "0" /dev/stune/top-app/schedtune.prefer_idle

# clear uclamp
lock_val "0" /dev/cpuctl/background/cpu.uclamp.sched_boost_no_override
lock_val "0" /dev/cpuctl/background/cpu.uclamp.min
lock_val "0" /dev/cpuctl/background/cpu.uclamp.latency_sensitive
lock_val "0" /dev/cpuctl/foreground/cpu.uclamp.sched_boost_no_override
lock_val "0" /dev/cpuctl/foreground/cpu.uclamp.min
lock_val "0" /dev/cpuctl/foreground/cpu.uclamp.latency_sensitive
lock_val "1" /dev/cpuctl/top-app/cpu.uclamp.sched_boost_no_override
lock_val "0" /dev/cpuctl/top-app/cpu.uclamp.min
lock_val "0" /dev/cpuctl/top-app/cpu.uclamp.latency_sensitive
# clear stune & uclamp
for g in background foreground top-app; do
lock_val "0" /dev/stune/$g/schedtune.sched_boost_no_override
lock_val "0" /dev/stune/$g/schedtune.boost
lock_val "0" /dev/stune/$g/schedtune.prefer_idle
lock_val "0" /dev/cpuctl/$g/cpu.uclamp.sched_boost_no_override
lock_val "0" /dev/cpuctl/$g/cpu.uclamp.min
lock_val "0" /dev/cpuctl/$g/cpu.uclamp.latency_sensitive
done
for cg in stune cpuctl; do
for p in $(cat /dev/$cg/top-app/tasks); do
echo $p > /dev/$cg/foreground/tasks
done
done

# VMOS may set cpuset/background/cpus to "0"
lock_val "$(cat /dev/cpuset/foreground/cpus)" /dev/cpuset/foreground/boost/cpus
Expand All @@ -47,16 +40,16 @@ unify_cgroup()
pin_proc_on_pwr "netd"
pin_proc_on_pwr "mdnsd"
pin_proc_on_pwr "pdnsd"
pin_proc_on_pwr "qcrild"
pin_proc_on_pwr "daemon"
pin_proc_on_pwr "analytics"
pin_proc_on_pwr "daemon"
change_task_affinity "android\.system\.suspend" "7f"
# hardware services, eg. android.hardware.sensors@1.0-service
pin_proc_on_pwr "\.hardware\."
# pwr cluster has enough capacity for surfaceflinger
pin_proc_on_pwr "surfaceflinger"
# MediaProvider is background service
pin_proc_on_pwr "com\.android\.providers\.media"
pin_proc_on_pwr "android\.process\.media"
pin_proc_on_mid "com\.android\.providers\.media"
# com.miui.securitycenter & com.miui.securityadd
pin_proc_on_pwr "miui\.security"

Expand All @@ -81,6 +74,7 @@ unify_cgroup()
pin_thread_on_pwr "system_server" "Observer"
pin_thread_on_pwr "system_server" "Power"
pin_thread_on_pwr "system_server" "Sensor"
pin_thread_on_pwr "system_server" "batterystats"
pin_thread_on_pwr "system_server" "Thread-"
pin_thread_on_pwr "system_server" "pool-"
pin_thread_on_pwr "system_server" "Jit thread pool"
Expand All @@ -107,20 +101,25 @@ unify_cgroup()
# let UX related Binders run with top-app
change_thread_cgroup "surfaceflinger" "^Binder" "top-app" "cpuset"
change_thread_cgroup "system_server" "^Binder" "top-app" "cpuset"
change_thread_cgroup "system_server" "^Binder" "top-app" "stune"
change_thread_cgroup "system_server" "^Binder" "top-app" "cpuctl"
change_thread_cgroup "\.hardware\.display" "^Binder" "top-app" "cpuset"
change_thread_cgroup "\.composer" "^Binder" "top-app" "cpuset"
# transition animation
change_thread_cgroup "system_server" "android\.anim" "top-app" "cpuset"

# Heavy Scene Boost
# camera service
unpin_proc "\.hardware\.camera\.provider"
# camera & video recording
pin_proc_on_mid "\.hardware\.camera"
pin_proc_on_mid "^camera"
pin_proc_on_mid "\.hardware\.audio"
pin_proc_on_mid "^audio"
# provide best performance for fingerprint service
unpin_proc "\.hardware\.biometrics\.fingerprint"
pin_proc_on_perf "\.hardware\.biometrics\.fingerprint"
change_task_high_prio "\.hardware\.biometrics\.fingerprint"
# mfp-daemon: goodix in-screen fingerprint daemon
unpin_proc "mfp"
change_task_high_prio "mfp"
pin_proc_on_perf "mfp-daemon"
change_task_high_prio "mfp-daemon"
# boost app boot process, zygote--com.xxxx.xxx
unpin_proc "zygote"
change_task_high_prio "zygote"
Expand Down Expand Up @@ -205,7 +204,7 @@ unify_sched()
# The same Binder, A55@1.0g took 7.3ms,A76@1.0g took 3.0ms, in this case, A76's efficiency is 2.4x of A55's.
# However in EAS model A76's efficiency is 1.7x of A55's, so the migrate thresholds need compensate.
set_sched_migrate "50" "25" "999" "888"
set_sched_migrate "50 80" "25 40" "999" "888"
set_sched_migrate "50 90" "25 50" "999" "888"

# prefer to use prev cpu, decrease jitter from 0.5ms to 0.3ms with lpm settings
# system_server binders maybe pinned on perf cluster due to this
Expand All @@ -214,10 +213,17 @@ unify_sched()

unify_lpm()
{
# C-state controller
lock_val "1" $LPM/lpm_prediction
# enter C-state level 3 took ~500us
lock_val "0" $LPM/sleep_disabled
lock_val "10" $LPM/bias_hyst
lock_val "0" $LPM/lpm_ipi_prediction
if [ -f "$LPM/bias_hyst" ]; then
lock_val "1" $LPM/bias_hyst
lock_val "0" $LPM/lpm_prediction
else
lock_val "1" $LPM/lpm_prediction
fi
lock_val "255" $SCHED/sched_busy_hysteresis_enable_cpus
lock_val "1000000" $SCHED/sched_busy_hyst_ns
}

disable_hotplug()
Expand Down Expand Up @@ -336,8 +342,11 @@ disable_userspace_boost()
stop perfd 2> /dev/null

# Qualcomm&MTK perfhal
# keep running with empty config file
# perfhal_stop
# keep perfhal running with empty config file in magisk mode
[ "$(is_magisk)" == "false" ] && perfhal_stop

# xiaomi perfservice
stop vendor.perfservice

# brain service maybe not smart
stop oneplus_brain_service 2> /dev/null
Expand Down
Loading

0 comments on commit c5cdd1d

Please sign in to comment.