SurfaceFlinger

SurfaceFlinger

在Android 4.1以后,系统使用了三级缓冲机制,即此时有三个Graphic Buffer,通过 SurfaceFlinger 查看应用缓冲区信息

1
adb shell dumpsys SurfaceFlinger

输出的信息非常多,这里只关注三个信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
......
// app 信息
* Layer 0x74dab40d70 (com.benben.viewpractice/com.benben.viewpractice.MainActivity#0)
isSecure=false geomUsesSourceCrop=true geomBufferUsesDisplayInverseTransform=false geomLayerTransform 0x00000000 (ROT_0 ) 0x00 (IDENTITY )
1.0000 0.0000 0.0000
0.0000 1.0000 0.0000
0.0000 0.0000 1.0000

geomBufferSize=[0 0 1080 2160] geomContentCrop=[0 0 1080 2160] geomCrop=[0 0 1080 2160] geomBufferTransform=0
Region transparentRegionHint (this=0x742ab46c20, count=1)
[ 0, 0, 0, 0]
geomLayerBounds=[0.000000 0.000000 1080.000000 2160.000000] shadowRadius=0.000000
blend=NONE (1) alpha=1.000000 backgroundBlurRadius=0
type=1 appId=10165 composition type=DEVICE (2)
buffer: slot=0 buffer=0x73eab35450
sideband stream=0x0
color=[0.000000 0.000000 0.000000]
isOpaque=true hasProtectedContent=false isColorspaceAgnostic=false dataspace=UNKNOWN (0) hdr metadata types=0 colorTransform=[[1.000,0.000,0.000,0.000][0.000,1.000,0.000,0.000][0.000,0.000,1.000,0.000][
0.000,0.000,0.000,1.000]]

......

Slots:
// 需要 // 表明是否使用的状态 // 对象地址 // 当前负责第几帧 // 屏幕分辨率
>[01:0x73eab519b0] state=ACQUIRED 0x73aab35bd0 frame=3094 [1080x2160:1088, 1]
[00:0x73eab4eb90] state=FREE 0x73aab46d30 frame=3093 [1080x2160:1088, 1]

......
// 地址 // 缓冲区大小
0x73aab31f10: 0.25 KiB | 1 ( 64) x 1 | 1 | 1 | 0x300 | placeholder
0x73aab35bd0: 9180.00 KiB | 1080 (1088) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface
0x73aab41180: 9720.00 KiB | 1148 (1152) x 2160 | 1 | 2 | 0x10000900 | com.android.systemui.ImageWallpaper#0
0x73aab44ed0: 280.50 KiB | 1080 (1088) x 66 | 1 | 1 | 0x10000900 | StatusBar#0
0x73aab45bc0: 280.50 KiB | 1080 (1088) x 66 | 1 | 1 | 0x10000900 | StatusBar#0
0x73aab46310: 9180.00 KiB | 1080 (1088) x 2160 | 1 | 1 | 0x10000900 | com.benben.viewpractice/com.benben.viewpractice.MainActivity#0
0x73aab46d30: 9180.00 KiB | 1080 (1088) x 2160 | 1 | 1 | 0x1a00 | FramebufferSurface
0x73aab48560: 280.50 KiB | 1080 (1088) x 66 | 1 | 1 | 0x10000900 | StatusBar#0
0x73aab49520: 561.00 KiB | 1080 (1088) x 132 | 1 | 1 | 0x10000900 | NavigationBar0#0
0x73aab497f0: 561.00 KiB | 1080 (1088) x 132 | 1 | 1 | 0x10000900 | NavigationBar0#0
0x73aab4a7b0: 20.50 KiB | 27 ( 64) x 82 | 1 | 1 | 0x203 | RegionSamplingThread
0x73aab4d8a0: 9180.00 KiB | 1080 (1088) x 2160 | 1 | 1 | 0x10000900 | com.benben.viewpractice/com.benben.viewpractice.MainActivity#0
0x73aab4ddb0: 9180.00 KiB | 1080 (1088) x 2160 | 1 | 1 | 0x10000900 | com.benben.viewpractice/com.benben.viewpractice.MainActivity#0

可以看到 com.benben.viewpractice 的所有 Buffer 都没有使用,所以内存占用并没有统计进 app,如果有使用到,会在退后台,灭屏等场景进行部分回收与释放

可以看到,一个缓冲 Buffer 占用内存 9M 多,分辨率越大单个 Buffer 占用越大,如果有使用其它 Surface,如 SurfaceViewTextureView 则会更大