常见问题总结
流畅度
最近任务脚本判断规则
上划进最近任务监控WindowAnmation的场景
脚本通过监控字符串识别认为是上帧
Layername: Surface(name=Task比如下面这个

放大后脚本认为的latchBuffer是 Layername: Surface(name=77861dd StatusBar)/@0x6f52c23 - animation-leash of insets_animation#42527这个标签所在的位置

不过目前对这个的准确性存疑,需要进一步增加log定位
去除水印
目前两种方式
-
通过修改配置问题去除
https://gerrit.pt.mioffice.cn/c/miui/frameworks/base/+/4397477/1/core/java/miui/os/Build.java#282
-
在合成时去除对应layer
Trace中遇到D状态怎么解决
目前mi有排查问题的具体措施,如果问题是高概率复现的,可以通过打开开过抓SystemTrace定位资源加载,详细见
https://xiaomi.f.mioffice.cn/docx/doxk4m4EFgjXlUAq2IXHZT9VMSy

MIUIX打开LOG开关
adb shell setprop log.tag.folme.level 73.1MIUIX文档 https://xiaomi.f.mioffice.cn/wiki/NsWDwI1pziIfWtkfQVakPkQz4Jc
线程D状态拆解
https://xiaomi.f.mioffice.cn/docx/doxk4m4EFgjXlUAq2IXHZT9VMSy
高温限频 - 高温限频问题可以考虑温度穿透
流畅度分析如果CPU频率低,首先需要排除高温限频问题;284Log直接搜索 thermal sensor board temp is xxx,一般的当温度大于38℃需要进行复测


避免频繁JIT
新安装的应用会出现频繁JIT,可以尝试手动执行 AOT 编译
查找你的应用安装路径,并使用
dex2oat工具对应用进行 AOT 编译:
adb shell dex2oat --dex-file=/data/app/~~Q3UGHxi-PTXsA5mfq0bUmg==/com.miui.home-bBknLgLQo0LCGZLTiSIYmQ==/base.apk --oat-file=/data/app/~~Q3UGHxi-PTXsA5mfq0bUmg==/com.miui.home-bBknLgLQo0LCGZLTiSIYmQ==/base.aot
请注意,这种方法要求你对设备有 root 权限,并且这仅适用于开发和测试环境。

编译优化
| 名称 | 文档链接 | 描述 |
|---|---|---|
| 主动编译桌面代码为机器码,提高运行效率 | adb shell pm compile -r bg-dexopt com.miui.home | 命令尝试主动编译桌面代码为机器码:adb shell pm -r bg-dexopt-job com.miui.home |
| 查看APK的编译状态 | dumpsys package +包名 | |
| 预编译:手机安装完测试app后,打开app至少10s后, 执行pm bg-dexopt-job 目的:防止出现全部编译达到几个小时。这样个别内置应用的状态会是quicken,和竞品对齐是没有影响的;其中执行pm bg-dexopt-job命令(pm bg-dexopt-job执行speed-profile模式编译,只会对热点代码做编译,首次打开应用后进入主页10秒左右才会生成热点代码)没有参数时对所有应用做speed-profile模式编译,命令后加包名则只对该包编译。例如,只对抖音和快手两个应用编译: pm bg-dexopt-job com.ss.android.ugc.aweme com.smile.gifmaker 监测编译是否成功:命令执行完成后会输出Success,然后通过adb shell dumpsys package 包名, 查看,如果第4行status是speed-profile,reason是bg-dexopt表示预编编译成功。 |
3. 使用 dexopt 或 pm compile 命令
-
手动触发编译优化流程,减少首次运行 JIT 开销。
-
示例:
adb shell cmd package compile -m speed -f your.package.name-m speed:使用 AOT 编译以提升运行性能。-f:强制重新编译。
详细参考:应用编译优化.md
Perffetto负载看看
https://perfetto.pt.xiaomi.com/#!/viewer
GPU 相关问题总结
### 1. GPU频率怎么看
#### 高通
```shell
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies //GPU的可支持频率
```

MTK
```shell
adb shell cat /sys/kernel/ged/hal/current_freqency //GPU的可支持频率
```

//循环查看GPU频率
```shell
while true; do adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq; done //循环查看GPU频率
```
GC 问题
桌面场景出现频繁GC问题,尤其最近任务场景明显,可以考虑是不是SmartGC没有进版对应分支可以通过 persist.sys_gc.enable 标识验证

SmartGC相关change https://gerrit.pt.mioffice.cn/c/device/xiaomi/breeze/+/5288523

没有进版前Trace特征
cache_miss问题
valkan出现cache_miss问题RenderThread线程下可见关键词 creategraphicspipeline

像这种就是cache_miss问题十分严重了,有很大可能就是GPU有更新了

使用命令查看对应应用或者进程shader是否新增
adb shell ls -al /data/user_de/0/com.miui.personalassistant/cache
操作过程发生新增说明比如total大小发生改变或者文件数量发生改变说明
- shader预制不足
- GPU升级了
- shader预制过期,应用端有更新
解决方案可以结合实际场景再次预制,参考文档 GeneralAndroid/main/blog/Android性能/图形图像/渲染与绘制/Skia Cache Miss 1.0方案适配更新说明.md
可以通过场景操作过程不断尝试dump shader cache大小的方案判断是不是存在没有预制shader的问题


上面这种,随着操作shader缓存可以穷尽的,就是有shader没有预制,但是这个场景可以shader可以穷尽的情况,这种情况通过上面的cache_miss 1.0 预制即可
另一个问题GPU的更新可以导致shader缓存失效,查看GPU信息可以用这个查opengl的命令判断GPU,一般opengl和vulkan是同步的
adb shell dumpsys SurfaceFlinger | grep GLES
检测 hwui 是否使用 vulkan
adb shell dumpsys gfxinfo com.miui.home | grep Pipeline屏幕刷新率
通过ADB命令行改变,手机刷新率
可以通过这个命令调整:adb shell "service call SurfaceFlinger 31117 i32 120"
可以通过上面这一组命令来手动的切换屏屏幕刷新率
一般有alpha blending或者缩放 就有可能走gpu合成
刷机后无法开机问题排查
- 开机后执行命令
adb logcat -b crash > error_log.txt - 快速分析堆栈
3. 针对问题修改代码
V抓取WMS动态日志方法
https://xiaomi.f.mioffice.cn/wiki/MEJ5wECt0iwQNhkRhK6kfpn84De

稳定性相关
通过284分析定位到机器内存低、应用占用内存大、机器IO&memory&cpu问题
典型JIRA https://jira-phone.mioffice.cn/browse/BUGOS2-28556
具体问题表现如下
watchdog并没有锁死,而是运行慢导致锁堆积,迟迟等不到锁
1、机器的cpu/memory/io压力都比较高
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: Enter WATCHDOG
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: ----- Output from /proc/pressure/memory -----
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: some avg10=8.89 avg60=39.11 avg300=49.39 total=4401501355
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: full avg10=5.91 avg60=25.18 avg300=32.20 total=2640407027
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: ----- End output from /proc/pressure/memory -----
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: ----- Output from /proc/pressure/cpu -----
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: some avg10=59.15 avg60=55.05 avg300=51.69 total=15166117199
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: full avg10=0.00 avg60=0.00 avg300=0.00 total=0
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: ----- End output from /proc/pressure/cpu -----
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: ----- Output from /proc/pressure/io -----
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: some avg10=13.62 avg60=57.86 avg300=66.53 total=2918844713
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: full avg10=2.38 avg60=12.37 avg300=15.16 total=517786827
07-06 06:59:03.266 1000 2162 2225 W MIUIScout Watchdog: ----- End output from /proc/pressure/io -----
2、机器内存较低,out of memory
07-06 06:58:41.924 1000 2240 2240 I oom-kill: constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=foreground,mems_allowed=0,global_oom,task_memcg=/,task=ndroid.systemui,pid=10207,uid=1000
07-06 06:58:41.927 1000 2240 2240 E : Out of memory: Killed process 10207 (ndroid.systemui) total-vm:20602456kB, anon-rss:0kB, file-rss:33132kB, shmem-rss:2156kB, UID:1000 pgtables:3768kB oom_score_adj:-800
..........
07-06 06:58:48.062 1000 2162 23971 I AppProfilerImpl: Low on memory:
07-06 06:58:48.062 1000 2162 23971 I AppProfilerImpl: ntv ?? 1564598: surfaceflinger (1,383,376K memtrack) (pid 1850) native
07-06 06:58:48.062 1000 2162 23971 I AppProfilerImpl: ntv ?? 390310: vendor.qti.camera.provider-service_64 (pid 1642) native
3、systemui占了大量内存,并且触发了OOM
Subject: Scout low memory – 10240MB total / 500MB system / 5120MB systemui 40MB phone 30MB daemon 30MB sysservice 20MB process 20MB xmsfkeeper 20MB location 15MB workloadclassifier 15MB qcc 15MB qtidataservices 15MB phone 15MB qms 15MB xpan 15MB dataservices 15MB systemhelper:systemhelper_service 15MB system 15MB touchservice 15MB se 15MB qcdcktimesync 15MB polaris 15MB ims / 80MB module 30MB bluetooth / 5MB account 5MB analytics 5MB sysopt:adb_monitor_service 5MB bluetooth
Build: Xiaomi/uke/uke:15/AQ3A.240605.001/OS2.0.240705.1.VOZCNXM.PRE:user/release-keys
Number of processes: 239
TOP 1 Pid:10207 Process:com.android.systemui Pss:3633209 Java Heap Pss:214 Native Heap Pss:235 Graphics Pss:3373316
TOP 2 Pid:1850 Process:surfaceflinger Pss:1479381 Java Heap Pss:0 Native Heap Pss:30204 Graphics Pss:1301352
TOP 3 Pid:2162 Process:system Pss:463531 Java Heap Pss:1704 Native Heap Pss:6314 Graphics Pss:7848
4、systemui可能存在内存泄漏,导致机器内存不足,进一步影响性能
systemui的同学内部互相看一下具体属于哪个模块SurfaceFlinger稳定性01-Layerx泄漏问题日志增强方案

解决方案
使用 《SurfaceFlinger稳定性O1-Layerx泄漏问题日志增强方案》可以见文档 https://xiaomi.f.mioffice.cn/docx/doxk47tUJYR69gPB3qSzlDPe9hg

桌面是否支持0ms&&打断
MiuiHome/app/recents/src/com/miui/home/recents/anim/FastLaunchUtils.kt FastLaunchUtils
class FastLaunchUtils {
companion object {
private const val TAG = "FastLaunchUtils"
fun isSupportFastLaunch(intent: Intent, tag: Any?, v: View?): Boolean {//单独类处理
if (v == null) {
Log.i(TAG, "view is error v=" + v)
return false
}
if (!Utilities.ATLEAST_U) {
Log.i(TAG, "not ATLEAST_U")
return false
}
if (!DeviceConfig.IS_FRAMEWORK_SUPPORT_QUICK_START) {
Log.i(TAG, "IS_FRAMEWORK_SUPPORT_QUICK_START not support")
return false
}
if (DeviceLevelUtils.isLowLevelOrLiteDevice()) {
Log.i(TAG, "isLowLevelOrLiteDevice")
return false
}
if (DeviceLevelUtils.isUseSimpleAnim()) {
Log.i(TAG, "isUseSimpleAnim")
return false
}
if (DeviceConfig.isInMultiWindowMode()) {
Log.i(TAG, "isInMultiWindowMode")
return false
}
val pairPackageName = intent.getStringExtra(PairUtils.EXTRA_PAIR_PACK[Readme.md](../../../../../../../usr/share/typora/resources/style/themes/Readme.md)AGE_NAME)
if (pairPackageName != null && !pairPackageName.isEmpty()) {
Log.i(TAG, "has pairPackageName")
return false
}
if ((v is LauncherAble) != true) {// && (v is WidgetTypeAnimTarget) != true 小部件暂时不支持
Log.i(TAG, "v type is error v=$v")
return false
}
if (tag is ShortcutInfo != true) {
Log.i(TAG, "tag info is error tag=$tag")
return false
}
if (tag is ShortcutInfo) {
//快捷方式的图标
if (tag.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
Log.i(
TAG,
"is ITEM_TYPE_DEEP_SHORTCUT"
)
return false
}
}
// 包含在上面了,后续方案再修改
// if (tag is PairShortcutInfo) {
// Log.i(TAG, "is PairShortcutInfo")
// return false
// }
//如果当前正在显示负一屏,如果当前正在半分屏状态, 不用快起
if (Application.getLauncher() == null
|| Application.getLauncher()!!.stateManager == null
|| SoscSplitScreenController.getInstance().isHalfSplitMode
|| AnimatorDurationScaleHelper.isCloseAnimator()
|| Application.getLauncher()!!.stateManager.state != LauncherState.NORMAL
|| LauncherSoscController.getInstance().soscEvent.isSoscSplit
) {
Log.i(TAG, "state is error")
return false
}
if (!TextUtils.isEmpty(intent.component?.packageName)) {
val curPackage = intent.component?.packageName
if (QuickstepAppTransitionManagerImpl.TRANSLUCENT_PACKAGE.contains(curPackage)) {
Log.i(TAG, "Current package is translucent, not support fastLaunch.")
return false
} else if (SmallWindowStateHelper.getInstance().isPkgInSmallWindowMode(
curPackage, LauncherUtils.getUserId(android.os.Process.myUserHandle()))) {
Log.i(TAG, "Current package is in small window mode, not support fastLaunch.")
return false
}
}
Log.i(TAG, "use Fastlaunch")
return true
}
支持0ms返回 use Fastlaunch ,如miot1810果不支持返回不支持原因
打断支持和兼容
OS2部分机器上调和下修效果,产品对部分机器进行了特殊配置,这部分定义在
MiuiHome/app/src/com/miui/home/launcher/common/DeviceLevelUtils.java
//如下面就是终端机使用了手势效果,OS2新增了
public static final Set<String> FORCE_USE_COMPLETE_ANIM_DEVICES = new ArraySet<>();
static {
FORCE_USE_COMPLETE_ANIM_DEVICES.add("polaris"); //E5G
FORCE_USE_COMPLETE_ANIM_DEVICES.add("dipper"); //E1
FORCE_USE_COMPLETE_ANIM_DEVICES.add("equuleus");//E1S
FORCE_USE_COMPLETE_ANIM_DEVICES.add("perseus"); //E5
FORCE_USE_COMPLETE_ANIM_DEVICES.add("ursa"); //F11
FORCE_USE_COMPLETE_ANIM_DEVICES.add("monet"); //J9
FORCE_USE_COMPLETE_ANIM_DEVICES.add("monetin");
FORCE_USE_COMPLETE_ANIM_DEVICES.add("vangogh"); //J9A
FORCE_USE_COMPLETE_ANIM_DEVICES.add("cezanne"); //J10
FORCE_USE_COMPLETE_ANIM_DEVICES.add("atom"); //J7A
FORCE_USE_COMPLETE_ANIM_DEVICES.add("bomb"); //J7B
FORCE_USE_COMPLETE_ANIM_DEVICES.add("duchamp"); //N11A
FORCE_USE_COMPLETE_ANIM_DEVICES.add("yuechu"); //M9
FORCE_USE_COMPLETE_ANIM_DEVICES.add("peridot"); //N16T
}
比如今年新增机器有N11A、M9、N16T 本身是middle机器,但是但强制上了分层
其他特殊机器
O6这个机器强制开启了手势线程
同事渲染相关问题总结
付瑶
https://xiaomi.f.mioffice.cn/wiki/wikk4VpCKVtvrgu5M40VEokEvKb
MIUI代码提交
git push ssh://zhoubencheng@gerrit.pt.mioffice.cn:29418/platform/packages/apps/MiuiHome HEAD:refs/for/os2-stable各个负责人
| 事项 | 接口人 | |
|---|---|---|
| 脚本input | luwei9 v-weijunhua | ![]() |
用户使用暗码抓取Hprof&&meminfo
1.抓取状态栏/锁屏/通知栏/控制中心 hprof文件步骤:
- 打开电话拨号界面
- 输入:#79783684#,按拨号键。(简单记法:9宫格键盘对应systemui)
- 当看到Toast提示“capture sysui heap complete”后表明抓取完成。
- Hprof地址为:文件管理-手机-MIUI-SysUI,长按sysui.hprof文件,点击发送,可通过微信/飞书发给研发。
- 使用命令抓取meminfo:adb shell dumpsys meminfo com.android.systemui >meminfo.txt
- 把终端所在目录下的meminfo.txt发送到微信/飞书;
2.抓取桌面 hprof文件步骤:
- 打开电话拨号界面
- 输入:#64844663#,按拨号键。(简单记法:9宫格键盘对应miuihome)
- 当看到Toast提示“capture home heap complete”后表明抓取完成。
- Hprof地址为:文件管理-手机-MIUI-Home,长按home.hprof文件,点击发送,可通过微信/飞书发给研发。
- 使用命令抓取meminfo:adb shell dumpsys meminfo com.miui.home >meminfo.txt
- 把终端所在目录下的meminfo.txt发送到微信/飞书;
Native中插桩打印堆栈
1. 需要打印的位置插入这个h文件引用
#include "utils/CallStack.h"
2. 打印堆栈
android::CallStack cs(“haha”);
3. Android.bp中加入:
shared_libs [
....
"libutilscallstack",
....
]打印效果展示
温控相关
当前场景:
/sys/class/thermal/thermal_message/sconfig
温控解密配置文件(温度和对应频率):
/data/vendor/thermal/decrypt.txt
温控boost节点(温控穿透后cpu/gpu的频率):
/sys/class/thermal/thermal_message/boost
温控日志(包含历史温度和对应时间):
adb pull /data/vendor/thermal/thermal.dump
trace :

温控配置:
device/xiaomi/amethyst:odm/thermal-config
温控源码:
vendor/xiaomi/proprietary/thermald
bugreport怎么看高温
高温限频一般看壳温,壳温可以通过
dumpstate_board.txt 下的 "VIRTUAL-SENSOR-FORMULA" 这个关键字下温度查看


PDF转换
https://www.ilovepdf.com/zh-cn

Native代码增加log
// 主要打印Native测试堆栈
#include "utils/CallStack.h"
android::CallStack cs(“haha”);
Android.bp中加入:
shared_libs [
....
"libutilscallstack",
....
]具体参考文档:Android源码本地编译实践 Android 中打印 C++代码中的调用堆栈相关部分
Java native库打印log
//获取输出流
std::ostringstream ss;
//拼接打印格式
ss << "Thread::Park tid: " << tls32_.tid << "\n";
//dumpJava层堆栈
DumpJavaStack(ss);
//使用log方式打印出来
LOG(WARNING) << ss.str();具体参考文档:Android源码本地编译实践 Android 中打印 C++代码中的调用堆栈相关部分
adb 跳过开机引导
具体参考文档:Android源码本地编译实践 adb 跳过开机引导相关部分
IO D状态问题排查
[具体参考文档:Android源码本地编译实践](../Android性能/D状态问题排查/IO D状态问题排查.md)
Framework C打日志
hwc打印日志
#include <log/log.h>
String8 cachesOutput;
log.appendFormat(" IsSystemOrPersistent\n");
log.appendFormat(" Glyph Count: %d \n", SkGraphics::GetFontCacheCountUsed());
ALOGV("%s", cachesOutput.c_str());
std::ostringstream err;
err << "Unable to create layer for " << node->getName();
const int maxTextureSize = DeviceInfo::get()->maxTextureSize();
err << ", size " << info.width() << "x" << info.height() << " max size "
<< maxTextureSize << " color type " << (int)info.colorType() << " has context "
<< (int)(mRenderThread.getGrContext() != nullptr);代码中查看大小核信息
private String mCoreSchedRule = SystemProperties.get("persist.sys.miui_animator_sched.big_prime_cores", "default");VIPtask 中的温度穿透 TurboSchedMonitorImpl
persist.sys.turbosched.thermal_break.enable最近任务0ms
怎么判断有没有进版0ms功能
system_server下的startActivity末尾会直接通过binder调用到桌面startActivityFinished

还有一个方式判断0ms;就是 Transition-OPENSyncGroupReady 和 MHWAnimation# OPEN_FROM_HOME会重合,意味着桌面动画的开始可以不等待动画窗口收集完成

此时桌面你的binder线程startActivityFinished中会做两件事

1.调用TurboSchedManager::setDynamicVIPTaskIfNeeded对当前线程优先调度
ITurboSchedManager::setTurboSchedActionWithPriority接口对home ui Thread、renderThread、hwui0、hwui1执行异步优先调度

0ms下以下结论成立:
- 第一个知识点
system_server下的Transition-OPENSyncGroupReady标签是startActivity过程中触发的动画collection Ready的标识

Transition-TO_FRONTSyncGroupReady是应用回桌面的标识,如打断

动画分离日志开关
adb shell setprop persist.sys.sfAnim.dynamic.log true
adb shell stop; adb shell start日志确实解决方案-离线日志
离线日志是小米的一个日志增强,主要优点是对比原生的bugreport不容易丢失日志
查看logcat日志
清理之前缓存区日志
adb logcat -c和后面的日志过滤连在一起使用
adb logcat -c |adb logcat | grep "xxxx"如果想过滤某个日志级别的日志
adb logcat *:I MyApp:D *:S如果想过滤某个tag的日志
adb logcat Launcher:* TAG2:D *:S过滤表达式:tag:priority …格式,其中 tag 表示您感兴趣的标记,priority 表示可针对该标记报告的最低优先级。不低于指定优先级的标记的消息会写入日志。在一个过滤表达式中提供任意数量的 tag:priority 规范。一系列规范使用空格分隔。
以下是一个过滤表达式的示例,该表达式会抑制除标记为“ActivityManager”、优先级不低于“信息”的日志消息,以及标记为“MyApp”、优先级不低于“调试”的日志消息以外的所有其他日志消息:
adb logcat ActivityManager:I MyApp:D *:S上述表达式中最后一个元素 *:S 将所有标记的优先级设为“静默”,从而确保系统仅显示标记为“ActivityManager”和“MyApp”的日志消息。使用 :S 可确保日志输出受限于您已明确指定的过滤器。:S 可以让过滤器充当日志输出的“许可名单”。
注意:在某些 shell 中,“*****”字符已被 shell 预留。如果您使用的是此类 shell,请将过滤表达式用引号括起来:adb logcat “ActivityManager:I MyApp:D *:S”
一些常用的调试开关
调试WMS 与 SF动画分离交互,比如layer显示问题导致动画分离不执行等问题可通过打开此开关排查
adb root
adb remount
adb shell setprop persist.wm.debug.sc.tx.log_match_call show/hide/merge/apply
adb rebootVIVO系统LOG抓取方法
**背景:**VIVO手机系统启动后,会自动关闭系统详细LOG输出(adb bugreport也抓不到);
刚开机短时间内,还是可以输出详细LOG的,过一会儿或者连接USB时就会关闭详细LOG(具体过多久关闭尚不确定)。
- 方法:
- 拨号界面输入 #112# 暗码进入 “日志信息采集”;
- “通用” - “开始抓取”;// 此时工具会开启系统详细LOG
- 开启录屏;
- 开始问题复现;
- 关闭录屏;
- “通用” - “停止并退出” // 此时工具会关闭系统详细LOG
- adb bugreport 收集LOG;
- adb pull adb pull /storage/self/primary/Pictures/Screenshots/Screenrecording_XXX_XXX.mp4 获取录屏;
公司网络
链接:MIOT wifi 密码 miot1810
dump查看桌面版本号
adb shell dumpsys package com.miui.home | grep -A 70 -F 'Packages:'| grep -A 20 -F 'Package [com.miui.home]'|grep 'versionName=RELEASE'
// 执行结果
versionName=RELEASE-5.39.40.11291-06191819命令行看机器分层
3. 具体命令如下:
获取CPU&GPU等级:
adb shell settings get system deviceLevelList
输出示例:v:1,c:3,g:3 (c:cpu等级,g:GPU等级,3高端)
内存判断
- 内存判断是低端机,不为空为lite
adb shell getprop ro.config.low_ram.threshold_gb
- 内存判断是低端机,不为空为middle
adb shell getprop ro.config.low_ram.middle.threshold_gb
- 都没有是miui normal
如P16U,最终结果是cpu 中

查看OS版本
adb shell getprop ro.build.fingerprint
查看桌面版本号
adb shell dumpsys package com.miui.home | grep -A 70 -F 'Packages:'| grep -A 20 -F 'Package [com.miui.home]'|grep 'versionName=RELEASE'GPU 代码实现
遇到同事问OpenGL glxxx的实现,说找不到代码实现:这个是Khrons的通病,KHR准确来讲是一个组织,OpenGL/Vulkan是这个组织出的图形图像接口规范,但是问题是只定义了接口,不给实现,实现是各个GPU厂商实现,Linux平台上的OpenGL实现是Mesa库,比如glFlush的在高通平台(msm是高通Mobile Station Modem的缩写)实现如下:

GPU的全栈结构是这样的:

OpenGL目前调试的时候就用高通的工具吧,感兴趣的可以看下实现,KHR有参考文档,不阻碍调试就好,想深入研究的就看下,总之GPU的全栈比CPU技术栈简单很多
https://xiaomi.f.mioffice.cn/file/boxk49RWToSrvam0UrC17AVjt6e
opengl46-quick-reference-card.pdf
IPD6.0复合压力编译优化
https://xiaomi.f.mioffice.cn/docx/doxk45LIIAOz0n8uDpdYbxXsOod
测试工具:脚本(见具体用例说明)。 测试版本:性能001版本,且需要去除水印,预制资源。 编译检查:测试前所有三方APP需要预编译,编译方法:手机安装完测试app后,打开app至少10s后,1执行pmbg- dexopt—job查看是否编译成功3.输入adb shell dumpsys package.4.log查看方法:显示status是speed-profile,reason 是bg-dexopt表示预编编译成功。 开始测试:上述执行完后,重启手机后,恢复到环境温度(25~27℃)开始测试。
bugreport查看温度信息
关键字如下
thermal
thermal sensor board temp is
SystemPressureControl: thermal temperature
PowerKeeper.Thermal: mBatteryTemperature
用户打点上报
目前在使用用户手机上默认是开启用户上报的
用户上报进程有两个分别是
root 16395 1 11286488 9772 binder_thread_read 0 S misight
system 16613 1678 14864168 110768 do_epoll_wait 0 S com.miui.misightservice
上对于用户的上报必须满足两个前提条件
加入”用户体验计划” 和 使用情况和诊断数据 两个选项打开(具体可以在设置中直接搜索)


如果这两个按钮打开,misight服务会在后台不断地抓取异常数据log(前提是应用和系统有打点上报)
所以这是比较耗费性能的,那么怎么才能不耗费性能呢?
答案就是手动kill这两个进程
**misight:**这进程是和抓取用户日志相关的,当接收用户打点事件时(目前有桌面、systemui、稳定性、框架)详细参考https://xiaomi.f.mioffice.cn/sheets/shtk4QdYc05F9oKKTdvAPTc6Pgc?sheet=5Eq8wY
**com.miui.misightservice:**这个是8小时上报服务

用户手机抓Trace
用户手机抓Trace会通过dump信息来还原trace,你可以理解为手机中一直在循环抓Trace,当问题复现时候8小时上报
抓Trace条件
-
用户同时开启 加入”用户体验计划” 和 使用情况和诊断数据 两个选项打开(具体可以在设置中直接搜索)
-
抓Trace的开启需要找大数据同事加入白名单做数据下发
引导用户抓Trace
抓trace方式:
第一步:打开开发者选项
打开设置,打开“我的设备“,选中"全部参数与信息",连点7次"OS版本"
第二步:
设置-更多设置--开发者选项--系统跟踪,打开最底部的显示"快捷设置"图块
第三步:
下滑控制中心-出现小瓢虫图标-点亮即开始抓取trace
第四步:
复现卡顿问题,操作结束后再次点击小瓢虫图标,置灰即结束
第五步:
设置-更多设置--开发者选项--系统跟踪-查看跟踪文件,将trace文件发送过来动态帧率和帧率切换
屏幕刷新率获取
SELECT * from track where name like "%ModeFps%"
ActiveModeFps 和 PendingModeFps调频过程会伴随SurfaceFlinger 6次硬件VSYNC校准 HWEventsDRM::VSyncHandlerCallback:: (进程名称 /vendor/bin/hw/vendor.qti.hardware.display.composer-service),这个硬件校准会同步异步binder调用到SurfaceFlinger 的binder线程 onComposerHalVsync 0 16666666ns(其中0 代表频率档为0,一般手机会有0:120Hz; 1:90Hz; 2:60Hz16666666ns是时间单位纳秒)

主要目的是频点变化后硬件执行6次校准软件模拟vsync,后面由软件来模拟VSYNC,减少功耗
通过bugreport查看内存占用信息
具体方法在bugreport中搜索关键字 dumpsys meminfo 可以找到各个进程的内存占用情况

如上图 home进程内存占用1.6G
Git设置模版
代码提交过程中如果嫌弃代码格式繁琐,可以通过设置模版的形式简化提交,相关代码提交规范细节参考 https://gerrit.pt.mioffice.cn/c/platform/packages/apps/MiuiSystemUI/+/6220897
[FEATRUE][BugFix\][模块如Keyguard\Shortcut\Aod\LockScreen]
jiraID
[RootCause]:
[Modify]:
[Test]:
Signed-off-by:zhoubencheng@xiaomi.com
save as .config/commit-template.txt
git config --global commit.template ~/.config/commit-template.txt其中模块名称
| 一级模块名 | 二级模块名 | 英文名称 | 自测范围 |
|---|---|---|---|
| 锁屏 | 锁屏解锁 | Keyguard | MTBF测试 |
| 锁屏 | 锁屏快捷方式 | Shortcut | |
| 锁屏 | AOD | Aod | |
| 锁屏 | 锁屏显示 | LockScreen | |
Node JS 下载

时间悬浮窗开ms(毫秒级)
一般遇到闪屏问题
可以开启ms级时间悬浮窗、同时抓winscope、Trace、bugreport
通过命令可以打开ms级时间悬浮窗
# 开启毫秒(ms)级时间悬浮窗
adb shell settings put system miui_time_floating_window ms
# 关闭毫秒(ms)级时间悬浮窗
adb shell settings put system miui_time_floating_window 1
解决密码页录屏黑屏问题
如果遇到锁屏自己停止录屏问题需要再录屏设置中关闭《锁屏时关闭录屏》
adb shell settings put secure disable_secure_windows 1
OS4 玻璃效果相关命令
如何打开玻璃效果 https://mi.feishu.cn/wiki/GsVWwcBzUiePw9kD0rfc8b3znSe
- 锁屏界面开启玻璃
adb shell setprop persist_miui_glass_effect_enable true
adb shell pkill -f com.android.systemui对应change
master:
https://gerrit.pt.mioffice.cn/c/vendor/xiaomi/frameworks/base/+/6345023
https://gerrit.pt.mioffice.cn/c/platform/external/skia/+/6916881
https://gerrit.pt.mioffice.cn/c/vendor/xiaomi/frameworks/native/+/6968500
https://gerrit.pt.mioffice.cn/c/platform/frameworks/base/+/6917028
-
通知玻璃效果调整
# OS4效果通知效果OS3线上效果,不带效果 adb shell setprop debug.sysui.notif.notif_row_effect 0 adb -s {serial} shell pkill -f com.android.systemui # OS4效果通知效果,通知玻璃特效 https://mi.feishu.cn/docx/DOhddNAjuobHjixeT4lcEiGznub adb shell setprop debug.sysui.notif.notif_row_effect 1 adb -s {serial} shell pkill -f com.android.systemui # OS4效果通知效果,通知高光特效 adb shell setprop debug.sysui.notif.notif_row_effect 2 adb -s {serial} shell pkill -f com.android.systemui -
如何从Trace看有没有玻璃
如果刷新玻璃效果,RenderThread会出现MiGpufontsdf2Op标签,玻璃效果一般比较耗费性能,需要特别留意

RenderThread 耗时排查
开关:
adb shell setprop persist.sys.sf.dynamic.cachemiss.trace true
adb shell "stop; start"