• 这个是团队来定的,会选取历史版本中数据最好的一次,baseline 的数据会持续更新

  • 首先,你想要做到的什么程度?你们现在目前面临的主要问题是什么?现有的人做现在的事情是出现了什么问题?如果要招人的话,是要解决什么问题?比如说,你现在服务端发布经常 delay,发现每次定的发布时间点都测试不完?那首先不要想加人,是不是版本的内容本身太多了,或者是说提测质量太差了,随便点点就出现了问题?那首先是不是要评估版本是否可以拆分,开发自测是否充分?再考虑如过增加人员的话,是要做现在没有做或者做不到的事情?比如是否有持续集成,是否有单测,是否有线上监控,是否保障机制比如线上监控等等,如果加人是继续做业务测试的话,那 1:1 都会有问题,定规则,设卡点,让每个人都对质量负责,这样才是一个良性循环,在这个基础上,比如要做服务端接口测试,qa 可以提想法可以基于自己业务的特点,找开源软件或者和开发共建接口测试框架,让这个工具实际为质量作出贡献

  • 兄弟,首先你要想清楚你是参与创业还是在创业公司工作,这个是本质区别,参与创业是对公司的方向有决定或者至少是有影响的,如果是这样的话,你就必须想清楚你要做的事情是什么,风险在哪里,可能的成就会在哪里,你的什么特质可以帮助到公司成长,可以和公司一起 A 轮,B 轮... 或者是公司倒了,你是否有得到自己想要的东西?如果这些你都没有想清楚,只是前辈需要一个廉价的劳动力,做的事情也是打杂的话,初创公司打杂的可能性是比较大的,打杂几年后你的专业性是否可以跟上市场需求?不要说马云身边的人一开始都傻傻的跟着干,那你也要清楚 第一这是中彩票,第二 马云至少在 95 年就到美国看到过最新的技术,至少他有能力在北京做总经理!所以我的建议,如果想做技术,还好沉下心来研究技术,想做销售,也可以慢慢过渡售前售后技术支持,如果想玩,就继续混混日子,结婚生子也是不错的选择,哈哈哈,加油!

  • PC 端周期判断,是 jenkins 任务吧?
    你们在锤子话,应该是不需要兼顾 iOS?😀

  • 请教一下 CI 部署的思路,shell 命令是怎么融入 CI 的流程的?是 USB 连 PC?stf ?

  • @sandman 请教一下,我把帧率处理的格式化出来,加了一些注释,变量改一下名字,但是还是有几处不清楚,能抽空解答一下吗?

    if(NR==1){ # 如果只有一行数据的话
        r=$1/1000000;  # r =16.6 刷新时间间隔
        if(r<0)
            r=$1/1000;
            secondcolumn=0;
            Frames=0;
            WN=1
    }
    else{ #第一列:app里数据(bitmap/material等)准备时间,第二列:cpu将数据传递给h/w(hardware)绘制时的同步时间(这里可以理解为cpu和gpu绘制一帧时,二个线程的同步时间)第二行第三列表示:h/w(hardware)绘制完成的时间
        if(Frames>0&&$0=="")
            tag=1;
        if(NF==3&&$2!=0&&$2!=9223372036854775807){ # NF 一行有3列【正常情况下】 第二列不等于0【正常情况】 第二列不等于那一串数字【正常情况】
    
            refeshround=($3-$1)/1000000/r; # 第一列减第三列 / 1ms的纳秒数 / 刷新时间间隔 x应该为这次的帧绘制跨越了几次的刷新时间间隔
    
            if(secondcolumn==0){ # 刚开始刷SurfaceFlinger的数据第二列是为0
                secondcolumn=$2; # 第二列标示刷新的开始时间
                Frames=1;
                jank=0;
                janktwo=0;
                if(refeshround<=1) # 如果一个刷新周期内就完成绘制
                    totaltimediff=r; # C等于16.9ms
                if(refeshround>1){ # 如果大于一个刷新周期的话 
                    jank+=1; # jank就加1
                    totaltimediff=int(refeshround)*r; # C就等于x取整倍的r
                    if(refeshround%1>0) # 如果x不是整数的话,C要加上一个刷新周期?用意是???
                        totaltimediff+=r
                };
                if(refeshround>2) # 如果x大于2个刷新周期话
                    janktwo+=1;
                    MFS=r; # 初始MFS等于一个刷新周期
                    OKT=0 
            }
            else{
                timediff=($2-secondcolumn)/1000000; # timediff 第二列和上一行第二列的时间差->ms
                if(timediff>500){ # 两帧之间的时间差
                    tag=1 # 大于500ms认为是用户没有操作
                }
                else{# 两帧如果是小于500ms
                    Frames+=1; 
                    if(timediff>=r){ # 时间差大于等于一个刷新周期
                        totaltimediff+=timediff; # ???
                        if(timediff>kpi) # kpi=16
                            OKT+=1; # 超过kpi 16ms的次数就加1
                        if(timediff>=MFS) # 如果时间差大于记录的MFS,则MFS记录为时间差
                            MFS=timediff;
                        if(refeshround>1)
                            jank+=1;
                        if(refeshround>2)
                            janktwo+=1;
                            secondcolumn=$2 # 
                    }
                    else{ # 如果时间差小于一个刷线周期
                        totaltimediff+=r;
                        secondcolumn=sprintf("%.0f",secondcolumn+r*1000000) # ?为啥第二列要加上一个刷新周期呢?
                    }
                }
            };
            if(Frames==1) # 我理解是如果是第一帧的时候,把FU时间记录下来
                FU=sprintf("%.3f",$2/1000000000)
        };
        if(Frames>0&&tag==1){ # tag为0的时候表示是超过了127行后的一个空行,
            tag=0;
            if(Frames==1) # Frames如果等于1的话就认为是缓存帧?
                LU=sprintf("%.3f",FU+totaltimediff/1000); # 把最后时间加上这一帧的时间,然后继续
            else 
                LU=sprintf("%.3f",secondcolumn/1000000000);
                Date=strftime("%F %Date",time+LU)"."sprintf("%.0f",(time+LU)%1*1000);
                FPS=sprintf("%.2f",Frames*1000/totaltimediff); # 帧率 出现的帧数【大于1】*1000 / 两帧的时间差 【 1帧*1000 / 16.6 = 60FSS】
                MFS=sprintf("%.0f",MFS);
                g=FPS/target; # 实际帧率和目标帧率的比值
                if(g>1) # 如果实际帧率大于了目标帧率
                    g=1; 
                    h=kpi/MFS; #kpi 16ms / 两帧时间差
                if(h>1)
                    h=1;
                SS=sprintf("%.2f",g*60+h*20+(1-OKT/Frames)*20); # 流畅度 = 实际帧率比目标帧率比值*60【目标帧率越高越好】 + 目标时间和两帧时间差比值*20【两帧时间差越低越好】 + (1-超过16ms次数/帧数)*20【次数越少越好】 
                print FU"\t"LU"\t"Date"\t"FPS+0"\t"Frames"\t"jank"\t"janktwo"\t"MFS"\t"OKT"\t"SS"\t"WN;
                Frames=0; # Frames 重置为0
                if($0==""){
                    secondcolumn=0;WN+=1
                }
                else{
                    secondcolumn=$2;Frames=1;jank=0;janktwo=0;
                    if(refeshround<=1)totaltimediff=r;if(refeshround>1){
                        jank+=1;
                        totaltimediff=int(refeshround)*r;
                        if(refeshround%1>0)
                            totaltimediff+=r
                    };
                    if(refeshround>2)
                        janktwo+=1;MFS=r;OKT=0
                }
        }
    }
    
  • 你可以问一下 浮云...
    如果你可以在 windows 下可以用 pycharm 打开看一下 是不是 constants 没有下载,是不是要 pip install constants,
    不过还是建议你看一下 浮云实现的代码逻辑


  • 你是用 Android studio 是吗? 在这边配置一下你本地下载好的

  • 你们开发写单测吗?

  • 你这个看起来是 gradle 下载失败? 你可以用本地的 gradle 下一下,不要从网上下。
    flutter 程序根目录执行 flutter doctor 命令,发出来看看

  • 赞,后续可以交流 flutter 的测试,wigdet test 和 integration test 的玩法现在业界还是很少的

  • 应该是你的窗口名称输错了,下面这个命令可以看当前窗口的

    dumpsys window windows | grep mCurrent
    
  • awk 后面感觉是混淆过的,读起来好累。。。😭

  • 我不是锤子的喔~ 是搜索看到的,
    Frames 就是一组样本数据中的总评估帧数?

  • @sandman 请教一下 MFS(ms): Max Frame Spacing. 这个是指当前帧和上一帧的时间间隔吗? 那可以看成是上一帧的帧耗时吗?
    您这边是将 MFS 最低设置为 16.6(csv 中数据是 17) ms ?

    Frames 这个不太好理解~?

  • 嗯,学习了~
    cpu 信息的处理你的思路是通过当前的 Activity 来拿到当前应用的 CPU 利用率是吗? 我好像没有看到有过滤处理的地方喔?
    我看到结果,好像是会把 系统的一些也统计进来

    8,27011.04,829,2.1,system_server,,
    38,27011.04,268,2.1,/system/bin/surfaceflinger,,
    

    这些其他进程的数据和当前的 app 是有关联的是吗?

  • @sandman 真赞!
    我理解是数据处理还是原来的 shell,只是用统一的框架把原来需要人工介入比较多的通过框架处理出来了是吗?
    比如我执行这个正则出错,没有适配到我这个手机输出格式是吗?

  • @sandman hi, 请教一下,我手动执行了一下 $bb top -b -n 1|$bb grep -v "busybox"|$bb sed '2s/%//g;s/\.0 / /g;s/ S N / SN /g;s/ R N / RN /g;s/ D N / DN /g;s/ Z N / ZN /g;s/ T N / TN /g;s/S </S</g;s/D </D</g;s/R </R</g;s/Z </Z</g;s/T </T</g;s/t </t</g;s/[0-9] m[0-9]/m /g;s/}/{/g;s/ th\]/th\]/g;s/\[mtk /\[mtk/g' 提示了正则表达式不对,这个正则表达式的目的是什么呢?
    我手动格式了一下,红框部分的判断是忽略的是吗?

    还有最后我处理出来的 cpuinfo.csv 文件 PID 是不同的是吗?
    求大神指教~