美文网首页Android开发
分享7年Android经验:真的有弄懂过性能优化吗?

分享7年Android经验:真的有弄懂过性能优化吗?

作者: 愿天堂没Android | 来源:发表于2020-05-08 15:41 被阅读0次

    我们常说的性能通常包括如下几个方面

    1.应用的启动速度

    这个无论是基于用户体验的角度还是基于产品 宣传的角度这个越来越受到主流厂商的重视:

    a.基于用户体验的角度,这一点不难理解,随着手机硬件的不断升级,用户也是越来越没耐性,他们不想等,也就说当用户点击某个应用,就希望应用的操作界面立马呈现出来!
    b.基于产品宣传的角度:由于应用的启动速度是能够非常直观呈现,因此常常被很多测评网站拿来对比!

    2. 开/关机速度(包括恢复出厂设置速度)

    3. 流畅度:

    流畅度分普通场景的流畅度包括:滑动的流畅度、页面切换的流畅度;
    游戏场景的流畅度:触屏是否跟手、FPS是否稳定、网络是否稳定;由于目前手机性能越来越好,同时手机游戏越来越火,特别是王者荣耀、吃鸡类游戏的持续火爆。使得各个厂商把游戏的流畅度提到战略高度,甚至出了的专门的游戏手机如:NUBIA的红魔手机,小米的黑鲨手机,有些厂商选择与游戏厂商合作,来对游戏进行深度优化如:oppo与王者荣耀团队的多核多线程优化,还有如vivo出了王者荣耀周年定制手机等等。

    4.跑分:

    跑分各人觉得产品宣传的角度远远大于用户体验。
    但是由于线上这种“不服,就跑个分”这种氛围,使得各个厂商也必须对跑分进行所谓的优化。当然对于用户而言,跑分确实能反应出整个机器的硬件水平,但是如果跑分不是基于用户的基础使用体验为目的的话,个人觉得有一点"欺骗用户"的感觉,这里所说的基础体验就是指,厂商所谓的优化,不是针对跑分软件去进行优化,跑分高或者低只是一个水到渠成的结果,比如,我司手机滑动优化做得非常好,非常流畅,那么自然跑分软件中关于滑动流畅性这一块的分自然就高。预期对立的就是:

    if(packagename.equals("antutu")){
           cpu最大频率跑
    }
    

    从技术层面看看这几个维度

    应用启动速度:

    应用启动速度对用户而言:是指从点击到第一个界面加载完毕的时间;

    但是对于研发而言这里应该可以分为如下几个阶段:
    a.点击即框架收到触屏的中断时间到launcher接收到input的事件;

    b.launcher响应点击事件到应用绘制完第一帧;

    c.从第一帧到页面加载完毕;a和b阶段是真正的系统的反应的时间,c阶段主要是动画的时间,不同厂商可能根据自己需求定义不同的动画时长。因此在对于应用启动的速度,尤其是热启动的时候一定要注意应用的启动动画时长。

    分析应用启动常见思路如下:

    前置条件(相同或者相近平台,这个是后面所有主题的前置条件):
    首先要保证测试样机和竞品机器的安装的第三方应用是同一个版本,这个为排除不同版本的应用本身导致的启动速度上面差异。
    应用最好都是重新安装的,因为对于第三方应用而言,非预制的应用,安装的时候android系统默认的compiler mode是android-N之前inerprter-only,android O开始就quicken。但是安装完一段时间后,系统会把它优化成speed-profile.这俩种模式对应用的启动速度影响比较大。

    问题分析思路:

    冷启动看看是否是真正的冷启动,因为有可能厂商为了某些应用的启动速度更快,而让这个应用的进程长驻。也有肯能是温启动,即:当你强行停止,应用进程又会立马起来。
    热启动主要看动画时长是否一样
    看看cpu/gpu的boost策略是否相同,如:启动过程中核心数、boost的所用的freq的大小,boost的时长、sched_boost的多0,1,2,还是3.
    如果以上条件都一样,就抓systrace,看具体慢在哪一段

    开/关机:开机可以看如下log

    1
    PBL/SBL/HYP/ LK boot loader
    Bootloader time
    2
    Kernel boot up +
    Initialize native daemons
    boot_progress_start
    3
    Zygote class preloading
    boot_progress_preload_start
    boot_progress_preload_start
    boot_progress_preload_end
    boot_progress_preload_end
    boot_progress_system_run
    4
    Package scanning
    boot_progress_pms_start
    boot_progress_pms_system_scan_start
    boot_progress_pms_data_scan_start
    boot_progress_pms_scan_end
    boot_progress_pms_ready
    5
    Service initialization
    boot_progress_ams_ready
    6
    UI/Apps start
    boot_progress_enable_screen
    Total boot up time
    = Bootloader time (1) + Time from boot_progress_enable_screen
    

    关机:可以通过 logcat |grep -i "shutdown",来看关机耗时。

    游戏:游戏分俩种情况

    游戏帧率稳定:但是就是感觉卡顿,或者是感觉任务移动困难,这个很有可能和触屏相关。这个时候最好能够用userdug的版本,进一步分析。一般有如下几种情况:

    1.固件没有上报

    2.固件上报了,但是被驱动过滤掉了

    3.固件驱动都上报了,这个时候就要在框架进一步分析了

    游戏帧率不稳定,这个又分下面俩种情况
    1.游戏的某个场景,帧率一直不稳定,这个很有可能和cpu策略相关。

    2.掉帧的这个场景,一开始稳定,但是发热后就不稳定了,这个应该就和温控策略相关,应该就是温控关核限频率导致的。

    普通场景的流畅度:

    这个就要对比分最好看看竞品是否卡顿,如果竞品流畅很多,就可以抓个systrace看看竞品机器的cpu策略是什么样的,同时检查oversrcoller boost,scroller boost是否生效。

    如果遇到系统整体卡顿情况,分析思路如下:
    1.检查是否处于低电状态,低电状况会触发BCL,如高通平台一般是10%,这个时候就会关闭所有大核,或者打核不跑任务。

    2.检查是否发热,导致关核

    3.用TOP命令看一下,是否有某些应用在疯狂的暂用cpu资源。

    如果遇到插充电器(电脑)不卡,不插充电器卡的情况,可以尝试抓取离线的systrace来分析(高通平台):

    1.使用手机连接上wifi

    2.确保手机和PC网络可以互通(可以ping相互的ip地址)

    3.确保手机usb调试打开,使用usb连接手机,然后执行命令:adb tcpip 5555

    4.断开usb连接

    5.输入命令:adb connect 手机ip地址(如 adb connect 192.168.1.111)

    以上为部份分享,若是有兴趣的欢迎关注,后期有任何分享欢迎讨论,有任何不对的地方也欢迎指点。

    相关文章

      网友评论

        本文标题:分享7年Android经验:真的有弄懂过性能优化吗?

        本文链接:https://www.haomeiwen.com/subject/jhtzghtx.html