1 of 37

Android performance: An overview

yuli.kamakura

Engineering Productivity

From app code all the way down to the kernel

2022

2 of 37

  • 性能优化在字节的业务价值体现
  • 一些 Overview 的介绍
    • 字节内各性能优化方式
    • 移动操作系统和硬件厂商的性能优化
    • 业内相关进展
  • 具体的一些优化
  • 工具

Agenda

3 of 37

  • 拍摄页冷启耗时 -65ms,人均投稿数 +0.467%,人均开拍数 +0.133%;
  • 冷启首刷场景 GC 抑制 >= 28 优化,冷启-20ms, 首刷-70ms, StayDuration/U +0.0298%,PlayTime/U +0.0308%
  • 低端机启动类预加载,低端机 pct50 冷启 -58ms,首刷 -54ms,PlayTime/U +0.174%,Finish/U + 0.229%
  • mlock 优化代码合入 dev ,bytest 测试启动优化明显,提升在5%-10%

4 of 37

硬件的视角看性能优化

x86

ARM

更长的时间范围来看

  • 硬件性能提升速度变缓
  • ARM 平台受益于架构和工艺的演进,最近几年趋势比 x86 平台好

5 of 37

硬件的视角看性能优化

更长的时间范围来看

  • 多核带来的提升取决于真正并行执行的部分

未来?

  • 未来会有新的材料和工艺驱动芯片性能的进一步提升,但目前不成熟
  • 移动处理还受到电池技术的限制
  • 软件性能优化仍可持续带来提升

6 of 37

Bytedance Inc. 移动端性能优化的现状

Android 性能优化方法论与案例分享

by 抖音 Android 基础技术

Android 客户端性能优化系列课

by 今日头条 Android 平台业务

架构,实现,策略上都有丰富的优化实践效果

性能稳定性专题课程学习指南

7 of 37

Bytedance Inc. 进一步遇到的问题

线上疑难问题如何归因和优化

偶现的问题

线下如何更早发现问题

挖掘新的优化点?

8 of 37

移动操作系统和硬件厂商的性能优化

Apple

9 of 37

移动操作系统和硬件厂商的性能优化

Android

2014

2016

2018

2015

2017

2019

ZRAM & KSM

RenderScript with GPU accelerate

HWUI

Android Rutime(ART)

HMP scheduler

sdcardFS

cpuset group

SKGL & vulkan

f2fs

ART: profile and image

Binder refactor

Cloud profile

odex relayout

EAS scheduler

Generational Concurrent Copying GC

10 of 37

Compilers

&

Tools

Applications

Android Framework

ART(VM)

Native Libraries

HAL / Kernel

Hardware

Mostly Heard

Rarely Seen

11 of 37

行业内其他工作做了哪些事情?

Projects

Custom Rom - Nanoscope

12 of 37

虚拟机-Execution Engine & Compiler

13 of 37

虚拟机-Execution Engine & Compiler

Hot Methods

Startup Methods

Startup Classes

Startup Strings

Profile

Odex file

profile里的methods编译为机器码

Image file

Class pre-init

String pre-resolve

编译时机的控制

profile文件的编辑

image文件的利用

14 of 37

虚拟机-GC

15 of 37

虚拟机-GC

512MB

512MB

compact

copying

Java Heap

Dalvik GC抑制

Android Q+ 启动期间GC抑制

GC线程delay

更简单的方法,先主动把heap撑大?

16 of 37

Kernel-任务调度

Next

Kernel-内存管理

Kernel-文件系统

17 of 37

编译器优化-ART

18 of 37

Optimization passes:

编译器优化-Redex

19 of 37

编译器优化-PGO(Profile Guided Optimization)

Source

code

Instrumented

program

Profile

data

Optimized

program

Code

Optimization

Layout

ART speed profile

Profile内method编译成机器码

Startup method聚集到一起

Redex Interdex

采集启动过程中加载的class

将dex内容重排使启动class聚集

Clang PGO/LTO

Android libart/libhwui已经内置profile文件

Flutter/Lynx library PGO尝试

Chrome library prefetcher

对启动过程中调用的函数重排

mincore记录启动过程中load的区域

下次启动时根据记录做prefetch

20 of 37

基于硬件的优化

21 of 37

基于硬件的优化-GPU

CPU

C / Neon

View drawing

View drawing

Hwui

pipeline

CPU fallback

GPU rendering

22 of 37

Render - HWUI

23 of 37

24 of 37

Tools

  • Systrace
  • Perfetto
  • simpleperf
  • nanoscope

Demo

定制ROM插桩

时间戳获取:将timer硬件寄存器导出到用户空间

VM和Compiler插桩

Interpreter

JIT

AOT

25 of 37

Tools

Slardar 线上问题聚合

慢函数

卡顿树

26 of 37

Recap

  • 原理是通用的
    • 应用和系统基于通用原理可以有各自优化方式
    • 客户端 / 服务端也可以相互借鉴
  • 这些领域一直持续活跃
    • 可以吸收大量创新成果
    • 互相之间关联可以形成协同效应
  • 面向新的平台
    • 基础原理,方法,手段仍然会适用

27 of 37

2

28 of 37

从性能角度看,app关心的是如何最大化利用操作系统提供的各种资源

  • 任务调度
    • 获取足够的cpu时间片
    • 及时获得锁,阻塞后及时被唤醒
  • 内存
    • 快速完成虚拟/物理内存的分配
    • pagefault 性能好
    • 不要颠簸(Thrashing)
  • 文件访问
    • pct90耗时低
    • 数据落盘快

操作系统

29 of 37

EAS(Energy aware scheduler)

4+4

4+2+2

CFS

Completely fair scheduler

Linux Android

  • Core affinity

CPU0

CPU1

main

binder

main

binder

main

binder

main

CPU0

main

binder

binder

main

binder

main

binder

main

binder

sched_setaffinty

com.facebook.reliability.affinity.BinderThreadAffinity

binder test

system

app

操作系统 - 任务调度

30 of 37

  • Thread priority

Optimizations:

Priority Inherit

Atomic Instructions

Better Locks

操作系统 - 任务调度

EAS(Energy aware scheduler)

4+4

4+2+2

CFS

Completely fair scheduler

Linux Android

31 of 37

  • CPU frequency
    • 默认情况下CPU频率随负载波动
    • System: 通用场景boost
    • App: 更精细的做主动boost

Jato

调度策略优化

EAS(Energy aware scheduler)

4+4

4+2+2

CFS

Completely fair scheduler

Linux Android

操作系统 - 任务调度

32 of 37

file

heap

Others

open/mmap

Userspace allocators

dlmalloc, jemalloc...

brk/mmap/madvise..

Ashmem: /dev/ashmem

Graphics:/dev/kgsl, /dev/ion..

Page fault

物理页分配

  • Freelist充足时直接获取
  • Free不足触发回收
    • File 回收
    • Anon回收
    • Shrinker list(slab, lmk...)

分配:driver alloc page

回收:driver shrinker callback

Linux Android

操作系统 - 内存管理

33 of 37

File

Java Heap

Native Heap

Anonymous Page

只读/Clean的页

可以直接丢弃回收物理页

匿名页通过swap方式回收

Zram: 在内存中的swap分区,写入压缩,读出解压

很快要访问的内存段:load dex file即将访问时

后续不再访问的内存段:回收java heap里free区域物理页

madvise

给系统一些提示

操作系统 - 内存管理

34 of 37

ext4 -> f2fs (flash friendly file system)

改善痛点:

  • 随机读写
  • 碎片
  • File/database fsync(落盘)

操作系统 - 文件系统

35 of 37

General read

Random read

Fragment

Sync

只读文件系统,读取时间解压,CPU解压>IO latency

Squash fs: Android GO

Erofs: Huawei

预先记录read序列,下次访问时按序列replay(读取序列变化不大)Improving app startup with I/O prefetching

启动IO预读

重排

Fallocate

预先分配占位文件,defrag时将实际文件填入

Atomic write:解决写入顺序问题

mmap代替:keva

操作系统 - 文件系统

36 of 37

2

37 of 37

Reference