Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

앱 성능 영혼까지 끌어올리기

앱 성능 영혼까지 끌어올리기

네이버제트에서 제페토 안드로이드 서비스의 성능을 개선하기 위해 했던 작업들과 그에 따른 성과를 정리해서 공유했던 발표입니다.
드로이드나이츠 2024 페스타 링크 https://festa.io/events/4990

Veronikapj

June 11, 2024
Tweet

More Decks by Veronikapj

Other Decks in Programming

Transcript

  1. য়ט੄ ݾ಴ ❏ ղо ஏ੿ೞҊ र਷ ࢿמ ੿ഛ൤ ੿੄ೞӝ ❏

    ѐࢶ ನੋ౟ܳ ଺ইղӝ ❏ “աب ೡ ࣻ ੓ח Ѣ৓ҳա!” ૒੽ ଺ਵ۞ оӝ
  2. 진짜 글로벌! this game is so fun muito 👍 🦸

    It's interesting. ✨ ❤ Love this game! Γ͵ͳΕ͖͖ Het is leuk om te spelen en de video's te maken! ṽ១ ᚕඑᄌᣍ戲ṽ១᧣ᨬᙈ Ꮨᦥᓓኈ跟༜ᠺ AMOO LA APP it's so fun and cool it's my fav game now i Love this game 🎮 ❤ super bueno y interesante 🥰 🥰 Минусов просто нет!5 двёзд! Очень крутая игра gamenya bagus, tapi dimohon buat zepeto buat perbaiki lagi bug yang ada di zepeto ini. ցޖજইਊ trop cool یلاع Jeux 𝑰 𝑵𝑪 𝑹𝑶 𝑨 𝒀 𝑨 𝑩𝑳 𝑬 je le conseil vrm ! 。 ^‿^。 يف ناك ول هولح هرم هبعللا تنك موجن سمخ نم رتكا اهتيطع ❤ هليمج
  3. नӏ ӝמ ѐߊ 서비스 초기에는 신규 기능 개발이 당연히 더

    중요 시장 적합성 확인 빠른 피드백 수집 경쟁력 확보를 위한 기능 차별화 아직은 부족한 개발 자원 빠른 반복과 개선 투자 유치 উ੿ࢿҗ ࣘب
  4. উ੿ࢿ? അ੤ө૑ח.. "당장 개발 마감 배포해야 하는데 크래시만 안나면 되지

    않을까?" "예외 처리는 귀찮으니까 나중에 해도 돼." "로그는 나중에 문제가 생기면 그때 가서 보면 되지." "크래시가 가끔 발생해도 상관없어. 중요한 건 기능이니까." "리뷰에 문제가 나와도 다들 그렇게 불평하는 거지 뭐."
  5. ࣘب? "한국은 빠른데.." "지금은 기능 구현이 더 중요해, 속도는 나중에

    생각할 문제야." "개선하려면 너무 많은 코드를 수정해야 해, 지금은 할 수 없어." "속도 때문에 불만을 가지는 사용자는 어차피 많지 않을 거야." "우리가 잘 만드는 다른 부분들로 사용자가 만족할 거야." "속도 문제는 나중에 리팩토링하면서 해결할 수 있어." അ੤ө૑ח..
  6. 앱 흐름에 대한 사용자의 사용 방식을 언급한 리뷰(예: 사용하기 쉬움,

    탐색하기 어려움, 사용자 친화적) 최신 앱 버전을 언급한 리뷰(예: 버전, 업데이트 등) 사용자가 앱을 제거한 이유를 언급한 리뷰(예: 제거, 제거 중, 제거함) 앱 문제를 언급한 리뷰(예: 비정상 종료, 버그, 정지 등) 앱 속도를 언급한 리뷰(예: 지연, 느림, 빠름 등) 앱이 하드웨어 소비에 미치는 영향을 언급한 리뷰(예: 배터리, 메모리, 데이터 등) 앱의 로그인 환경을 언급한 리뷰(예: 로그인, 로그아웃할 수 없음, 가입 등) 앱 디자인을 언급한 리뷰(예: 그래픽, 아름다운 게임, 보기에 멋짐 등 개인 정보 보호: 수집한 정보를 관리하는 기능이 언급된 리뷰 벤치마크 및 주제: 여러 주제가 앱 평점에 미치는 영향 확인
  7. ٣੗ੋ਷ ഐಣ! 655 리뷰개수 0 6 5 0 1 3

    0 0 1 9 5 0 2 6 0 0 안정성 속도 계정 문제 디자인 사용 편의성 벤치마크 및 주제: 여러 주제가 앱 평점에 미치는 영향 확인
  8. ࢲ࠺झ ࠺ૉפझ ࢿ੢җ ࢿמ੄ ࢚ҙ ҙ҅ 2 m 4 4

    s ANR Rate 2 m 2 4 s Crash Rate Android vitals: Debug app performance and reap rewards (Google I/O ’ 18 ) 하루 게임 플레이 시간 변화량 Crash 발생률이 가장 낮은 앱과 가장 높은 앱 비교
  9. https://www.thestreet.com/markets/commodities/product-life-cycle-14882534 ࢿ੢(Growth) ױ҅ • 사용자 수와 트래픽이 급격히 증가 •

    성능 문제가 발생할 가능성 • 성능이 낮으면 사용자가 이탈 이 시점에서 성능 최적화와 확장성 개선이 필요합니다. 인 프라를 확장하고, 코드를 최적화하며, 데이터를 효율적으 로 관리하는 것이 중요합니다. ࢿמ ҙܻ द੼
  10. https://www.thestreet.com/markets/commodities/product-life-cycle-14882534 ࢿࣼ ߂ ನച(Maturity) ױ҅ • 시장에서의 입지가 확고해지면서 경쟁이

    심화 • 사용자의 기대치 상승 • 성능 저하가 사용자 경험에 직접적인 영향 • 기존 사용자들의 만족도를 유지 지속적인 성능 모니터링과 최적화 작업이 필요합니다. 성 능 저하를 예방하고, 시스템의 안정성을 유지하기 위해 정 기적인 점검과 업그레이드를 실시해야 합니다. 사용자 경 험을 향상 시키기 위해 지속적인 개선이 필요합니다. ࢿמ ҙܻ द੼
  11. ו۰૓ Ѫ э਷ؘ ӝ࠙ ఒੋо? Debugging … 어디가 느려진 거지…

    문제 인식 문제 재현 문제 분석 원인 파악 해결책 도출 해결책 검증
  12. 문제 인식 문제 재현 문제 분석 원인 파악 해결책 도출

    해결책 검증 नӏ ѐߊ दр < ٣ߡӦ दр
  13. 문제 인식 문제 재현 문제 분석 원인 파악 해결책 도출

    해결책 검증 = ݽפఠ݂ਸ ഝਊ೧ࠁ੗ ޙઁ ߄۽ ঌ ࣻ ੓ח ߑߨ੉ ੓ਸө? 우리 팀의 목표 중요한 기능 개발 및 성능 최적화에 집중 개선효과도 측정 성능 트렌드를 분석하고 데이터 기반 의사 결정
  14. ࢿמ ҙܻ ೨ब ਃࣗ 응답성 안정성 효율성 앱이 얼마나 빠르게

    반응하는 지 크래시나 ANR 문제 를 일으키진 않는지 CPU, Memory, Battery, Network 자원을 얼마나 효율적으로 사용하는 지
  15. ݽפఠ݂ী ࢎਊೞҊ ੓ח ో Firebase Performance Monitoring Crashlytics Nelo Firebase

    Performance Monitoring 앱이 얼마나 빠르게 반응하는 지 크래시나 ANR 문제 를 일으키진 않는지 CPU, Memory, Battery, Network 자원을 얼마나 효율적으로 사용하는 지
  16. উ੿ࢿ Ցযৢܻӝ ❏ যו ചݶ ژח ஶబஎীࢲ ߊࢤ೮ਸө? ❏ Ӓ

    ചݶө૑ যڌѱ ٜযт ࣻ ੓ਸө? (૓ੑ ҃۽) ❏ ചݶীࢲ ਬ੷о ݃૑݄ਵ۽ ೠ ز੘ ژח ݃૑݄ী ഐ୹ػ ݫࢲ٘ ח ޖ঺ੌө? ❏ ௼ېदо ߊࢤೞח ౠ੿ ӝӝ ౠࢿ੉ ੓ਸө?
  17. ௼ېद ߊࢤೠ ചݶ Lifecycle ۽Ӧೞӝ - FragmentLifecycleCallbacks ❏ Fragment ࢚క

    ߸ച ݽפఠ݂ - onCreate, onStart, onFragmentSaveInstance ❏ ৈ۞ Fragment ࢚క ߸ചܳ ઺ঔীࢲ ҙܻ ❏ ഛ੢ࢿ : ࢜۽਍ Fragmentо ୶оীب ੸ਊ ❏ ࢤݺ઱ӝ ੉߮౟ܳ ۽ӦೞѢա ٣ߡӦೞחؘ ਬਊ ❏ ܻࣗझ ೡ׼ ߂ ೧ઁ ೞח ҃਋ীب ਬਊ https://developer.android.com/reference/androidx/fragment/app/FragmentManager.FragmentLifecycleCallbacks
  18. class MyLifecycles : FragmentManager.FragmentLifecycleCallbacks() { override fun onFragmentCreated(. . .)

    {} override fun onFragmentResumed(fm: FragmentManager, f: Fragment) { super.onFragmentResumed(fm, f) Log.d("FragmentLifecycle", "Fragment resumed: ${f.javaClass.simpleName}") } override fun onFragmentSaveInstanceState(. . .) {} // ׮ܲ ࢤݺ઱ӝ ௒ߔب زੌೠ ߑधਵ۽ য়ߡۄ੉٘ оמ } അ੤ ചݶ ౵ঈೞӝ
  19. class MyLifecycles : FragmentManager.FragmentLifecycleCallbacks() { override fun onFragmentCreated(. . .)

    {} override fun onFragmentResumed(. . .) {} override fun onFragmentSaveInstanceState(fm: FragmentManager, f: Fragment) { super.onFragmentSaveInstance(fm, f) Log.d(“Fragment..”, "Fragment saveInstance: ${f.javaClass.simpleName}") } // ׮ܲ ࢤݺ઱ӝ ௒ߔب زੌೠ ߑधਵ۽ য়ߡۄ੉٘ оמ } ௼ېद ੗઱ ߊࢤೞח ನੋ౟
  20. class MyActivity : AppCompatActivity() { override fun onConfigurationChanged(newConfig: Configuration) {}

    override fun onNewIntent(intent: Intent?) {} override fun onLowMemory() { // onTrimMemory() } } Activity ࢚ীࢲ ਬਊ ೮؍ ࢤݺ઱ӝ
  21. class MyActivity : AppCompatActivity() { override fun onConfigurationChanged(newConfig: Configuration) {

    super.onConfigurationChanged(newConfig) Log.d("ActivityLifecycle", “configuration: ${newConfig.orientation}“) } override fun onNewIntent(intent: Intent?) { } override fun onLowMemory() { // onTrimMemory() } } Configuration ߸҃ द (ചݶ ߑೱ ੹ജ)
  22. class MyActivity : AppCompatActivity() { override fun onConfigurationChanged(newConfig: Configuration) {}

    override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) Log.d("ActivityLifecycle", "onNewIntent: ${ActivityName ١ ۽Ӧ ੿ࠁ}”) } override fun onLowMemory() { // onTrimMemory() } } ಹद ঌܿ ௿ܼೡ ٸ, ٩݂௼ ୊ܻ ١
  23. class MyActivity : AppCompatActivity() { override fun onConfigurationChanged(newConfig: Configuration) {}

    override fun onNewIntent(intent: Intent?) {} override fun onLowMemory() { // onTrimMemory() super.onLowMemory() Log.d(“ActivityLifecycle”, "onLowMemory: ${MemoryState ١ ۽Ӧ ੿ࠁ}”) } } ౠ൤ ݫݽܻ ࠗ઒ೠ ࢚ട੉ ੓ח૑
  24. "2024-06-06T04:50:57.5780000Z": "onFragmentCreated QuestFragment", "2024-06-06T04:50:57.8380000Z": "onViewCreated QuestFragment", "2024-06-06T04:50:57.8500000Z": "onStart QuestFragment", "2024-06-06T04:50:57.9090000Z":

    "onDestroyView MainFragment", "2024-06-06T04:50:57.9110000Z": "onResume QuestFragment", "2024-06-06T04:51:51.6050000Z": "onPause QuestFragment", "2024-06-06T04:52:00.8740000Z": "onStop QuestFragment", "2024-06-06T04:52:00.9460000Z": "onFragmentSaveInstanceState QuestFragment" CRASH! ௼ېद ۽Ӓী ৢۄৡ ചݶ ӝ۾ ഛੋೞӝ
  25. ӝӝ ౠࢿ ౵ঈೞӝ ❏ ֎౟ਕ௼ : Request URL, Level, Strength,

    Type(Wifi/LTE) ❏ UnknownHostException, SocketTimeoutException, SSLException ١
  26. ӝӝ ౠࢿ ౵ঈೞӝ ❏ ֎౟ਕ௼ : Request URL, Level, Strength,

    Type(Wifi/LTE) ❏ UnknownHostException, SocketTimeoutException, SSLException ١ ❏ ߊࢤ Ҵо, ࢎਊ ঱য ❏ ౠ੿ Ҵо ੉߮౟ ژח ঱য ܻࣗझ ੉ग: ইۉӂ ঱য (RTL - Right to Left)
  27. ӝӝ ౠࢿ ౵ঈೞӝ ❏ ֎౟ਕ௼ : Request URL, Level, Strength,

    Type(Wifi/LTE) ❏ UnknownHostException, SocketTimeoutException, SSLException ١ ❏ ߊࢤ Ҵо, ࢎਊ ঱য ❏ ౠ੿ Ҵо ੉߮౟ ژח ঱য ܻࣗझ ੉ग: ইۉӂ ঱য (RTL - Right to Left) ❏ ӝӝ ࢎন: ݽ؛ ੿ࠁ, ઁઑࢎ, GPU ੿ࠁ, ੹୓ RAM ࢎ੉ૉ, ABI, OS ߡ੹ ١ ❏ 32bit ABI ীࢲ ߊࢤೞѢա Unity ৬ ౠ੿ GPU ഐജ ҙ۲ ௼ېद
  28. ӝӝ ౠࢿ ౵ঈೞӝ ❏ ֎౟ਕ௼ : Request URL, Level, Strength,

    Type(Wifi/LTE) ❏ UnknownHostException, SocketTimeoutException, SSLException ١ ❏ ߊࢤ Ҵо, ࢎਊ ঱য ❏ ౠ੿ Ҵо ੉߮౟ ژח ঱য ܻࣗझ ੉ग: ইۉӂ ঱য (RTL - Right to Left) ❏ ӝӝ ࢎন: ݽ؛ ੿ࠁ, ઁઑࢎ, GPU ੿ࠁ, ੹୓ RAM ࢎ੉ૉ, ABI, OS ߡ੹ ١ ❏ 32bit ABI ীࢲ ߊࢤೞѢա Unity ৬ ౠ੿ GPU ഐജ ҙ۲ ௼ېद ❏ Installer : জ੉ ࢸ஖ػ ݃௄ ೒ۨ੉झ ❏ ݫݽܻ ࢚క : Runtime Free, Native Free ١
  29. ࢿמ ҙܻ ೨ब ਃࣗ 응답성 안정성 효율성 앱이 얼마나 빠르게

    반응하는 지 크래시나 ANR 문제 를 일으키진 않는지 CPU, Memory, Battery, Network 자원을 얼마나 효율적으로 사용하는 지
  30. ਽׹ࢿ Ցযৢܻӝ ❏ জ द੘ दр਷ ঴݃ա ؼө? ❏ Cold

    Start, Warm Start, Hot Start ❏ UI ߈਽ ࣘب ❏ ചݶ ߹ ۪؊݂ ؘ੉ఠ : וܽ ۪؊݂ ژח ੿૑ ೐ۨ੐ ❏ ؘ੉ఠ ۽٬ दр ❏ ֎౟ਕ௼ ਃ୒ दр, ۽ஸ ؘ੉ఠ ঘࣁझ दр
  31. ബਯࢿ Ցযৢܻӝ ❏ CPU ࢎਊܫ ❏ ݫݽܻ ࢚క ❏ ߓఠܻ

    ࢎਊ ❏ ֎౟ਕ௼ ࢎਊ۝ ❏ জ ࢎ੉ૉ
  32. ਽׹ࢿ & ബਯࢿ Ցযৢܻӝ https://firebase.google.com/products/performance?hl=ko 네트워크 상태와 성능 파악 앱

    성능에 대한 유용한 정보 문제 해결 시간 단축 Firebase Performance Monitoring
  33. ਽׹ࢿ & ബਯࢿ Ցযৢܻӝ Firebase Performance Monitoring ❏ ੗ز ୶੸

    ӝמ ❏ জ द੘ दр ❏ HTTP/S ֎౟ਕ௼ ਃ୒ ❏ ചݶ ߹ ۪؊݂ ؘ੉ఠ ❏ জ੄ Foreground, Background ৈࠗ
  34. ਽׹ࢿ & ബਯࢿ Ցযৢܻӝ Firebase Performance Monitoring ❏ ੗ز ࣻ૘

    غח ӝࠄ ࣘࢿ ❏ জ ߡ੹ ❏ Ҵо ❏ OS ࣻળ ❏ ӝӝ ❏ ޖࢶ / ੉زాनࢎ, MIME ਬഋ
  35. ࢎਊ੗ ҃೷ী ؀ೠ ੉೧ -1 버전 -2 버전 ੗ز ࣻ૘ػ

    App Start Time জ ߡ੹ ߹ Application Start ~ Activity onResume() 전체 현재버전 -1 버전 배포 현재 버전 배포
  36. ࢎਊ੗ ҃೷ী ؀ೠ ੉೧ -1 버전 -2 버전 전체 -1

    버전 배포 ࢜ ߡ੹੉ ߓನܳ द੘ೞݶ ੉੹ ߡ੹ ࣘبо ו۰૑֎
  37. ࢎਊ੗ ҃೷ী ؀ೠ ੉೧ -1 버전 -2 버전 전체 현재

    버전 배포 ইೞ! ࢿמ੉ ࢚؀੸ਵ۽ જ਷ ٣߄੉झܳ ࢎਊೞח ਬ੷о জ সؘ੉౟ী ؊ ޹хೠ ҃ೱ੉ ੓ҳա! 현재버전
  38. ࢎਊ੗ ҃೷ী ؀ೠ ੉೧ 미국 한국 ੗ز ࣻ૘ػ Network Trace

    전체 ೠҴҗ ޷Ҵ ֎౟ਕ௼ ࣘبо 3ߓ ର੉о ա֎
  39. ਽׹ࢿ & ബਯࢿ Ցযৢܻӝ Custom Trace 설정하기 ❏ জীࢲ ف

    द੼ рী ஭୊ػ ࢿמ ؘ੉ఠ ࠁҊࢲ ❏ ਬ੷о ઱۽ ࢎਊೞח ಕ੉૑ ҃۽੄ ࣗਃदр ❏ home_init ❏ feed_enter, world_enter ❏ profile_display
  40. ❏ दр ࠙ನب ❏ ӝ۾ػ ٣߄੉झ ࣘࢿ ߂ दр ❏

    CPU ࢎਊ۝ ❏ ݫݽܻ ࢎਊ۝ ❏ On Device ❏ Network पઁ Trace Session
  41. ޖ঺ࠗఠ ࠊঠ ೡ૑ ݽܰѷ׮ݶ, о੢ ૣѱ ӝ۾ػ ࣁ࣌җ о੢ ӡѱ

    ӝ۾ػ ࣁ࣌੄ ର੉੼ਸ ଺ইࠁӝ Short Long
  42. জ द੘ दр੄ ੉೧ Process Init Activity.onCreate Activity.onStart https://developer.android.com/topic/performance/vitals/launch-time?hl=ko ❏

    জ ۽٘ ߂ द੘ ❏ द੘ ૒ റ জ੄ ࠼ द੘ହ ಴द ❏ জ ೐۽ࣁझ ٜ݅ӝ Cold Start
  43. জ द੘ दр੄ ੉೧ Process Init Activity.onCreate Activity.onStart https://developer.android.com/topic/performance/vitals/launch-time?hl=ko ❏

    জ ё୓ ٜ݅ӝ ❏ Main Thread द੘ ❏ MainActivity ࢤࢿ ❏ Inflate views ❏ ചݶ Layout ߂ initial draw Cold Start
  44. п ೒ۖಬ ߹ ஏ੿ दр ӝળ Process Init Activity.onCreate Other

    stuff Inflate Views জ੄ UI ୐ߣ૩ ೐ۨ੐ਸ ୊਺ ಴दೞחؘ Ѧܽ दр(TTID) onDraw() https://developer.android.com/topic/performance/vitals/launch-time?hl=ko
  45. п ೒ۖಬ ߹ ஏ੿ दр ӝળ Process Init Activity.onCreate Other

    stuff Inflate Views জ੄ UI ୐ߣ૩ ೐ۨ੐ਸ ୊਺ ಴दೞחؘ Ѧܽ दр(TTID) onDraw() Android Vitals ীࢲ ஏ੿ ೦ݾਵ۽ ࢎਊ Cold 5 초 이상 Warm 2 초 이상 Hot 1 . 5 초 이상 https://developer.android.com/topic/performance/vitals/launch-time?hl=ko
  46. п ೒ۖಬ ߹ ஏ੿ दр ӝળ Process Init Activity.onCreate Other

    stuff Inflate Views FirebasePerfProvider.onCreate() Activity.onResume() Firebase Performance Monitoring _app_start ীࢲ ஏ੿ ೦ݾਵ۽ ࢎਊ https://firebase.google.com/docs/perf-mon?hl=ko
  47. ਋ܻ জ੉ द੘ೡ ٸө૑ Ѧܻח दр Process Init Activity.onCreate Other

    stuff ৮੹൤ ಴दೞחؘ Ѧܽ दр (TTFD) reportFullyDrawn() = জਸ ৮੹൤ ࢎਊೡ ࣻ ੓ѱ غӝө૑ Ѧܻח दр Inflate Views
  48. ਋ܻ জ੉ द੘ೡ ٸө૑ Ѧܻח दр Process Init Activity.onCreate Other

    stuff Custom Trace ஏ੿ ૑੼ਵ۽ ࢎਊ ❏ জ UI ؘ੉ఠо ળ࠺ غח दр ❏ জ ই߄ఋо աఋաח दр ❏ ਬפ౭о ৮੹൤ द੘ غח दр ৮੹൤ ಴दೞחؘ Ѧܽ दр (TTFD) reportFullyDrawn() = জਸ ৮੹൤ ࢎਊೡ ࣻ ੓ѱ غӝө૑ Ѧܻח दр Inflate Views
  49. ೡ ࣻ ੓ח Ѫٜ਷ ޖ঺੉ ੓ਸө? ❏ জ द੘ दр

    Baseline Profile ੸ਊೞӝ ❏ ࠺ૉפझ ۽૒ & ۪؊݂ ࢿמ ୭੸ച ❏ Unity Init ਸ ܻ࠙ೞӝ
  50. Baseline Profile ੘ز ߑध https://developer.android.com/topic/performance/baselinepro fi les/overview?hl=ko#how-baseline-pro fi les-work Cloud

    Profile : Android 9 (API 2 8 ) 이상 지원, 업데이트 후 배포까지 수 일이 걸릴 수도 있음
  51. class StartupBaselineProfile { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun

    generate() = baselineProfileRule.collect( PACKAGE_NAME, includeInStartupProfile = true, profileBlock = MacrobenchmarkScope::startActivityAndAllowNotifications, ) } fun MacrobenchmarkScope.startActivityAndAllowNotifications() { startActivityAndWait() allowNotifications() } https://github.com/android/nowinandroid/tree/main/benchmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/baselineprofile BaselineGenerator Profile 에 추가할 앱 시작 까지의 동작을 이 profileBlock에 추가
  52. class StartupBaselineProfile { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun

    generate() = baselineProfileRule.collect( PACKAGE_NAME, includeInStartupProfile = true, profileBlock = MacrobenchmarkScope::startActivityAndAllowNotifications, ) } fun MacrobenchmarkScope.startActivityAndAllowNotifications() { startActivityAndWait() allowNotifications() } https://github.com/android/nowinandroid/tree/main/benchmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/baselineprofile BaselineGenerator MacrobenchmarkScope 에서 동작
  53. https://github.com/android/nowinandroid/tree/main/benchmarks/src/main/kotlin/com/google/samples/apps/nowinandroid/baselineprofile @Test fun startupPrecompiledWithBaselineProfile() = startup(CompilationMode.Partial(baselineProfileMode = Require)) private fun

    startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( packageName = PACKAGE_NAME, metrics = listOf(StartupTimingMetric()), compilationMode = compilationMode, iterations = 20, startupMode = COLD, setupBlock = { pressHome() allowNotifications() }, ) { startActivityAndAllowNotifications() // Waits until the content is ready to capture Time To Full Display forYouWaitForContent() } Macrobenchmark StartupBenchmark.kt Macrobenchmark에서 동일한 메서드를 가지고 측정하는데 사용 가능
  54. StartupBenchmark Ѿҗ Device Min Medium Max 초 저사양 52 .

    55 % 48 . 96 % 45 . 37 % 저사양 14 . 26 % 17 . 05 % 19 . 51 % 중사양 5 . 6 4 % 3 . 8 8 % 28 . 64 % 고사양 0 . 3 9 % 3 . 6 7 % 7 . 0 9 % timeToFullDisplayMs timeToInitialDisplayMs Device Min Medium Max 저사양 18 . 21 % 20 . 94 % 21 . 15 % 중사양 10 . 56 % 16 . 08 % 10 . 86 % 고사양 11 . 07 % 15 . 85 % 26 . 16 % No Compilation 대비 BaselinePro fi le 시간 감소치
  55. StartupBenchmark Ѿҗ timeToFullDisplayMs Device Min Medium Max 저사양 18 .

    21 % 20 . 94 % 21 . 15 % 중사양 10 . 56 % 16 . 08 % 10 . 86 % 고사양 11 . 07 % 15 . 85 % 26 . 16 % No Compilation 대비 BaselinePro fi le 시간 감소치 평균 15~16%의 속도 감소 효과를 기대
  56. Firebase Monitoring Ѿҗ 2 . 4 2 . 5 5

    2 . 7 2 . 8 5 3 Day 1 Day 2 Day 3 Day 4 Baseline 적용하지 않은 최신 버전 이전 버전 : CloudPro fi le 적용 속도 2 . 3 2 . 4 2 5 2 . 5 5 2 . 6 7 5 2 . 8 Day 1 Day 2 Day 3 Day 4 Baseline 적용한 최신 버전 이전 버전 : CloudPro fi le 적용 속도 Day 3 Day 1 _app_start 90 % 전체 값
  57. Firebase Monitoring Ѿҗ 12 12 . 5 13 13 .

    5 14 Day 1 Day 2 Day 3 Day 4 Baseline 적용하지 않은 최신 버전 이전 버전 : CloudPro fi le 적용 속도 11 12 13 14 15 Day 1 Day 2 Day 3 Day 4 Baseline 적용한 최신 버전 이전 버전 : CloudPro fi le 적용 속도 Day 2 Day 1 Custom Trace Init (timeToFullyDrawn) 9 0 % 전체 값
  58. Baseline Profile ઱੄ೡ Ѫ ❏ Baseline Profileਸ ࢤࢿೞ૑ ঋইب ੉޷

    জী ನೣ ❏ Jetpack ۄ੉࠳۞ܻী ؀ೠ ࠗ࠙੉ ੉޷ ੸ਊغয ੓ӝ ٸޙ! 제대로 적용되었는지 확인하려면 생성된 baseline.prof 사이즈 확인!
  59. জ द੘ द ೞҊ ੓ח ੉۠੷۠ ੘সٜ _app_start 측정 Splash

    화면 Main 화면 home_init 측정 bindApplication Activity start Unity 초기화 큰 작업 1 큰 작업 2 화면 리소스 로드 필요 API 호출 API 기타 등등 필요한 리소스
  60. জ द੘ द ೞҊ ੓ח ੉۠੷۠ ੘সٜ ખ ؊ ࢿמ

    Ցযৢܻӝ _app_start 측정 Splash 화면 Main 화면 home_init 측정 bindApplication Activity start Unity 초기화 큰 작업 1 큰 작업 2 화면 리소스 로드 필요 API 호출 API 기타 등등 필요한 리소스
  61. ӝ؀ࠁ׮ ஼؍ ബҗ 이전 버전 개선 최신 버전 전체 home_init

    측정 : 앱 UI 준비 까지 개선된 최신 버전에서 약 35% 감소
  62. জ द੘ द ೞҊ ੓ח ੉۠੷۠ ੘সٜ ખ ؊ ࢿמ

    Ցযৢܻӝ _app_start 측정 Splash 화면 Main 화면 home_init 측정 bindApplication Activity start Unity 초기화 큰 작업 1 큰 작업 2 화면 리소스 로드 필요 API 호출 API 기타 등등 필요한 리소스 API 기타 등등 진짜 필요한 시점으로 연기해볼까?
  63. ৉द ੓঻؍ ബҗ home_init 측정 : 앱 UI 준비 까지

    10 . 4 10 . 6 7 5 10 . 9 5 11 . 2 2 5 11 . 5 Day 1 Day 2 Day 3 Day 4 개선된 최신 버전 이전 버전 벤치마크 테스트 결과 BaselineProfile Compilation 기준 약 3% 감소 Performance Monitoring 기준 6~9% 감소 효과
  64. Feed ചݶ XML ীࢲ Compose ݃੉Ӓۨ੉࣌ 벤치마크 테스트 결과 진입

    속도 기준 약 25% 감소 Performance Monitoring 같은 기준 약 23% 감소 + 비즈니스 로직 개선
  65. জ द੘ दр ѐࢶ ࢎ۹ܳ ా೧ ঌѱ ػ Ѫ 리소스

    최적화를 잘하면 기대 이상의 효과를 얻는 것도 가능! CPU 사용 부하 줄이기 네트워크 부하 줄이기 앱 리소스를 효율적으로 사용하면 응답속도도 빨라진다
  66. য়ט ޖ঺ਸ ࠌ঻૑? ❏ উ੿ࢿ Ցযৢܻӝ ❏ ചݶ Lifecycle ੜ

    ୓௼೧ࠁӝ ❏ ӝӝ ౠࢿ ౵ঈೞӝ ❏ জ ࢿמ ஏ੿ೞӝ ❏ Firebase Performance Monitoring ❏ জ द੘ ࢿמ ѐࢶೞӝ ❏ জ द੘ दр Baseline Profile ੸ਊ & Macrobenchmark ۽ ۽ஸ ஏ੿ ❏ ࠺ૉפझ ۽૒ ୭੸ച