常见问题总结

流畅度

最近任务脚本判断规则

上划进最近任务监控WindowAnmation的场景

脚本通过监控字符串识别认为是上帧

Layername: Surface(name=Task

比如下面这个

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

不过目前对这个的准确性存疑,需要进一步增加log定位

去除水印

目前两种方式

  1. 通过修改配置问题去除

https://gerrit.pt.mioffice.cn/c/miui/frameworks/base/+/4397477/1/core/java/miui/os/Build.java#282

  1. 在合成时去除对应layer

    https://gerrit.pt.mioffice.cn/c/miui/frameworks/base/+/4292231/1/services/java/com/android/server/wm/MIUIWatermark.java#304

Trace中遇到D状态怎么解决

目前mi有排查问题的具体措施,如果问题是高概率复现的,可以通过打开开过抓SystemTrace定位资源加载,详细见

https://xiaomi.f.mioffice.cn/docx/doxk4m4EFgjXlUAq2IXHZT9VMSy

MIUIX打开LOG开关

adb shell setprop log.tag.folme.level 7

3.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℃需要进行复测

image-2025-01-07-16-54-45-627

image-2025-01-07-16-53-35-506

https://gerrit.pt.mioffice.cn/c/platform/packages/apps/MiuiSystemUI/+/5072120/1/packages/SystemUI/miui/Notification/src/com/android/systemui/statusbar/notification/policy/AppMiniWindowRowTouchHelper.kt#386

避免频繁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. 使用 dexoptpm 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的可支持频率
```
 
![](http://minio.898311.xyz:8900/blogimg/17071247554803.png)
 
MTK
 
```shell
adb shell cat /sys/kernel/ged/hal/current_freqency //GPU的可支持频率
```
 
![](http://minio.898311.xyz:8900/blogimg/17071247554803.png)
 
 
 
//循环查看GPU频率
 
```shell
while true; do adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq; done   //循环查看GPU频率
```
 
![](http://minio.898311.xyz:8900/blogimg/17071247852086.png)

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合成

刷机后无法开机问题排查

  1. 开机后执行命令 adb logcat -b crash > error_log.txt
  2. 快速分析堆栈

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

各个负责人

事项接口人
脚本inputluwei9
v-weijunhua

用户使用暗码抓取Hprof&&meminfo

1.抓取状态栏/锁屏/通知栏/控制中心 hprof文件步骤:

  1. 打开电话拨号界面
  2. 输入:#79783684#,按拨号键。(简单记法:9宫格键盘对应systemui)
  3. 当看到Toast提示“capture sysui heap complete”后表明抓取完成。
  4. Hprof地址为:文件管理-手机-MIUI-SysUI,长按sysui.hprof文件,点击发送,可通过微信/飞书发给研发。
  5. 使用命令抓取meminfo:adb shell dumpsys meminfo com.android.systemui >meminfo.txt
  6. 把终端所在目录下的meminfo.txt发送到微信/飞书;

2.抓取桌面 hprof文件步骤:

  1. 打开电话拨号界面
  2. 输入:#64844663#,按拨号键。(简单记法:9宫格键盘对应miuihome)
  3. 当看到Toast提示“capture home heap complete”后表明抓取完成。
  4. Hprof地址为:文件管理-手机-MIUI-Home,长按home.hprof文件,点击发送,可通过微信/飞书发给研发。
  5. 使用命令抓取meminfo:adb shell dumpsys meminfo com.miui.home >meminfo.txt
  6. 把终端所在目录下的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");

https://opengrok-hq-v.dun.mi.com/opengrok-v-hq/xref/missi_v_mtk_hq/miui/frameworks/base/core/java/miui/turbosched/TurboSchedMonitorImpl.java#396

VIPtask 中的温度穿透 TurboSchedMonitorImpl

persist.sys.turbosched.thermal_break.enable

最近任务0ms

怎么判断有没有进版0ms功能

system_server下的startActivity末尾会直接通过binder调用到桌面startActivityFinished

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

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

1.调用TurboSchedManager::setDynamicVIPTaskIfNeeded对当前线程优先调度

ITurboSchedManager::setTurboSchedActionWithPriority接口对home ui Thread、renderThread、hwui0、hwui1执行异步优先调度

0ms下以下结论成立:

  1. 第一个知识点system_server下的 Transition-OPENSyncGroupReady标签是startActivity 过程中触发的动画collection Ready的标识

  1. 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”

具体参考文档:Android日志系统

一些常用的调试开关

调试WMS 与 SF动画分离交互,比如layer显示问题导致动画分离不执行等问题可通过打开此开关排查

adb root
adb remount
adb shell setprop persist.wm.debug.sc.tx.log_match_call show/hide/merge/apply
adb reboot

VIVO系统LOG抓取方法

**背景:**VIVO手机系统启动后,会自动关闭系统详细LOG输出(adb bugreport也抓不到);

刚开机短时间内,还是可以输出详细LOG的,过一会儿或者连接USB时就会关闭详细LOG(具体过多久关闭尚不确定)。

  1. 方法:
  • 拨号界面输入 #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条件

  1. 用户同时开启 加入”用户体验计划” 和 使用情况和诊断数据 两个选项打开(具体可以在设置中直接搜索)

  2. 抓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 可以找到各个进程的内存占用情况

http://minio.898311.xyz/blogimg/1761125357971.jpg

如上图 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

其中模块名称

一级模块名二级模块名英文名称自测范围
锁屏锁屏解锁KeyguardMTBF测试
锁屏锁屏快捷方式Shortcut
锁屏AODAod
锁屏锁屏显示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

  1. 锁屏界面开启玻璃
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

  1. 通知玻璃效果调整

     
    # 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
  2. 如何从Trace看有没有玻璃

如果刷新玻璃效果,RenderThread会出现MiGpufontsdf2Op标签,玻璃效果一般比较耗费性能,需要特别留意

RenderThread 耗时排查

参考: RenderThread耗时如何定位是哪个View

开关:

adb shell setprop persist.sys.sf.dynamic.cachemiss.trace true
 
adb shell "stop; start"