۱. مقدمه
آخرین بهروزرسانی: 2021-03-11
چرا باید عملکرد Views را اندازهگیری کنیم؟
نماها بخش کلیدی برنامههای اندروید هستند که مستقیماً بر تجربه کاربری تأثیر میگذارند. به عنوان مثال، Activity یا Fragment شما شامل رابط کاربری است که اجزای View را که کاربران با آنها تعامل دارند، در خود جای داده است. کاربران تا زمانی که به طور کامل روی صفحه نمایش داده نشوند، قادر به دیدن کل محتوای رابط کاربری نیستند. صفحات کند و ثابت مستقیماً تعامل کاربر با برنامه شما را مختل کرده و یک تجربه کاربری بد ایجاد میکنند.
آیا Firebase Performance Monitoring این معیارهای عملکرد را به صورت پیشفرض ارائه نمیدهد؟
نظارت بر عملکرد Firebase به طور خودکار برخی از دادههای عملکرد را از قبل ثبت میکند، مانند زمان شروع برنامه شما (یعنی فقط زمان بارگذاری اولین Activity شما) و عملکرد رندر صفحه نمایش (یعنی فریمهای کند و ثابت برای Activityها اما نه برای Fragments). با این حال، برنامههای صنعتی معمولاً Activityهای زیادی ندارند، بلکه یک Activity و چندین Fragments دارند. همچنین، بسیاری از برنامهها معمولاً Viewهای سفارشی خود را برای موارد استفاده پیچیدهتر پیادهسازی میکنند. بنابراین اغلب مفید است که بدانید چگونه زمان بارگذاری و عملکرد رندر صفحه نمایش Activityها و Fragments را با استفاده از ردیابی کدهای سفارشی در برنامه خود اندازهگیری کنید. میتوانید به راحتی این codelab را برای اندازهگیری عملکرد اجزای Custom View گسترش دهید.
آنچه یاد خواهید گرفت
- نحوه اضافه کردن مانیتورینگ عملکرد Firebase به یک برنامه اندروید
- درک بارگذاری یک اکتیویتی یا یک فرگمنت
- چگونه میتوان با استفاده از ردپاهای کد سفارشی، زمان بارگذاری یک اکتیویتی یا فرگمنت را اندازهگیری کرد؟
- درک رندر صفحه نمایش و فریم کند/منجمد چیست؟
- چگونه میتوان رد کدهای سفارشی را با استفاده از معیارها برای ضبط صفحات آهسته/منجمد (Slow/Frozen) اندازهگیری کرد؟
- نحوه مشاهده معیارهای جمعآوریشده در کنسول Firebase
آنچه نیاز دارید
- اندروید استودیو ۴.۰ یا بالاتر
- یک دستگاه/شبیهساز اندروید
- جاوا نسخه ۸ یا بالاتر
۲. راهاندازی
کد را دریافت کنید
دستورات زیر را برای کپی کردن کد نمونه برای این codelab اجرا کنید. این کار پوشهای به نام codelab-measure-android-view-performance در دستگاه شما ایجاد میکند:
$ git clone https://github.com/FirebaseExtended/codelab-measure-android-view-performance.git
$ cd codelab-measure-android-view-performance
اگر گیت را روی دستگاه خود ندارید، میتوانید کد را مستقیماً از گیتهاب دانلود کنید.
پروژه measure-view-performance-start را به اندروید استودیو وارد کنید. احتمالاً خطاهای کامپایل یا شاید هشداری در مورد فقدان فایل google-services.json مشاهده خواهید کرد. این مورد را در بخش بعدی این مرحله اصلاح خواهیم کرد.
در این آزمایشگاه کد، ما از افزونه Firebase Assistant برای ثبت برنامه اندروید خود در یک پروژه Firebase و اضافه کردن فایلهای پیکربندی، افزونهها و وابستگیهای لازم Firebase به پروژه اندروید خود استفاده خواهیم کرد - همه اینها از داخل اندروید استودیو !
برنامه خود را به Firebase وصل کنید
- برای اطمینان از اینکه از آخرین نسخههای اندروید استودیو و دستیار فایربیس استفاده میکنید، به Android Studio / Help > Check for updates بروید.
- برای باز کردن پنل دستیار (Assistant) ، از منوی Tools ، گزینه Firebase را انتخاب کنید.

- برای افزودن به برنامه خود، Performance Monitoring را انتخاب کنید، سپس روی شروع به کار با Performance Monitoring کلیک کنید.
- برای ایجاد یک پروژه جدید، روی دکمه کلیک کنید و سپس نام پروژه را وارد کنید (برای مثال،
Measure Performance Codelab). - روی ادامه کلیک کنید.
- در صورت درخواست، شرایط Firebase را مرور و قبول کنید و سپس روی ادامه کلیک کنید.
- (اختیاری) دستیار هوش مصنوعی را در کنسول Firebase (با نام "Gemini در Firebase") فعال کنید.
- برای این codelab، به گوگل آنالیتیکس نیاز ندارید ، بنابراین گزینه گوگل آنالیتیکس را غیرفعال کنید .
- در مرحله بعد، باید پنجرهای برای اتصال برنامه جدید Firebase خود به پروژه اندروید استودیو مشاهده کنید.

- در اندروید استودیو، در پنل دستیار (Assistant )، باید تأیید اتصال برنامه خود به فایربیس را ببینید.

نظارت بر عملکرد را به برنامه خود اضافه کنید
در پنل دستیار (Assistant) در اندروید استودیو، روی گزینهی «افزودن نظارت بر عملکرد به برنامه» (Add Performance Monitoring to your app) کلیک کنید.
شما باید پنجرهای برای پذیرش تغییرات ببینید که پس از آن اندروید استودیو باید برنامه شما را همگامسازی کند تا اطمینان حاصل شود که تمام وابستگیهای لازم اضافه شدهاند.

در نهایت، باید پیام موفقیتآمیزی را در پنل دستیار (Assistant) در اندروید استودیو مشاهده کنید که نشان میدهد همه وابستگیها به درستی تنظیم شدهاند.

به عنوان یک مرحله اضافی، با دنبال کردن دستورالعملهای مرحله "(اختیاری) فعال کردن ثبت گزارش اشکالزدایی"، ثبت گزارش اشکالزدایی را فعال کنید . همین دستورالعملها در مستندات عمومی نیز موجود است.
۳. برنامه را اجرا کنید
اگر برنامه خود را با موفقیت با Performance Monitoring SDK ادغام کردهاید، پروژه اکنون باید کامپایل شود. در اندروید استودیو، روی Run > Run 'app' کلیک کنید تا برنامه روی دستگاه/شبیهساز اندروید متصل شما ساخته و اجرا شود.
این برنامه دو دکمه دارد که شما را به یک Activity و Fragment مربوطه هدایت میکند، مانند این:

در مراحل بعدی این آزمایشگاه کد، یاد خواهید گرفت که چگونه زمان بارگذاری و عملکرد رندر صفحه نمایش Activity یا Fragment خود را اندازهگیری کنید.
۴. درک بارگذاری یک اکتیویتی یا فرگمنت
در این مرحله، یاد خواهیم گرفت که سیستم در حین بارگذاری یک Activity یا Fragment چه کاری انجام میدهد.
آشنایی با بارگذاری یک اکتیویتی
برای یک Activity، زمان بارگذاری به عنوان زمانی تعریف میشود که از زمان ایجاد شیء Activity تا زمانی که اولین فریم به طور کامل روی صفحه نمایش داده میشود، ادامه دارد ( این زمانی است که کاربر شما برای اولین بار رابط کاربری کامل Activity را مشاهده میکند ). برای اندازهگیری اینکه آیا برنامه شما به طور کامل نمایش داده شده است یا خیر، میتوانید از متد reportFullyDrawn() برای اندازهگیری زمان سپری شده بین راهاندازی برنامه و نمایش کامل تمام منابع و سلسله مراتب نمایش استفاده کنید.
در سطح بالا، وقتی برنامه شما startActivity(Intent) را فراخوانی میکند، سیستم به طور خودکار فرآیندهای زیر را انجام میدهد. هر فرآیند برای تکمیل شدن به زمان نیاز دارد، که به مدت زمان بین ایجاد Activity و زمانی که کاربر رابط کاربری Activity را روی صفحه خود میبیند، میافزاید.

آشنایی با بارگذاری یک فرگمنت
مشابه Activity، زمان بارگذاری یک Fragment به عنوان زمانی تعریف میشود که از زمانی که Fragment به Activity میزبان خود متصل میشود تا زمانی که اولین فریم برای نمای Fragment به طور کامل روی صفحه نمایش داده شود، شروع میشود.
۵. زمان بارگذاری یک فعالیت را اندازهگیری کنید
تأخیر در اولین فریم میتواند به یک تجربه کاربری بد منجر شود، بنابراین مهم است که بدانید کاربران شما چه میزان تأخیر در بارگذاری اولیه را تجربه میکنند. میتوانید با استفاده از یک کد سفارشی، این زمان بارگذاری را اندازهگیری کنید:
- به محض ایجاد شیء Activity، ردیابی کد سفارشی (با نام
TestActivity-LoadTime) را در کلاس Activity آغاز کنید.
TestActivity.java
public class TestActivity extends AppCompatActivity {
// TODO (1): Start trace recording as soon as the Activity object is created.
private final Trace viewLoadTrace = FirebasePerformance.startTrace("TestActivity-LoadTime");
// ...
}
- تابع فراخوانی
onCreate()را نادیده بگیرید و View را با استفاده از متدsetContentView()اضافه کنید.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Current Activity's main View (as defined in the layout xml file) is inflated after this
setContentView(R.layout.activity_test);
// ...
// TODO (2): Get the View added by Activity's setContentView() method.
View mainView = findViewById(android.R.id.content);
// ...
}
- ما یک پیادهسازی از
FistDrawListenerرا گنجاندهایم که دارای دو فراخوانی مجدد است:onDrawingStart()وonDrawingFinish()(برای جزئیات بیشتر در موردFirstDrawListenerو آنچه میتواند بر عملکرد آن تأثیر بگذارد، به بخش بعدی در زیر مراجعه کنید) .FirstDrawListenerدر انتهای فراخوانی مجددonCreate()مربوط به Activity ثبت کنید. شما بایدviewLoadTraceخود را در فراخوانی مجددonDrawingFinish()متوقف کنید.
TestActivity.java
// TODO (3): Register the callback to listen for first frame rendering (see
// "OnFirstDrawCallback" in FirstDrawListener) and stop the trace when View drawing is
// finished.
FirstDrawListener.registerFirstDrawListener(mainView, new FirstDrawListener.OnFirstDrawCallback() {
@Override
public void onDrawingStart() {
// In practice you can also record this event separately
}
@Override
public void onDrawingFinish() {
// This is when the Activity UI is completely drawn on the screen
viewLoadTrace.stop();
}
});
- برنامه را دوباره اجرا کنید. سپس، logcat را با « معیار ردیابی ثبت وقایع » فیلتر کنید. روی دکمه
LOAD ACTIVITYضربه بزنید و به دنبال گزارشهایی مانند زیر بگردید:
I/FirebasePerformance: Logging trace metric: TestActivity-LoadTime (duration: XXXms)
🎉 تبریک! شما با موفقیت زمان بارگذاری یک فعالیت را اندازهگیری کردید و آن دادهها را به Firebase Performance Monitoring گزارش دادید. بعداً در این آزمایشگاه کد، معیار ثبتشده را در کنسول Firebase مشاهده خواهیم کرد.
هدف FirstDrawListener
در بخش بالا، ما یک FirstDrawListener ثبت کردیم. هدف FirstDrawListener اندازهگیری زمان شروع و پایان ترسیم اولین فریم است.
این متد ViewTreeObserver.OnDrawListener را پیادهسازی میکند و تابع فراخوانی onDraw() را که هنگام ترسیم درخت View فراخوانی میشود، لغو میکند. سپس نتیجه را برای ارائه دو تابع فراخوانی کاربردی onDrawingStart() و onDrawingFinish() در بر میگیرد.
کد کامل FirstDrawListener را میتوانید در کد منبع این codelab پیدا کنید.
۶. زمان بارگذاری یک فرگمنت را اندازهگیری کنید
اندازهگیری زمان بارگذاری یک فرگمنت مشابه نحوه اندازهگیری آن برای یک اکتیویتی است، اما با برخی تفاوتهای جزئی. باز هم، ما یک ردیابی کد سفارشی را ابزار خواهیم کرد:
- تابع فراخوانی
onAttach()را لغو کنید و شروع به ضبطfragmentLoadTraceخود کنید. ما این trace راTest-Fragment-LoadTimeنامگذاری خواهیم کرد.
همانطور که در مرحله قبل توضیح داده شد، شیء Fragment میتواند در هر زمانی ایجاد شود، اما فقط زمانی فعال میشود که به Activity میزبان خود متصل شده باشد.
TestFragment.java
public class TestFragment extends Fragment {
// TODO (1): Declare the Trace variable.
private Trace fragmentLoadTrace;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
// TODO (2): Start trace recording as soon as the Fragment is attached to its host Activity.
fragmentLoadTrace = FirebasePerformance.startTrace("TestFragment-LoadTime");
}
-
FirstDrawListenerدر تابعonViewCreated()ثبت کنید. سپس، مشابه مثال Activity، ردیابی را در تابعonDrawingFinish()متوقف کنید.
TestFragment.java
@Override
public void onViewCreated(@NonNull View mainView, Bundle savedInstanceState) {
super.onViewCreated(mainView, savedInstanceState);
// ...
// TODO (3): Register the callback to listen for first frame rendering (see
// "OnFirstDrawCallback" in FirstDrawListener) and stop the trace when view drawing is
// finished.
FirstDrawListener.registerFirstDrawListener(mainView, new FirstDrawListener.OnFirstDrawCallback() {
@Override
public void onDrawingStart() {
// In practice you can also record this event separately
}
@Override
public void onDrawingFinish() {
// This is when the Fragment UI is completely drawn on the screen
fragmentLoadTrace.stop();
}
});
- برنامه را دوباره اجرا کنید. سپس، logcat را با " Logging trace metric " فیلتر کنید. روی دکمه
LOAD FRAGMENTضربه بزنید و مانند زیر به دنبال گزارشها بگردید:
I/FirebasePerformance: Logging trace metric: TestFragment-LoadTime (duration: XXXms)
🎉 تبریک! شما با موفقیت زمان بارگذاری یک فرگمنت را اندازهگیری کردید و آن دادهها را به بخش نظارت بر عملکرد فایربیس گزارش دادید. بعداً در این آزمایشگاه کد، معیار ثبتشده را در کنسول فایربیس مشاهده خواهیم کرد.
۷. درک رندرینگ صفحه نمایش و فریم کند/منجمد چیست؟
رندر رابط کاربری (UI Rendering) عمل تولید یک فریم از برنامه شما و نمایش آن روی صفحه است. برای اطمینان از اینکه تعامل کاربر با برنامه شما روان است، برنامه شما باید فریمها را در کمتر از ۱۶ میلیثانیه رندر کند تا به ۶۰ فریم در ثانیه برسد ( چرا ۶۰ فریم در ثانیه؟ ). اگر برنامه شما از رندر رابط کاربری کند رنج میبرد، سیستم مجبور میشود فریمها را رد کند و کاربر در برنامه شما لکنت زبان را احساس خواهد کرد. ما به این حالت jank میگوییم.
به طور مشابه، فریمهای فریز شده، فریمهای رابط کاربری هستند که رندر آنها بیش از ۷۰۰ میلیثانیه طول میکشد. این تأخیر یک مشکل است زیرا به نظر میرسد برنامه شما گیر کرده و تقریباً یک ثانیه کامل در حالی که فریم در حال رندر شدن است، به ورودی کاربر پاسخ نمیدهد.
۸. فریمهای کند/منجمد یک قطعه را اندازهگیری کنید
نظارت بر عملکرد Firebase به طور خودکار فریمهای کند/متوقف شده را برای یک Activity ثبت میکند ( اما فقط در صورتی که Hardware Accelerated باشد ). با این حال، این ویژگی در حال حاضر برای Fragments در دسترس نیست. فریمهای کند/متوقف شده یک Fragment به عنوان فریمهای کند/متوقف شده برای کل Activity بین فراخوانیهای onFragmentAttached() و onFragmentDetached() در چرخه حیات Fragment تعریف میشوند.
با الهام از کلاس AppStateMonitor ( که بخشی از SDK نظارت بر عملکرد است و وظیفه ضبط ردیابیهای صفحه نمایش برای Activity را بر عهده دارد )، کلاس ScreenTrace ( که بخشی از مخزن کد منبع این codelab است ) را پیادهسازی کردیم. کلاس ScreenTrace میتواند به فراخوانی چرخه حیات FragmentManager در Activity متصل شود تا فریمهای کند/متوقف شده را ضبط کند. این کلاس دو API عمومی ارائه میدهد:
-
recordScreenTrace(): ضبط ردیابی صفحه را شروع میکند. -
sendScreenTrace()ضبط ردیابی صفحه نمایش را متوقف میکند و معیارهای سفارشی را برای ثبت تعداد فریمهای Total، Slow و Frozen ضمیمه میکند.
با پیوست کردن این معیارهای سفارشی، ردیابیهای صفحه برای Fragments میتوانند به همان روشی که ردیابیهای صفحه برای یک Activity انجام میشود، مدیریت شوند و میتوانند همراه با سایر ردیابیهای رندر صفحه در داشبورد Performance کنسول Firebase نمایش داده شوند.
در اینجا نحوه ثبت ردپاهای صفحه نمایش برای فرگمنت شما آورده شده است:
- کلاس
ScreenTraceرا در Activity خود که میزبان Fragment است، مقداردهی اولیه کنید.
MainActivity.java
// Declare the Fragment tag
private static final String FRAGMENT_TAG = TestFragment.class.getSimpleName();
// TODO (1): Declare the ScreenTrace variable.
private ScreenTrace screenTrace;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// TODO (2): Initialize the ScreenTrace variable.
screenTrace = new ScreenTrace(this, FRAGMENT_TAG);
// ...
}
- وقتی فرگمنت خود را بارگذاری میکنید، برای
FragmentLifecycleCallbacksثبتنام کنید و فراخوانیهایonFragmentAttached()وonFragmentDetached()را لغو کنید. ما این کار را برای شما انجام دادهایم. شما باید ضبط رد صفحه را در فراخوانیonFragmentAttached()شروع کنید و ضبط را در فراخوانیonFragmentDetached()متوقف کنید.
MainActivity.java
private final FragmentManager.FragmentLifecycleCallbacks fragmentLifecycleCallbacks =
new FragmentManager.FragmentLifecycleCallbacks() {
@Override
public void onFragmentAttached(@NonNull FragmentManager fm, @NonNull Fragment f, @NonNull Context context) {
super.onFragmentAttached(fm, f, context);
// TODO (3): Start recording the screen traces as soon as the Fragment is
// attached to its host Activity.
if (FRAGMENT_TAG.equals(f.getTag()) && screenTrace.isScreenTraceSupported()) {
screenTrace.recordScreenTrace();
}
}
@Override
public void onFragmentDetached(@NonNull FragmentManager fm, @NonNull Fragment f) {
super.onFragmentDetached(fm, f);
// TODO (4): Stop recording the screen traces as soon as the Fragment is
// detached from its host Activity.
if (FRAGMENT_TAG.equals(f.getTag()) && screenTrace.isScreenTraceSupported()) {
screenTrace.sendScreenTrace();
}
// Unregister Fragment lifecycle callbacks after the Fragment is detached
fm.unregisterFragmentLifecycleCallbacks(fragmentLifecycleCallbacks);
}
};
- برنامه را دوباره اجرا کنید. سپس روی دکمه
LOAD FRAGMENTضربه بزنید. چند ثانیه صبر کنید، سپس رویback buttonدر نوار ناوبری پایین کلیک کنید.
فایل logcat را با استفاده از " Logging trace metric " فیلتر کنید، سپس مانند زیر به دنبال گزارشها بگردید:
I/FirebasePerformance: Logging trace metric: _st_MainActivity-TestFragment (duration: XXXms)
لاگکت را با " FireperfViews " فیلتر کنید، سپس مانند زیر به دنبال لاگها بگردید:
D/FireperfViews: sendScreenTrace MainActivity-TestFragment, name: _st_MainActivity-TestFragment, total_frames: XX, slow_frames: XX, frozen_frames: XX
🎉 تبریک! شما با موفقیت فریمهای Slow/Frozen را برای یک Fragment اندازهگیری کرده و آن دادهها را به Firebase Performance Monitoring گزارش دادهاید. بعداً در این آزمایشگاه کد، معیارهای ثبت شده را در کنسول Firebase مشاهده خواهیم کرد.
۹. بررسی معیارها در کنسول Firebase
- در فایل logcat، روی آدرس اینترنتی کنسول Firebase کلیک کنید تا به صفحه جزئیات برای ردیابی بروید.

روش دیگر این است که در کنسول Firebase ، پروژهای که برنامه شما را در خود جای داده است را انتخاب کنید. در پنل سمت چپ، بخش Release & Monitor را پیدا کنید، سپس روی Performance کلیک کنید.
- در برگه اصلی داشبورد ، به پایین اسکرول کنید تا به جدول traces برسید، سپس روی برگه Custom traces کلیک کنید. در این جدول، traces کد سفارشی که قبلاً اضافه کردیم به علاوه برخی traces آماده مانند
_app_starttrace را مشاهده خواهید کرد. - دو رد کد سفارشی خود،
TestActivity-LoadTimeوTestFragment-LoadTimeرا پیدا کنید. برای مشاهده جزئیات بیشتر در مورد دادههای جمعآوریشده، روی مدت زمان هر یک کلیک کنید.

- صفحه جزئیات مربوط به ردیابی کد سفارشی، اطلاعاتی در مورد مدت زمان ردیابی (یعنی زمان بارگذاری اندازهگیری شده) را به شما نشان میدهد.

- همچنین میتوانید دادههای عملکرد را برای ردیابی صفحه نمایش سفارشی خود مشاهده کنید.
- به برگه اصلی داشبورد برگردید، به پایین بروید تا به جدول ردیابیها برسید، سپس روی برگه رندر صفحه کلیک کنید. در این جدول، ردیابیهای صفحه سفارشی که قبلاً اضافه کردیم به علاوه هرگونه ردیابی صفحه آماده مانند ردیابی
MainActivityرا مشاهده خواهید کرد. - مسیر ردیابی صفحه نمایش سفارشی خود،
MainActivity-TestFragmentرا پیدا کنید. برای مشاهده دادههای جمعآوریشده از رندرینگ کند و فریمهای متوقفشده، روی نام مسیر ردیابی کلیک کنید.

۱۰. تبریک
تبریک! شما با موفقیت زمان بارگذاری و عملکرد رندر صفحه نمایش یک Activity و یک Fragment را با استفاده از مانیتورینگ عملکرد Firebase اندازهگیری کردید!
کاری که شما انجام دادهاید
- شما Firebase Performance Monitoring را در یک برنامه نمونه ادغام کردید.
- اکنون چرخه حیات بارگذاری View را درک میکنید.
- شما زمان بارگذاری هر دو Activity و Fragment را با اضافه کردن ردیابی کدهای سفارشی اندازهگیری کردید.
- شما با اضافه کردن ردپاهای صفحه نمایش سفارشی با معیارهای سفارشی، فریمهای کند/متوقف شده را ضبط کردید
قدم بعدی چیست؟
Firebase Performance علاوه بر ردیابی سفارشی، روشهای بیشتری برای اندازهگیری عملکرد برنامه شما ارائه میدهد. این ابزار به طور خودکار زمان شروع برنامه، دادههای عملکرد برنامه در پیشزمینه و برنامه در پسزمینه را اندازهگیری میکند. وقت آن رسیده است که این معیارها را در کنسول Firebase بررسی کنید.
همچنین، Firebase Performance نظارت خودکار بر درخواستهای شبکه HTTP/S را ارائه میدهد. با این کار میتوانید به راحتی درخواستهای شبکه را بدون نوشتن حتی یک خط کد، بررسی کنید. آیا میتوانید چند درخواست شبکه از برنامه خود ارسال کنید و معیارها را در کنسول Firebase پیدا کنید؟
پاداش
حالا که میدانید چگونه زمان بارگذاری و عملکرد رندر صفحه نمایش Activity/Fragment خود را با استفاده از ردیابی کدهای سفارشی اندازهگیری کنید، میتوانید پایگاه کد متنباز ما را بررسی کنید تا ببینید آیا میتوانید این معیارها را برای هر Activity/Fragment که بخشی از برنامه است، به صورت پیشفرض ثبت کنید؟ در صورت تمایل میتوانید PR را ارسال کنید :-)
۱۱. یادگیری اضافی
درک آنچه در طول بارگذاری یک Activity اتفاق میافتد، به شما کمک میکند تا ویژگیهای عملکرد برنامه خود را بهتر درک کنید. در مرحله قبل، ما در سطح بالایی آنچه را که در طول بارگذاری یک Activity اتفاق میافتد، شرح دادیم، اما نمودار زیر هر مرحله را با جزئیات بسیار بیشتری شرح میدهد.
