프로그램, 애플리케이션, 기계, 전략 등 모든 것은 성능 최적화에 힘을 쓴다. 왜 그런가? 그에 대해서는 좀 더 매끄럽게 일을 진행하기 위해, 허용된 자원의 한계 내에서 주어진 요구사항을 만족시키면서도 최선, 최적의 결과를 얻기 위해 최적화에 힘쓴다고 할 수 있겠다.
쉽게 접할 수 있는 게임을 예로 들자면 과거 1984년 아스키에서 제작한 MSX용 게임인 소코반는은 무려 16K 바이트 게임이다. 물론 그 당시 기술력의 한계도 있었지만 그 한계 내에서 가능한한 요구사항을 만족시키는 최선의 게임을 만들어내고자 했다. 요즘 게임은 기술력이 늘고 점차 복잡한 메커니즘의 게임이 탄생하고 사용자를 만족시키기 위해 게임의 용량이 커지고 사용자의 PC 성능도 좋아지기에 허용되는 자원의 한계도 점차 높아져만 갔다. 그 나온지도 꽤 됐지만 아직까지도 유명한 GTA5의 저장공간이 110GB가 필요한 실정이다. 개발자들은 허용된 자원의 한계가 늘어가고 복잡한 매커니즘이 늘어나며 최적화에 힘쓰기 보단 최대한 많은 자원을 쓰며 퍼포먼스를 끌어올리고자 했다. 그렇게 발적화라는 용어도 생기면서 최적화가 되지 않아 사용자의 경험이 망가지고 개발사가 뒤늦게 최적화를 챙기는 등의 일도 일어난다. 여러 이유가 있겠지만 최적화란 사용자의 경험을 높이기 위해서라도, 개발자의 유지보수를 위해서라도 반드시 필요하다고 생각한다.
잡설이 길어졌다.
구글에서는 안드로이드 성능 최적화를 위해 문서를 제공하고 있다.
- 최적화 성공 사례 확인하기
- 디자인 가이드라인에 맞춰 대화면 대응하기
- Android 버전과 개발자 툴에 대한 이해도 높이기
- 에뮬레이터로 테스트 진행하기
전부 납득은 가는 이야기 들이지만 너무 포괄적으로 주어진 느낌이다.
다른 개발자들이 남긴 글들을 찾아보며 정리해보자.
0. 성능 개선 전, 앱의 문제점 파악하기
CPU 프로파일러를 사용해 CPU의 활동을 검사하고, Systrace로 UI 성능을 분석하는 등을 통해 앱의 문제점을 파악한다.
프로파일링 및 모니터링 도구 사용하는 것도 좋다.
예를 들어 앱의 성능 문제를 식별하고 해결하기 위해 안드로이드 스튜디오에서 제공하는 도구를 활용한다.
Android Profiler를 사용해 CPU, 메모리, 네트워크 및 배터리 사용량을 분석한다.
1. UI 최적화하기
부드러운 UI 동작을 위해 메인 스레드에서는 오래 걸리는 작업을 배제시키고, 뷰 계층 구조를 단순화시키며, 오버드로우를 줄인다. 또한, 이미지를 알맞은 해상도에 맞게 리사이징 시키며 리소스를 압축시키는 것도 필요하다.
※ 오버드로우란, 말 그대로 화면이 그려질 때 과잉으로 그려진다는 뜻이다.
2. 메모리 관리
메모리 누수 방지를 위해 객체 참조를 적절히 관리한다.
비트맵 메모리 사용을 최적화하고, 캐싱을 사용해 메모리 사용량을 줄인다.
불필요한 Object는 생성하지 않고, 가능하다면 메모리에 할당되는 것들을 줄인다.
3. 데이터베이스 최적화
데이터베이스 작업을 백그라운드 스레드에서 수행시키고, 쿼리 성능을 개선하기 위해 인덱싱을 사용한다.
또한, 쿼리 결과를 캐시하고 필요할 때만 데이터베이스에 액세스한다.
4. 네트워크 최적화
사용자 경험을 개선하기 위해 데이터를 빠르게 불러와야한다. 네트워크 호출을 최소화하고, 캐싱을 사용해 서버 응답을 저장한다. 데이터를 압축하여 전송 시간을 줄이고, 백그라운드에서 네트워크 작업을 수행시킨다.
5. 배터리 사용 최적화
성능에 영향을 주지 않는 한도 내에서 배터리 소모량을 줄인다.
필요 없는 하드웨어 센서를 비활성화시키고, 위치 업데이트 빈도를 조절한다.
백그라운드 작업을 효율적으로 관리하여 배터리 수명을 연장시킨다.
6. 코드 최적화
불필요한 객체 생성을 피하고, 이벤트 리스너를 적절히 등록-해제한다.
반복묵, 조건문, 메서드 호출을 최적화하여 실행 시간을 줄인다.
또한, 부동소수점 사용을 피하자.
안드로이드 기기 내에서 부동 소수점은 정수보다 약 2배 정도 느리다.
공간이 문제가 되지 않는다면, float보다 공간측면에서 2배 더 큰 double을 사용하자.
7. 멀티 스레딩 및 비동기 처리
CPU 사용량을 최적화하고 앱의 반응성을 개선하기 위해 멀티 스레딩 및 비동기 처리를 적용시킨다.
시간이 오래 걸리는 작업은 백그라운드 스레드에서 실행시키고 AsyncTask, ThreadPoolExecutor, 코루틴을 사용해 병렬 작업을 처리한다.
8. 애니메이션 최적화
애니메이션을 효율적으로 사용하고 렌더링 성능을 개선하기 위해 필요한 경우 GPU 오버드로우를 줄이는 기술을 사용한다. 필요에 따라 기본 제공 애니메이션 라이브러리를 활용한다.
9. 최신 안드로이드 API 및 라이브러리 사용
최신 버전의 API 및 라이브러리를 사용해 앱 성능 개선과 최신 기술 및 기능을 활용한다.
10. 성능 테스트 및 개선
실제 사용자의 조건과 유사한 환경에서 앱 성능 테스트를 수행하여 문제점 파악 및 개선을 시행한다.
QA 테스트에는 다양한 종류의 기기, OS 버전, 해상도, 네트워크 상태를 바꿔가며 앱의 호환성을 높이고 성능을 평가한다.
앱 성능 최적화는 지속적인 과정으로 계속 모니터링하며 문제를 식별하고 개선해나가야 한다.
'개발 > 정보' 카테고리의 다른 글
Google I/O 2024 홈페이지 살펴보기 (0) | 2024.04.29 |
---|---|
REST, REST API란 뭘까? (0) | 2024.04.24 |
DIP가 도대체 뭘까? (0) | 2024.04.11 |
객체지향 프로그래밍이 도대체 뭘까? (1) | 2024.04.09 |
안드로이드 API 레벨 별 버전, SDK, 이름 (0) | 2023.09.22 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!