* 성능이 저하되면
> 전자상거래 매출 감소
> 페이지뷰 감소
> 사용자 만족도 감소
* 앱 성능이 저하되면
> 앱을 제거하거나
> 다른 앱을 찾거나
> 사용빈도가 감소
* 배터리, 전류 소모 줄이기
> wakelock(), alarm 사용 주의
> 불필요한 background 데이터 전송 줄이기
> 꼭 필요한 경우에는 Job Scheduler API 사용
* Battery Historian
> https://developer.android.com/studio/profile/battery-historian
* Job Scheduler API
> 주기적으로 서비스를 실행하고 네트워크 연결 보장
> Wifi 와 같은 무료 데이터망에서 작업을 수행하도록 지정
> 기기가 대기모드 일때만 동작하도록 지정
> 기기가 충전중일 때만 작업을 수행
> 작업이 처리가 안되는 경우에 접속을 시도하는 시간 간격을 점차 증가
* Display 종류에 따른 전류소모
> LCD 는 색상별로 동일
> LED 는 흰색은 전류소모가 많으며, 흑색은 전류소모가 적다
* UI 소요 시간에 따른 사용자가 느끼는 반응
> 0 ~ 100ms : 빠르다
> 100 ~ 300ms : 약간 느리다
> 300 ~ 1000ms : 매우 느리다
* Jank (쟁크)
> Frame 누락으로 인한 화면의 부드럽지 않은 움직임
* Jitter (지터)
> 원하는 신호와 실제로 발생하는 신호간에 발생하는 불안정한 신호의 차이
* OS 버전별 Rendering
> ~ Gingerbread : CPU 로 그림
> Honeycomb~ : GPU 렌더링 기능 추가 (HW 가속)
> Ice Cream Sandwich ~ : GPU HW 가속 기능이 default
> Jellybean ~ : Jank 와 Jitter 문제 개선을 위해 VSYNC 를 사용해 프레임 생성 스케줄링 타이밍을 개선
* VSYNC
> 각 프레임의 생성 속도와 실제 화면의 갱신 속도를 동기화하기 위해 필요한 신호체계
* Profile GPU Rendering
adb shell dumpsys gfxinfo [pkg name]
> 프레임이 화면에 표시되는데 걸리는 시간 측정 로그 파일
* 인지 성능 증가를 위해
> 로딩 시간을 숨기는 애니메이션 적용
> A/B 테스트 이용
* 공유 메모리
> 모든 프로세스에 균등하게 1/n 으로 나눠서 적용
* 전용 메모리
> 특정 앱 내부에서 사용되고 다른 앱에서는 사용할 수 없는 영역
* Zygote Process
> 안드로이드 내부의 Framework 클래스, 리소스, Native Library 를 미리 로딩해서 가지고 있는 프로세스
> 앱이 시작되면 앱의 개별코드 로딩 전에 Zygote Process 를 복제
* Dirty Memory
> 데이터가 RAM 영역에만 저장되어 있음. RAM 에서 제거되면 데이터를 다시 얻기 위해서 앱이 재실행 되어야 함
* Clean Memory
> RAM 에 올라와 있는 데이터가 이미 디스크에도 동일하게 저장되어 있는 상태
> clean memory 가 제거된 후에 다시 기기로부터 그대로 읽기만 하면 되는 영역
* ART Runtime
> 가장 큰 특징은 설치할 때 앱이 컴파일 된다는 것이다 (AOT : Ahead Of Time)
> 앱 코드가 모두 설치 시점에 컴파일 되어 디스크에 저장 (Clean 영역)
- 디스크로부터 복구가 쉽기 때문에 메모리가 부족할 때 쉽게 제거됨
- ART 이후로 메모리 내에 로딩된 앱의 코드를 클린 메모리로 판단하기 때문에 ART 에서 메모리 관리가 더욱 향상됨
* Dalvik Runtime
> 앱이 구동되는 사이마다 자주 실행되는 부분만을 컴파일하는 (JIT : Just In Time) 방식을 사용
* Garbage Collector
> ~ Gingerbread
: "Stop the wrold" 방식
: GC 가 이루어지는 동안 모든 프로세스와 스레드가 동작을 멈춤 (최소 25ms 이상 걸림)
> Gingerbread ~
: 부분적인 정리를 수행하는 Concurrent GC 가 도입
: 앱을 멈추는 대신에 앱과 동시에 구동
: GC 가 시작하고 끝날 때 짧게 5ms 정도만 멈춤
> ~ Kitkat
: "Mark and sweep" 방식
> Lollipop ~
: ART 가 이용되면서 GC 시간이 10 -> 3ms 로 빨라짐
: 앱이 FG 에 표시되지 않을 때, "Semi-Space GC" 알고리즘 수행
- 메모리 내 Object 재배열
- 미사용 메모리에 연속된 큰 영역을 만들어주기 매우 유용한 방법
> '2016~
: 압축 GC 사용됨
: 새로운 메모리 영역으로 복사하는 것 대신 현재있던 메모리 위치를 유지시키면서도 파편화 없앰
* GC 수행 조건
> 앱에서 메모리 용량이 더 필요할 때
> 새로운 뷰가 생기거나 기존 객체들이 무효화 될 때
* ActivityManager.getMemoryClass()
> 앱이 가질 수 있는 최대 Heap 크기
* android:largeHeap="true"
> 좀 더 큰 힙 사용 가능, But, GC 도 오래 걸림
* App 이 Foreground 에 있을 때
> adb shell dumpsys meminfo [PID]
: PSS (Proportional Set Size)
- 앱에서 사용하는 총 메모리 양
: Persistent
- UI, NFC, 전화 기능과 같이 기기가 구동되는 동안 항상 실행되어야 하는 프로세스 목록
: Visible/Perceptible
- 화면에 표시되거나 오버레이로 표시되는 앱들
: A, B services, Cached
- Background 로 내려가 있지만 Mem을 할당받은 앱들
* 프로세스 통계
adb dumpsys procstats [pkg path]
* Leak Canary 툴 이용
> 메모리 누수
* CPU 사용량 측정
> adb shell top -n 1 -m 10 -d 1
- 명령 1번 실행 / 사용률 기준 상위 10개 앱 / 1초 동안 측정
> adb shell dumpsys cpuinfo
> systrace
* Wifi
> 높은 대역폭 + 낮은 지연시간 + 데이터량에 따른 비용 없음
* 무선통신망
> 신호세기 낮음
- 전력 많이 사용
> 신호세기 높음
- 전력 조금 사용
* 무선통신망은 일반적으로 연결 시, 통신망 연결을 유지하는 방식 때문에 Wifi 에 비해 더 많은 전력 사용
* 무선연결 vs 데이터 연결
> 데이터 연결은 무선 연결을 통해서 이루어지고, 무선 연결이 먼저이루어져야 연결 가능
* 네트워크 분석도구
> Wireshark
> Fiddler
> MITMProxy
> ARO
* 최종 사용자 모니터링 툴 사용
. RUM (Real User Monitoring)
* 안드로이드를 위한 네트워크 최적화
1. 파일 최적화
> 요청횟수 줄이기
> 요청의 크기 줄이기
- Gzip 사용해 압축하기
2. 텍스트파일 축소
> Gzip 수행 전에 공백, 탭, 주석 등 제거
3. 이미지
> 화면 크기에 맞는 이미지 사용
> 메타 데이터 삭제
> 이미지 압축
4. 파일 캐싱
> HttpResponseCache
5. 접속 줄이기
6. GCM Network Manager 이요
> 배터리를 효율적으로 사용하여 네트워크 접속 스케줄링 가능한 라이브러리
7. Https 사용
8. 네트워크 속도에 따라 네트웤킹 알고리즘 적용
> e.g.) Wifi vs LTE
9. 지연시간이 긴 경우, 데이터 미리 다운로드 등의 방법 적용
'SW > SW 서적' 카테고리의 다른 글
///자바의 정석 (0) | 2020.10.04 |
---|---|
자바 성능 튜닝 / 스캇오크스 / 비제이퍼블릭 (0) | 2020.09.06 |
완벽한 IT 인프라 구축을 위한 Docker / Asa Shiho / 정보문화사 (0) | 2020.01.13 |
☆자바 성능 튜닝 이야기 / 이상민 / 인사이트 (= 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기 / 이상민 / 한빛미디어) (0) | 2020.01.13 |
★ 안드로이드 비동기 프로그래밍 / 스티브 릴리 / 에이콘출판 (0) | 2019.09.29 |