코딩하기/Android

안드로이드 성능 문제 해결을 위해(오늘밤도 글렀..)

알랭드1종보통 2022. 2. 23. 16:49
반응형

 

오늘도 성능 이슈 해결을 위해 고생하는 당신을 위해

 

안녕하세요 긍정열매입니다

"왜 이리 느려요?"

어플을 개발하다보면 이런 피드백을 한번쯤 경험하게 됩니다

열심히 개발했지만 일정에 치여서, 원가절감에 의해, 화려한 애니메이션 적용을 위해등등 여러가지 대외(?)적인 상황에 그렇게 시장에 내놓을수 밖에 없었다고 하소연하고 싶을지도 모릅니다

하지만 일개 힘없는 개발자로서 안타깝게도 그럴수가 없기에 어떻게든 성능을 향상 시킬수 있는 방법을 찾아야 하는게 숙명이겠죠

저역시 그동안 많은 성능 이슈를 겪어왔고, 이를 개선하고자 했던 노력들을 조금씩 정리해보고자 합니다. 

그중 오늘은 아래와 같은 카테고리들로 안드로이드 어플리케이션 성능에 대해서 이야기 해보고자 합니다

  • 성능에 대한 정의
  • 성능 이슈 해결을 위한 기본적인 지식
  • 성능 개선 예제 유형
  • 성능 프로파일 도구

 

1. 성능에 대한 정의

아래의 안드로이드 사이트에 기본 게재되어 있는 내용 ( 강력한 성능  |  Android 개발자  |  Android Developers) 에 따르면 성능에 대해서 다음과 같이 이야기하고 있습니다.

 

강력한 성능  |  Android 개발자  |  Android Developers

강력한 성능 멋진 아이디어를 구현하는 것은 사용자들을 즐겁게 하는 앱을 만들기 위한 훌륭한 출발이지만 시작일 뿐입니다. 다음 단계는 앱의 성능을 극대화하는 것입니다. 예를 들어 사용자

developer.android.com

  • 전력을 조금만 사용합니다.
  • 빠르게 시작됩니다.
  • 사용자 상호작용에 신속하게 반응합니다.

개발 초창기부터 위 내용을 반영하여 설계 및 개발을 하게 된다면 좋겠지만, 개발 규모나 기간에 따라서 기능을 먼저 구현이 우선시 되는 경우가 많기에 사후 최적화를 보통 하게 됩니다

실제 개발에서도 위 기준을 바탕으로 테스트가 이루어지고 있으며 다양한 원인에 의해 문제점들이 발생하게 됩니다

그중 몇가지 예를 들면 아래의 원인등으로 발생하게 됩니다

  •  많은 전력 사용
    • 일정시간동안에 필요없이 화면을 다시 그리거나, 빈번한 네트워크 요청이 이루어짐
  • 느리게 시작
  • 사용자 상호작용에 반응 없거나 느린 반응
    • 버튼을 눌러 작업을 요청하였으나 기존 작업이 끝나지 않아 다음 터치까지 응답이 없어 ANR(Application not responding) 이 발생함
위의 이슈들은 언뜻보면 당연히 하지 말아야 하지만 실제 개발시 위에서 이야기한 것처럼 개발일정등 다양한 외부요인(?)으로 미흡한 코드들이 반영이 되고 결국 문제 발생후에야 디버깅에 의해 문제 해결을 하게됩니다.
문제점 해결을 하기 위해서는 기본에 충실한 설계도 중요하지만, 안드로이드 플랫폼 특성에 따른 설계도 고려가 필요하게됩니다. 
 

2. 성능 이슈 해결을 위한 기본적인 지식

구글에서는 성능 문제를 해결하기 위해 아래와 같은 특정 부분들에 대해서 가이드하고 있습니다

성능 이슈 해결을 하시고자 하는분들은 기본 지식을 위해 아래의 내용을 한번쯤은 꼭 읽어보시길 권장합니다

 

3. 성능 개선 예제 유형

실제로 어플리케이션의 성능을 향상을 위해 위 카테고리들의 정보들을 이용하여 다음의 몇가지 성능 계선했던 예를 설명해보겠습니다

우선 첫번째로 Android UI의 레이아웃의 성능을 개선을 시도해볼수 있었습니다

    • 레이아웃 성능 개선
      • 레이아웃 계층 구조 최적화를 한다 
      • 같은 화면을 그리더라도 여러가지 타입의 layout을 사용해 화면을 구성할 수 있습니다. 그러나 사용하고자 하는 layout의 고유의 특성이 없더라도 같은 화면을 구성할 수 있다면 좀 더 저렴한 layout을 사용하는게 좋습니다 예를들어 RelativeLayout에서 ConstraintLayout으로 변경하는 것도 한 방법입니다. 자세한 내용은  아래의 구글 포스팅을 참고하시면 될거 같습니다
      • merge를 통해 계층 구조를 단순화 합니다
        • 화면을 그릴때 컨테이너 역할을 위해 루트뷰에 layout이 필요하게 될때가 있습니다. 그러나 이런 layout은 다른 view에 하위로 사용하게 될때 성능저하가 발생하게 됩니다. 이를 merge 태그를 통해 상위 view에 합쳐서 전체 view의 갯수 및 계층구조를 단순화 할 수 있습니다
      • 실제 사용하는 타이밍에 뷰를 로드하도록 한다
        • 사용 빈도가 낮거나 당장은 필요하지 않지만 기본 layout에 넣어 구성해야 될 복잡한 화면이 필요할때가 있습니다.
        • 하지만 이러한 화면 구성이 기본 layout에 표현이 된다면 Visible속성을 Gone이나 invisible로 기본 설정을 하더라도 기본 layout을 로딩할때 같이 inflate되면서 로딩 속도 및 메모리에 영향을 미치게 됩니다
        • 이러한 layout은 ViewStub를 사용하여 필요시 로딩하게 변경 할수 있습니다
 

레이아웃 성능 개선  |  Android 개발자  |  Android Developers

레이아웃 성능 개선 레이아웃은 사용자 환경에 직접적으로 영향을 미치는 Android 애플리케이션의 핵심 부분입니다. 레이아웃이 잘못 구현되면 UI가 느려지므로 애플리케이션의 메모리가 부족해

developer.android.com

 

두번째로 스레딩을 통해 병목된 부분에 대하여 성능 개선을 시도해 볼수 있었습니다

  • 스레딩을 통한 성능 개선
    • Android 애플리케이션은 일반적으로 단일 스레드(기본적으로 'UI 스레드' 또는 '주 스레드')에서 전적으로 실행됩니다.
    • 따라서 onCreate ~ onResume 까지의 구간에서는 가급적 작은 수행 시간을 가진 필수 기능만을 호출하도록 구조를 설계하는것이 좋습니다
    • 단 이구간에 필히 수행 되어야 하나 오래 걸리는 기능의 경우 가급적 별도의 스레드를 만들어 호출하게 하는것이 좋습니다
    • 이를 위해 안드로이드는 다양한 클래스들을 제공하고 있습니다 위 링크를 참고하시기 바랍니다
 

스레딩을 통한 성능 개선  |  Android 개발자  |  Android Developers

스레딩을 통한 성능 개선 Android에서 스레드를 잘 사용하면 앱의 성능을 높일 수 있습니다. 이 페이지에서는 스레드 작업의 여러 측면을 설명합니다. UI 스레드(기본 스레드) 작업, 앱 수명 주기와

developer.android.com

 

세번째로 apk의 사이즈를 줄여 볼수 있었습니다

네번째로 메모리의 사이즈를 최적화 해볼수 있었습니다

  • 모든 프로그램은 디바이스 메모리를 기반으로 동작하고 있기에 많은 메모리 사용은 시스템에 부하를 일으키게 됩니다 또한 한정된 메모리안에서 앱이 원활히 동작하기 위해서 안드로이드는 메모리 확보를 위해 가비지 컬렉션을 지속적으로 구동시킵니다 이는 결국 UI가 구동되어야 하는 시간과 겹치게 되면 16ms 안에 화면이 처리가 되지 않아 사용자에게 버벅이는 화면을 보여주게 됩니다
    • Android 스튜디오의 메모리 프로파일러를 사용하여 메모리 할당된 객체를 추적하고 필요없는 객체를 사용하지 않게 수정할수 있습니다
    • onTrimMemory에 의해 메모리 부족 이벤트가 왔을때 불필요한 객체들을 해제하게 적용할수 있습니다
 

메모리 프로파일러를 사용하여 앱의 메모리 사용량 검사  |  Android 개발자  |  Android Developers

끊김 현상, 멈춤, 심지어 비정상 종료를 일으킬 수 있는 메모리 누수 및 메모리 변동을 식별하는 데 도움이 되는 Android 프로파일러의 메모리 프로파일러 구성요소를 알아보세요.

developer.android.com

 

 

다섯번째로 기준 프로필  |  Android 개발자  |  Android Developers 을 사용하여 최적화를 해볼 수 있습니다.

  • Android 7.0에서 코드 프로파일링이 있는 JIT(Just in Time) 컴파일러가 ART에 추가되었습니다. 이를 통해 다양한 이점이 발생했지만, 자주 사용하는 기본 기능 가령 시작시 사용하는 코드에 대해서도 코드 로드 시간이 길어지는 단점이 있습니다. 이를 보완하기 위해 기준프로필이라는 프로필 기반의 PGO라는 것을 사용할수 있습니다.
  • 진입시간 성능에서  기준 프로필 적용 유무에 따라 jit thread가 많이 나타나며 속도에 영향을 주고 있는 부분 확인할 수 있습니다
  • 따라서 일정 규칙을 만들고 적절히 사용하면 진입 성능 개선을 만들수 있습니다 하지만 JIT의 이점을 일부분 잃기 때문에 적용하고자 할때 성능 테스트를 해서 최적의 규칙을 만들도록 노력해야 합니다
 

기준 프로필  |  Android 개발자  |  Android Developers

기준 프로필 기준 프로필은 Android 런타임(ART)이 설치 중에 중요한 경로를 기계어 코드로 사전 컴파일하는 데 사용하는 APK에 포함된 클래스 및 메서드 목록입니다. 기준 프로필은 앱이 시작을 최

developer.android.com

 

5. 성능 프로파일 도구

성능 개선은 문제가 발생하는 원인이 어디에 기인하는지 확인하는게 먼저이기때문에 분석이 가장 중요합니다.

안드로이드에서는 문제 해결을 위한 다양한 프로파일 & 디버깅 도구를 제공하고 있어 적재적소에 잘 활용한다면 문제를 보다 빠르게 해결할 수 있습니다.

먼저 성능 이슈에 대한 정보를 획득하기 좋은 방법중 하나는 시스템 트레이스를 획득하는겁니다

안드로이드에서는 시스템 트레이스를 캡처하는 몇 가지 옵션을 제공하고 있습니다

시스템 추적 개요  |  Android 개발자  |  Android Developers

 

시스템 추적 개요  |  Android 개발자  |  Android Developers

시스템 추적 개요 단기간 동안의 기기 활동을 기록하는 것을 시스템 추적이라고 합니다. 시스템 추적을 실행하면 시스템 보고서를 생성하는 데 사용할 수 있는 추적 파일이 만들어집니다. 이 보

developer.android.com

  • Android 스튜디오 CPU 프로파일러
  • 시스템 추적 앱
  • Systrace 명령줄 도구
  • Perfetto 명령줄 도구

위 시스템 트레이스를 통해 문제가 생기는 시점의 정보를 캡쳐하고 Perfetto UI에서 열어 분석을 할 수 있습니다.

 

Perfetto UI

 

ui.perfetto.dev

 

그 이외에 Android 스튜디오 프로파일러 에서 제공하는 막강한 기능들을 통해 다양한 분석을 할수 있습니다 커맨드를 통해 raw data를 하나씩 정리 할필요없이 위 툴을 통해 손쉽게 아래와 같은 정보들을 분석할수 있습니다.

 

Android 프로파일러  |  Android 개발자  |  Android Developers

Android 프로파일러 Android 스튜디오 3.0 이상에서는 Android 프로파일러가 Android 모니터 도구를 대체합니다. Android 프로파일러 도구에서는 앱에서 CPU, 메모리, 네트워크 및 배터리 리소스를 사용하는

developer.android.com

 

  • CPU 프로파일러는 런타임 성능 문제를 추적하는 데 도움이 됩니다.
  • 메모리 프로파일러는 메모리 할당을 추적하는 데 도움이 됩니다.
  • 네트워크 프로파일러는 네트워크 트래픽 사용량을 모니터링합니다.
  • 에너지 프로파일러는 배터리 소진에 영향을 미치는 에너지 사용을 추적합니다.

마지막으로 화면의 layout의 계층 구조를 확인하며 불필요한 중첩구조가 있는지 확인하여 수정할때 안드로이드 스튜디오에서 제공하는 Layout Inspector 및 Layout Validation으로 레이아웃 디버깅을 할수 있습니다

 

Layout Inspector 및 Layout Validation으로 레이아웃 디버깅  |  Android 개발자  |  Android Developers

Android 스튜디오의 Layout Inspector를 사용하면 앱 레이아웃을 디자인 모형과 비교하고, 앱의 확대 뷰를 표시하고, 런타임에 앱 레이아웃의 세부정보를 검토할 수 있습니다.

developer.android.com

 

포스팅을 마무리하며

오늘은 성능 이슈에 대한 기본적인 정보 소개 위주 및 간단한 개선안에 대한 내용을 주로 다루었습니다.

다음에 이어지는 포스팅은 실제로 간단한 성능 문제점을 만들어보고 프로파일 도구등을 통해 분석하고 해결하는 방법에 대해서 작성하려고 합니다.

읽어주셔서 감사합니다.

 

아래 링크 클릭시 개선 방법 예제 포스팅으로 바로 이동하실수 있습니다

https://ysmlove111.tistory.com/379?category=728311

 

ViewStub을 통한 뷰 로딩 개선 : 안드로이드 성능 개선 #1

안녕하세요 긍정열매입니다 개발을 하면 사용자 피드백으로 "왜 이리 느려요!!!" 라는 말을 들어보셨을거 같습니다. 그때마다 우리는 말합니다 .... 그...글쎄요.... 이런 분들을 위해 자그마한 도

ysmlove111.tistory.com

 

반응형