Share
Embed
Droidcon Italy 2016: Loving Lean Layouts
From Droidcon Italy 2016, Huyen discusses how performance issues can appear in layouts and how creating lean layouts can address these issues.
Huyen Tue Dao
April 07, 2016
Transcript
26 slides
-
WHY LEAN LAYOUTS? • Complexity ∝ Resources (memory, CPU) •
Complexity? • # of views • Depth of view hierarchy • (Really) # of measure() and layout() executions • Bad performance → UI/animations jank 3 #PERFMATTERS -
WHY LEAN LAYOUTS? • Complexity ∝ effort to maintain/refactor •
Readability • Complex views are hard to parse • Too many → too indented • Stability: a change to one part affects other part 4 MAINTAINABILITY -
WHERE’S THE PROBLEM? (HINT: SEVERAL PLACES) r Change in size/position
starts measure/layout starting at root. r r r r Some layouts need multiple measure/layout passes, e.g. RelativeLayout Lists make many copies of same layout Deep hierarchies increase complexity and dependency -
FIND PROBLEMS • SDK tool for visualizing view hierarchy •
Used to be standalone; now in Device Monitor • Do not rely on runtime values for measure(), layout(), and draw() phases • Inaccurate • Chet Haase said so • Best: use on physical device running 4.1 up HIERARCHY VIEWER : -
FIND PROBLEMS • systrace: system + application process execution data
→ interactive reports • Frame rendering → how much time measure/layout takes up; warns of frames that exceed 16.6ms needed for 60fps • dumpsys: collects and dumps “interesting information” about system services status • adb shell dumpsys gfxinfo <PACKAGE_NAME> → perf info related to frames of animation • adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats → detailed frame timing info; on Marshmallow SYSTRACE + DUMPSYS : -
FIX PROBLEMS • Lint complains about things that are generally
not good ideas. • Good candidates for things that you should fix first. • Don’t nest weights • Remove useless views • Don’t nest too much MAKE LINT HAPPY : -
FIX PROBLEMS • Many different ways to do one thing:
opt for simplest • Often attributes or other techniques can replace multiple views, e.g.: • TextView compound drawables • Spannable • Placeholder/divider → plain View or Space. • Consolidate styling and spacing → set directly on content layout instead of a wrapper SIMPLIFY AND REDUCE : -
FIX PROBLEMS SIMPLIFY AND REDUCE : <LinearLayout…> <ImageView…/>
<TextView…/> </LinearLayout> <TextView… android:drawablePadding=“…" android:drawableEnd=“…"/> → 3 VIEWS, 2 LEVELS 1 VIEW, 1 LEVEL -
FIX PROBLEMS • Many different ways to do one thing:
opt for simplest • Often attributes or other techniques can replace multiple views, e.g.: • TextView compound drawables • Spannable • Placeholder/divider → plain View or Space. • Consolidate styling and spacing → set directly on content layout instead of a wrapper SIMPLIFY AND REDUCE : -
FIX PROBLEMS SIMPLIFY AND REDUCE : <LinearLayout…> <TextView… style="@style/StyleA"
/> <TextView… style="@style/StyleB" /> <TextView… style="@style/StyleA" /> </LinearLayout> <TextView…/> + Spannables → 4 VIEWS, 2 LEVELS 1 VIEW, 1 LEVEL -
FIX PROBLEMS • Many different ways to do one thing:
opt for simplest • Often attributes or other techniques can replace multiple views, e.g.: • TextView compound drawables • Spannable • Placeholder/divider → plain View or Space. • Consolidate styling and spacing → set directly on content layout instead of a wrapper SIMPLIFY AND REDUCE : -
FIX PROBLEMS SIMPLIFY AND REDUCE : <FrameLayout… android:layout_marginTop=“@dimen/a” android:layout_marginBottom=“@dimen/b“ android:background=“@drawable/bg”>
<LinearLayout… android:paddingTop=“@dimen/c” android:paddingBottom=“@dimen/d”> … </LinearLayout> </FrameLayout> <LinearLayout… android:layout_marginTop="@dimen/a" android:layout_marginBottom="@dimen/b" android:paddingTop="@dimen/c" android:paddingBottom="@dimen/d" android:background=“@drawable/bg"> <LinearLayout… </LinearLayout> → 3 LEVELS -1 VIEWS, 2 LEVELS -
FIX PROBLEMS • Many different ways to do one thing:
opt for simplest • Often attributes or other techniques can replace multiple views, e.g.: • TextView compound drawables • Spannable • Placeholder/divider → plain View or Space. • Consolidate styling and spacing → set directly on content layout instead of a wrapper SIMPLIFY AND REDUCE : -
FIX PROBLEMS • Sometimes just need to pick the “right”
view/layout. • Nested LinearLayouts → RelativeLayout • RelativeLayout to layout n views in a row → LinearLayout • RelativeLayout → FrameLayout + layout_gravity • Do (or at least try) not use RelativeLayout at the root! • Generally, no set rules: “It depends.” SIMPLIFY AND REDUCE : -
FIX PROBLEMS SIMPLIFY AND REDUCE : <LinearLayout… > <LinearLayout…>
<TextView… /> <TextView… /> </LinearLayout> <TextView… /> </LinearLayout> <RelativeLayout…> <TextView… /> <TextView… /> <TextView… /> </RelativeLayout> → 5 VIEWS, 3 LEVELS 4 VIEW, 2 LEVEL -
FIX PROBLEMS • Sometimes just need to pick the “right”
view/layout. • Nested LinearLayouts → RelativeLayout • RelativeLayout to layout n views in a row → LinearLayout • RelativeLayout → FrameLayout + layout_gravity • Do (or at least try) not use RelativeLayout at the root! • Generally, no set rules: “It depends.” SIMPLIFY AND REDUCE : -
FIX PROBLEMS • Sometimes best option = custom ViewGroup. •
Total control over measure/layout logic. • Mitigate double-layout phases. • Also: totally custom Views (draw all the things). • Start out with simple, straightforward layouts: static content, little user interaction • Balance performance gains with development effort. GO CUSTOM : -
GOOD PRACTICES • Anticipate and develop good habits • Use
simplest solutions where possible • “Don’t do too much stuff.” • Fewer/flatter Views and ViewGroups. • Don’t let problems accumulate. • Best solution? It depends. • Balance performance gains with development effort. -
THANKS FOR COMING! https://github.com/queencodemonkey/Android-Loving-Lean-Layouts Huyen Tue Dao @queencodemonkey +HuyenTueDao [email protected]
randomlytyping.com youtube.com/androiddialogs speakerdeck.com/queencodemonkey -
REFERENCES • Custom ViewGroups: https://sriramramani.wordpress.com/ 2015/05/06/custom-viewgroups/ • 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 • on LinearLayout measures: http://helw.net/2016/01/27/on- linearlayout-measures/ 25 -
REFERENCES • 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 • Testing Display Performance: http://developer.android.com/training/ testing/performance.html • Analyzing UI Performance with Systrace: http://developer.android.com/ tools/debugging/systrace.html 26