Share
Embed
Medellín Android 2016-06-01: Loving Lean Layouts
La charla dé al primer meetup de Medellín Android.
Huyen Tue Dao
June 02, 2016
Transcript
21 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 nested → too indented • Stability: a change to one part affects other part 4 MAINTAINABILITY -
HOW TO LAYOUT A VIEW HIERARCHY measure STEP 1 layout
STEP 2 measure measure layout layout r -
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 • Evaluates performance of measure(), layout(), and draw() phases • Best: use on physical device running 4.1 up • Do not use runtime numbers given in Hierarchy Viewer; completely inaccurate 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 • FrameMetricsListener API: Android N; framestats without 120 frame limit 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 → View or Space. • Sometimes you just need to pick the right view/layout. • Less views, less levels, less nesting • ConstraintLayout 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 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 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 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. • 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 use RelativeLayout at the root! • Don’t let problems accumulate. • 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 • 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 20 -
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 21