안드로이드 앱을 일정시간 이상 사용하다보면 매우 느려져서 사용하기 힘들게 되는 경우가 종종 발생하는 경우가 있습니다. 이런 경우 해당 앱에서 메모리 관리를 잘하지 못하는 것이 이유일 가능성이 높습니다.
안드로이드 Memory Leak이 어느 영역에서 일어나는지 확인하고 관련 영역의 코드를 디버깅한다면 더 쉽게 Memory Leak을 제거할 수 있을 것입니다.
QA관련자 분들께서 가장 많이 해당 소프트웨어의 기능을 확인할 텐데 경험적으로 어느 영역이 문제가 된다는 것은 알고 있지만 어느 영역이에요라고 내용을 공유하는 것보다는 이를 조금 더 명확히 확인하고 개발팀에 공유한다면 쉽게 이 문제를 해결하는 것에 다가갈수 있을 것입니다.
서로의 영역에 대한 이해를 높이기 위해서 서로 지식을 쌓고 협업하는 방법에서 이런 접근이 중요하다고 생각합니다.
글의 처음은 안드로이드에서의 Memory Leak을 명확히 모르시는 분들에게 이해를 돕고자 다른 자료들을 이용해서 정리하는 내용으로 글을 정리합니다. 저도 대략적으로는 알고는 있지만 이를 깔끔하게 설명하기 어려웠기 때문에 구글링하고 관련된 내용을 최대한 쉽게 정리해서 작성합니다.
https://jeong-pro.tistory.com/148
Android Studio의 Profiler동영상 : https://youtu.be/v4kCRZ_O4Lc 을 보시면 이해가 빠를 것입니다.
한글 자막이 지원됩니다! 전체 동영상을 보실 필요가 없고 대략 9:31까지 보시면 됩니다.
그 자료에서 일부 화면을 캡쳐해서 설명합니다.
JVM(Java Virtual Machine) 에서의 Garbage Collection이 이뤄지는 것을 표현한 자료입니다.
• Native Heap은 JVM외부의 메모리입니다. (참고자료: https://aroundck.tistory.com/2535 )
• Shallow size는 객체 자체가 사용하는 메모리 사이즈 (참고자료: https://www.tuning-java.com/391 )
• Retained size는 Shallow 크기 + 해당 객체에서만 직/간접적으로 접근 가능한 객체들의 shallow 크기
• Activity는 사용자와 앱이 상호작용하는 진입점이고 하나의 화면을 구성
• Fragment는 Activity 안에서 화면의 일부를 구성. Fragment는 또다른 Fragment 내에서도 생성될수도 있다.
설치가 되어 있다면 이 단계는 Skip.
필요하신 경우에만 아래 내용 참고하셔서 Android Studio를 설치해주세요.
자신의 PC 에 맞는 Android Studio를 설치한다. https://developer.android.com/studio
설치 후 실행하면 다음과 같은 화면을 만나게 된다.
“New Project”를 선택하고 기본으로 프로젝트를 하나 생성한다. (빈 프로젝트 )
이 상태에서 안드로이드폰에서 “개발자 옵션/ USB 디버깅”을 켜고 컴퓨터와 휴대폰을 USB 케이블로 연결한다.
이 내용도 아시는 내용이라면 Skip
이 내용도 알고 계신 분은 Skip하시면 됩니다.
안드로이드 앱은 Android Studio의 Profiler 로 CPU, 메모리, 네트워크 및 배터리 리소스 사용에 대한 실시간 데이터를 확인할 수가 있습니다. 이를 사용하여서 메모리 Leak을 확인하는 방법을 정리합니다.
릴리즈 앱은 Android Studio에 연결해도 디버그 모드 연결해서 Profiler 연결이 불가능합니다.( http://sunphiz.me/wp/archives/899 문서를 읽어보세요) 모든 앱이 확인이 가능한 것은 아니고 개발 용으로 빌드가 된 것만 확인이 가능합니다.
바로 위에서 설명한 대로 Android Studio와 안드로이드폰 USB 디버깅 모드로 연결합니다. (해당 휴대폰에서 메모리 릭을 확인하기 위한 앱이 실행된 상태입니다. )
아래 화면에 표시한 “Profiler”를 선택하여서 Profiler를 실행합니다.
실행된 Profiler화면에서 [+] 버튼을 선택하고 캡처한 화면과 같이 경로를 따라가서 “com.xxxx.xxxx(xxxx)”를 선택합니다. (확인하려는 안드로이드 앱의 패키지명)
다음 화면 과 같이 현재 해당 앱에서 사용하고 있는 CPU, Memory, Energy를 실시간으로 확인할 수 있습니다.
Memory 글씨가 있는 부분을 더블 클릭하면 아래 화면과 같이 메모리가 전체 Profiler 화면에서 표시됩니다.
Memory Leak 이 일어날 것 같은 프로그램의 사용 시나리오를 생각하고 해당 시나리오의 동작을 수행합니다. 메모리를 많이 사용할 것 같은 동작을 하시면 됩니다. 위의 화면 과 같이 어떠한 동작을 하게 되면 메모리 사용량이 변화하는 것을 실시간으로 확인이 가능합니다. (안드로이드의 Memory leak에 대한 내용은 문서 아래에 따로 정리할 테니 해당 내용을 참고하시면 됩니다.)
다음 중 한 가지 방법으로 메모리 누수를 트리거할 수도 있습니다.
- 기기가 다양한 액티비티 상태에 있는 동안 기기를 세로 모드에서 가로 모드로 회전했다가 다시 되돌리기를 여러 번 반복합니다. 기기를 회전하면 앱에서 Activity, Context 또는 View 객체를 누출하는 경우가 많을 수 있습니다. 시스템에서 Activity를 다시 만들고, 앱에서 이러한 객체 중 하나의 참조를 다른 곳에 유지하는 경우 시스템에서 가비지 컬렉션할 수 없기 때문입니다.
- 다양한 액티비티 상태에 있는 동안 개발자의 앱과 다른 앱 간을 전환합니다(홈 화면으로 이동한 다음 개발자의 앱으로 돌아옵니다).
휴지통 모양의 ”force gabage collection”버튼을 클릭하고 “Capture heap dump”를 선택합니다. 그리고 [Record] 버튼을 클릭합니다.
아래 화면이 표시됩니다. 여기에서 [Show all classes] 항목을 선택하여서 [Show activity/fragment leaks] 항목으로 변경합니다. ( [View app heap], [Arrange by classs] 항목은 기본 상태로 둡니다)
“xx Leaks를 더블 클릭합니다.
App heap에서 leak이 일어난 항목의 리스트가 표시됩니다. leak 이 일어난 항목 및 Retained size가 큰 항목을 선택하면 화면 하단에 해당 Instance list가 표시됩니다. Instance 하나를 선택하면 Instance Details가 화면 우측 하단에 표시됩니다. 여기에서 References탭을 선택합니다.
위와 같은 과정으로 Memory leak 이 많이 일어나는 Frament, Activity를 확인할 수가 있습니다. Memory leak 이 많이 발생하는 테스트 시나리오와 Memory leak이 일어나는 Fragment, Activity, Dialog등을 확인해서 개발팀에 보고하여 개선하도록 합니다.
구글 공식 문서 : https://developer.android.com/studio/profile/android-profiler?hl=ko
Android Studio의 Profiler동영상 : https://youtu.be/v4kCRZ_O4Lc
안드로이드 메모리 릭 개념 참고 : https://gift123.tistory.com/30
Fragment 개념, Activity 개념 : https://medium.com/depayse/android-fragment-1-fragment%EC%9D%98-%EC%9D%B4%ED%95%B4%EC%99%80-%EC%83%9D%EC%84%B1-5cbfdc9b7f7c
안드로이드 앱의 debuggable : http://sunphiz.me/wp/archives/899
https://jeong-pro.tistory.com/148
https://aroundck.tistory.com/2535
https://www.tuning-java.com/391