• 这个是团队来定的,会选取历史版本中数据最好的一次,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 命令,发出来看看