SlideShare a Scribd company logo
Optymalizacja
hierarchii widoków na
platformie Android
Michał Włodarczyk,
Mobilization 2015, Łódź
Jak tworzyć wydajne
aplikacje?
“Layout Traversals on Android”
Lucas Rocha
Facebook Inc.
DroidCon 2015, Berlin
Pozycjonowanie
Rysowanie
Interakcje ze zdarzeniami
Czym jest UI dla programisty?
Początki Android’a były trudne ...
Przed Jelly Bean
ViewRoot.java
public final class ViewRoot extends Handler ... {
...
public void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
sendEmptyMessage(DO_TRAVERSAL);
}
}
...
public void handleMessage(Message msg) {
...
case DO_TRAVERSAL:
performTraversals();
...
}
}
Odświeżanie ekranu
w przewidywalnych odstępach czasu
Od Jelly Bean - Choreographer
... f1 f2 f3 f4 f5 ...
Resize
view
Redraw
view
Input
Events
Choreographer.java
public void onVsync(long timestampNanos, int builtInDisplayId, int frame) {
...
scheduleVsync();
...
}
...
void doFrame(long frameTimeNanos, int frame) {
...
if (!mFrameScheduled) {
return;
}
...
doCallbacks(Choreographer.CALLBACK_INPUT, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_ANIMATION, frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_TRAVERSAL, frameTimeNanos);
...
}
Choreographer
ViewRootlmpl
Łączy zarządcę okien z hierarchią widoków
SurfaceFlinger
ViewRootImpl
Hierarchia widoków
Metody związane z widokami
Measure + Layout + Draw
measureHierarchy(...)
measure(int, int)
→ onMeasure(int, int)
M M M
M M
M
*
Measure
Lazy Measure
Multi-MeasureSpec cache
View.java
public final void measure(int widthMeasureSpec,
int heightMeasureSpec) {
...
int cacheIndex = mMeasureCache.indexOfKey(key);
if (cacheIndex < 0 || sIgnoreMeasureCache) {
onMeasure(widthMeasureSpec, heightMeasureSpec);
mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT;
} else {
long value = mMeasureCache.valueAt(cacheIndex);
setMeasuredDimensionRaw((int) (value >> 32), (int) value);
mPrivateFlags3 |= PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT;
}
...
}
Lazy Measure
View.java
public void layout(int l, int t, int r, int b) {
if ((flags & PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) != 0 ) {
onMeasure(mOldWidthMeasureSpec, mOldHeightMeasureSpec);
mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT;
}
...
}
Lazy Measure
RelativeLayout
LinearLayout Button
LinearLayout TextView
RelativeLayout RelativeLayout
TextView TextViewTextView TextView TextView TextView
requestLayout()
Multi-MeasureSpace cache
18 19
6.5 ms 0.7 ms
72 14
SDK
czas mierzenia
ilość wywołań
Multi-MeasureSpace cache
layout(int, int, int, int) → onLayout
(boolean, int, int, int, int)
M L M L M L
M L M L
M L
*
Layout
performLayout()
performDraw()
draw(Canvas)
→ onDraw(Canvas)M L D
*
M L D M L DM L D
M L D M L D
Draw
View.java
private DisplayList getDisplayList(...) {
...
final HardwareCanvas canvas = displayList.start(width, height);
...
draw(canvas);
...
displayList.end();
...
}
Display List
Kiedy wykonywany jest layout(),
to na pewno zrobiony jest measure()
Kiedy wykonywany jest draw(),
to na pewno zrobiony jest layout()
Pamiętaj!
1. Wywołanie getMeasured*() poza
onLayout()
2. Alokacja:
● onLayout(): Akceptowalna
● onMeasure(): Unikać
● onDraw(): Nigdy
Unikaj!
Zmiany rozmiaru elementów,
odświeżenie stanu, animacje
... f1 f2 f3 f4 f5 ...
Metoda requestLayout()
*
requestLayout()
View.java
public void requestLayout() {
...
if (mParent != null && !mParent.isLayoutRequested()) { mParent.
requestLayout();
}
...
}
ViewRootImpl.java
void scheduleTraversals() {
...
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
...
}
Metoda requestLayout()
Metoda invalidate()
... f1 f2 f3 f4 f5 ...
*
invalidate(...)
Metoda invalidate()
View.java
public void invalidateInternal(...) {
...
mPrivateFlags |= PFLAG_INVALIDATED;
...
if (mParent != null && mAttachInfo != null && l < r && t < b) {
final Rect damage = mAttachInfo.mTmpInvalRect;
damage.set(l, t, r, b);
mParent.invalidateChild(this, damage);
}
...
}
boolean draw(...) {
...
mRecreateDisplayList = (
mPrivateFlags & PFLAG_INVALIDATED) == PFLAG_INVALIDATED;
...
}
Metoda postOnAnimation()
...... f1 f2 f3 f4 f5 ...
*
postOnAmination()
valueAnimator
...
Metoda postOnAnimation()
View.java
public void postOnAnimation(Runnable action) {
...
attachInfo.mViewRootImpl.mChoreographer.postCallback(
Choreographer.CALLBACK_ANIMATION, action, null);
...
}
Choreographer.java
void doFrame(long frameTimeNanos, int frame) {
...
doCallbacks(Choreographer.CALLBACK_INPUT,frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_ANIMATION,frameTimeNanos);
doCallbacks(Choreographer.CALLBACK_TRAVERSAL,frameTimeNanos);
...
}
Używajmy OnPreDrawListener!
Tree Observer
OnPreDrawListener
// 1. Save layout state and wait for next frame.
getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
getViewTreeObserver().removeOnPreDrawListener(this);
// 2. Restore original layout state.
// 3. Trigger animators towards new layout state.
}
}
Nie wywołuj layout() podczas layout
Nie wywołuj layout() podczas animacji
Wywołuj invalidate() tylko na tych elementach,
które chcesz przerysować
Pamiętaj!
1. Prosta hierarchia widoków
2. Multi pass layout - unikajmy
Wydajność
Własne widoki
1. Composite Views
2. Custom Composite Views
3. Flat Custom Views
Własne widoki
Przydatne narzędzia
Hierarchy Viewer
źródło: http://cfile10.uf.tistory.com/image/110412354E5A61652D1F2C
Stereovision Image Calculator
Stereovision Image Calculator
1. Menu zmienione z RelativeLayout
na FrameLayout
2. Uproszczenie hierarchii widoków
3. Wykres jako Custom Flat View
4. Kolejkowanie odświeżania
Stereovision Image Calculator
Optymalizacja
Nexus 7
Nexus 7 po optymalizacja
Samsung Tab 2
Samsung tab 2 po optymalizacja
Stereovision Image Calculator
Wyniki optymalizacji
299.03
50.54
478.42
65.92
Czas renderowania [ms]
Po co tworzyć wydajne
aplikacje?
INFO@OPEN-RND.PL
QUESTIONS ? THOUGHTS ? COMMENTS ?
Feel free to contact us!
WWW.OPEN-RND.PL
Thank you
Michał Włodarczyk
SENIOR SOFTWARE DEVELOPER of Open-RnD
michal.wlodarczyk@open-rnd.pl

More Related Content

Viewers also liked

семінар серпень 26 27.08. 2015
семінар серпень 26 27.08. 2015семінар серпень 26 27.08. 2015
семінар серпень 26 27.08. 2015
dregii
 
інноваційні підходи до форм та розвитку управлінської компетентності керівник...
інноваційні підходи до форм та розвитку управлінської компетентності керівник...інноваційні підходи до форм та розвитку управлінської компетентності керівник...
інноваційні підходи до форм та розвитку управлінської компетентності керівник...
Ольга Демидова
 
courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...
courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...
courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...
nous sommes vivants
 

Viewers also liked (14)

Lias-presentatie
Lias-presentatieLias-presentatie
Lias-presentatie
 
семінар серпень 26 27.08. 2015
семінар серпень 26 27.08. 2015семінар серпень 26 27.08. 2015
семінар серпень 26 27.08. 2015
 
8б клас
8б клас8б клас
8б клас
 
La castañera
La castañeraLa castañera
La castañera
 
The current change in communication investments
The current change in communication investmentsThe current change in communication investments
The current change in communication investments
 
Indios numeros
Indios numerosIndios numeros
Indios numeros
 
Health Tech & Health Care - A Shiny Future?
Health Tech & Health Care - A Shiny Future?   Health Tech & Health Care - A Shiny Future?
Health Tech & Health Care - A Shiny Future?
 
A Dozen 'Startup Health' Start Ups
A Dozen 'Startup Health' Start UpsA Dozen 'Startup Health' Start Ups
A Dozen 'Startup Health' Start Ups
 
Graphic Design: The Forgotten Web Standard
Graphic Design: The Forgotten Web StandardGraphic Design: The Forgotten Web Standard
Graphic Design: The Forgotten Web Standard
 
Technology versus Cancer (How can technology help?)
Technology versus Cancer (How can technology help?)Technology versus Cancer (How can technology help?)
Technology versus Cancer (How can technology help?)
 
інноваційні підходи до форм та розвитку управлінської компетентності керівник...
інноваційні підходи до форм та розвитку управлінської компетентності керівник...інноваційні підходи до форм та розвитку управлінської компетентності керівник...
інноваційні підходи до форм та розвитку управлінської компетентності керівник...
 
затишний дім
затишний дімзатишний дім
затишний дім
 
courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...
courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...
courts circuits : les nouvelles mobilités : téléphone, transports, médias on ...
 
Wikipedia Health Landscape - Top Health Conditions
Wikipedia Health Landscape - Top Health ConditionsWikipedia Health Landscape - Top Health Conditions
Wikipedia Health Landscape - Top Health Conditions
 

More from Open-RnD

More from Open-RnD (6)

Open-RnD UX/UI Design
Open-RnD UX/UI DesignOpen-RnD UX/UI Design
Open-RnD UX/UI Design
 
Yocto and IoT - a retrospective
Yocto and IoT - a retrospectiveYocto and IoT - a retrospective
Yocto and IoT - a retrospective
 
ROS3D - Podsumowanie prac nad projektem
ROS3D - Podsumowanie prac nad projektemROS3D - Podsumowanie prac nad projektem
ROS3D - Podsumowanie prac nad projektem
 
Open-RnD Embedded Offer
Open-RnD Embedded OfferOpen-RnD Embedded Offer
Open-RnD Embedded Offer
 
Open-RnD Technologically Touched
Open-RnD Technologically TouchedOpen-RnD Technologically Touched
Open-RnD Technologically Touched
 
Open-RnD Mobile Offer
Open-RnD Mobile OfferOpen-RnD Mobile Offer
Open-RnD Mobile Offer
 

Optymalizacja hierarchii widoków na platformie Android