Slide 1

Slide 1 text

LOVING LEAN LAYOUTS HUYEN TUE DAO @QUEENCODEMONKEY

Slide 2

Slide 2 text

LOVING LEAN LAYOUTS WHY LEAN LAYOUTS FINDING PROBLEMS FIXING PROBLEMS GOOD PRACTICES

Slide 3

Slide 3 text

WHY LEAN LAYOUTS PERFMATTERS → DEVICE RESOURCES USED RESOURCES ∝ COMPLEXITY COMPLEXITY? # OF VIEWS. DEPTH OF HIERARCHY. REALLY # OF EXECUTIONS OF onMeasure()/onLayout() BAD PERFORMANCE→ JANK

Slide 4

Slide 4 text

WHY LEAN LAYOUTS MAINTAINABILITY READABILITY COMPLEX VIEWS → HARD TO PARSE TOO NESTED → TOO INDENTED STABILITY CHANGE IN ONE PART AFFECTS OTHER PART

Slide 5

Slide 5 text

MEASURE LAYOUT DRAW INFLATION/INSTANTIATION DEPTH-FIRST TRAVERSAL HOW ANDROID DRAWS VIEWS onMeasure() onLayout() onDraw()

Slide 6

Slide 6 text

PARENT MEASURES EACH CHILD CHILD CALCULATES MEASURED WIDTH/HEIGHT MEASURE HOW ANDROID DRAWS VIEWS onMeasure() LAYOUT onLayout() DRAW onDraw() MEASURE OWN CHILDREN (IF ANY)

Slide 7

Slide 7 text

PARENT SIZES AND POSITIONS CHILD MEASURE LAYOUT DRAW HOW ANDROID DRAWS VIEWS onMeasure() onLayout() onDraw()

Slide 8

Slide 8 text

PARENT DRAWS PARENT TELLS CHILDREN TO DRAW MEASURE LAYOUT DRAW HOW ANDROID DRAWS VIEWS onMeasure() onLayout() onDraw()

Slide 9

Slide 9 text

WHERE IS THE PROBLEM? CHANGE IN SIZE/POSITION STARTS MEASURE/LAYOUT STARTING AT ROOT. SOME LAYOUTS NEED MULTIPLE MEASURE/LAYOUT PASSES, E.G. RELATIVELAYOUT LISTS MAKE MANY COPIES OF SAME LAYOUT DEEP HIERARCHIES INCREASE COMPLEXITY AND DEPENDENCY

Slide 10

Slide 10 text

FINDING PROBLEMS HIERARCHY VIEWER SDK TOOL. HIERARCHY VISUALIZATION. ANDROID DEVICE MONITOR BEST → PHYSICAL DEVICE. ANDROID 4.1+ | ROOTED | VIEW SERVER. RUNTIME NUMBERS COMPLETELY INACCURATE. DO NOT USE.

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

FINDING PROBLEMS LAYOUT INSPECTOR EXAMINE/DEBUG LAYOUT ANDROID MONITOR. SINCE AS 2.2. HIGH-LEVEL LIST OF VIEWS. SHOWS NESTING. WIP. WILL “SUPERSEDE” HIERARCHY VIEWER.

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

HUYEN TUE DAO @QUEENCODEMONKEY SUBTITLE

Slide 16

Slide 16 text

SYSTRACE SYSTEM + APPLICATION PROCESS EXECUTION DATA DATA TRACE → INTERACTIVE REPORTS FRAME RENDERING. HOW LONG TRAVERSALS TAKE. ALERTS. SMOOTH UI → 60FPS → 16.6MS/FRAME ANDROID DEVICE MONITOR FINDING PROBLEMS

Slide 17

Slide 17 text

HUYEN TUE DAO @QUEENCODEMONKEY SUBTITLE

Slide 18

Slide 18 text

DUMPSYS SYSTEM SERVICES STATUS “INTERESTING INFORMATION” PERFORMANCE INFO FOR FRAMES OF ANIMATION adb shell dumpsys gfxinfo FINDING PROBLEMS DETAILED FRAME TIMING INFO. MARSHMALLOW. adb shell dumpsys gfxinfo framestats

Slide 19

Slide 19 text

FRAMEMETRICSLISTENER MEASURE INTERACTION-LEVEL UI PERFORMANCE PUB/SUB API FRAME TIMING FOR CURRENT APP WINDOW FINDING PROBLEMS EQUIVALENT TO adb shell dumpsys gfxinfo framestats NOT LIMITED TO LAST 120 FRAMES LIKE framestats

Slide 20

Slide 20 text

MAKE LINT HAPPY COMPLAINS ABOUT THINGS THAT ARE NOT GOOD IDEAS FIXING PROBLEMS GOOD CANDIDATES FOR THINGS TO FIX FIRST DON’T NEST WEIGHTS DON’T HAVE USELESS VIEWS DON’T NEST TOO DEEP

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

LINT USELESS PARENT

Slide 23

Slide 23 text

LINT NESTED WEIGHTS

Slide 24

Slide 24 text

LINT TOO MUCH NESTING

Slide 25

Slide 25 text

SIMPLIFY AND REDUCE DIFFERENT WAYS TO DO ONE THING. OPT FOR SIMPLEST. FIXING PROBLEMS REPLACE VIEWS WITH ATTRIBUTES/OTHER TECHNIQUES DIRECTLY APPLY LAYOUT/STYLING PICK THE RIGHT VIEW/LAYOUT

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text


 
 
 
 
 
 → 3 VIEWS, 2 LEVELS 1 VIEW, 1 LEVEL

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

SPANNABLES

Slide 31

Slide 31 text


 
 
 
 
 
 
 
 + Spannables → 4 VIEWS, 2 LEVELS 1 VIEW, 1 LEVEL

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text


 
 
 
 → 2 VIEWS, 2 LEVELS 1 VIEW, 1 LEVEL

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 → 5 VIEWS, 3 LEVELS 4 VIEWS, 2 LEVEL

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

GO CUSTOM CUSTOM VIEW/VIEWGROUP TOTAL CONTROL OVER LAYOUT/DRAW FIXING PROBLEMS MITIGATE DOUBLE LAYOUT PASSES START WITH SIMPLE, STRAIGHTFORWARD LAYOUTS BALANCE PERFORMANCE GAINS WITH DEVELOPMENT EFFORT

Slide 40

Slide 40 text

ANTICIPATE AND DEVELOP GOOD HABITS SIMPLEST SOLUTIONS WHERE POSSIBLE GOOD PRACTICES DON’T LET PROBLEMS ACCUMULATE BALANCE PERFORMANCE GAINS WITH DEVELOPMENT EFFORT FEWER AND FLATTER NO RELATIVELAYOUT AT ROOT

Slide 41

Slide 41 text

THANK YOU! SPEAKERDECK.COM/QUEENCODEMONKEY YOUTUBE.COM/ANDROIDDIALOGS RANDOMLYTYPING.COM HUYEN TUE DAO @QUEENCODEMONKEY

Slide 42

Slide 42 text

REFERENCES 42 ANDROID PERFORMANCE PATTERNS, WHY 60FPS? https://youtu.be/CaMTIgxCSqU DEVELOPING FOR ANDROID: THE NAUGHTY BITS https://youtu.be/Q2qQoJlwqlk?t=36m4s HIERARCHY VIEWER http://developer.android.com/tools/help/hierarchy-viewer.html HIERARCHY VIEWER WALKTHROUGH http://developer.android.com/tools/performance/hierarchy-viewer/index.html LAYOUT INSPECTOR http://tools.android.com/tech-docs/layout-inspector

Slide 43

Slide 43 text

REFERENCES 43 TESTING DISPLAY PERFORMANCE http://developer.android.com/training/testing/performance.html ANALYZING UI PERFORMANCE WITH SYSTRACE http://developer.android.com/tools/debugging/systrace.html OPTIMIZING LAYOUT HIERARCHIES http://developer.android.com/training/improving-layouts/optimizing-layout.html ANDROID PERFORMANCE PATTERNS, DOUBLE LAYOUT TAXATION https://www.youtube.com/watch?v=dB3_vgS-Uqo ANDROID PERFORMANCE PATTERN, INVALIDATIONS, LAYOUTS, AND PERFORMANCE https://youtu.be/we6poP0kw6E

Slide 44

Slide 44 text

REFERENCES 44 BUILD A RESPONSIVE UI WITH CONSTRAINTLAYOUT developer.android.com/training/constraint-layout/index.html ANDROID DEVELOPERS BACKSTAGE: EPISODE 50: CONSTRAINT LAYOUT androidbackstage.blogspot.com/2016/06/episode-50-constraint-layout.html CUSTOM VIEWGROUPS https://sriramramani.wordpress.com/2015/05/06/custom-viewgroups/ MEASURE, LAYOUT, DRAW, REPEAT: CUSTOM VIEWS AND VIEWGROUPS https://youtu.be/dLl0ovmta6A